diff --git a/README.txt b/README.txt
index 9692ee9..cc385f4 100644
--- a/README.txt
+++ b/README.txt
@@ -1,28 +1,55 @@
 
-----------------------------
-IMAGEFIELD ZIP UPLOAD MODULE
-----------------------------
+---------------------------------------
+IMAGEFIELD ZIP/HTML5 BULK UPLOAD MODULE
+---------------------------------------
+
 
 CONTENTS OF THIS FILE
 ---------------------
 
  * Installation Instructions
+ * Configuration Options
 
 
 INSTALLATION INSTRUCTIONS
---------
+-------------------------
 
-This module requires the php zip extension to be installed. Directions on how to
-do that can be found here: http://php.net/zip.installation
+This module recommends that the php zip extension to be installed. Directions on
+how to do that can be found here: http://php.net/zip.installation
 
 Go to the permissions page admin/user/permissions and select which roles have
 the "access imagefield_zip widget" permission.
 
-The field's widget type needs to be "Image". Configuration options for
-imagefield zip are under admin/settings/imagefield-zip and under the fields
-widget settings. Options are:
+The field's widget type needs to be "Image".
+
+
+CONFIGURATION OPTIONS
+---------------------
+
+Configuration options for imagefield zip are under admin/settings/imagefield-zip
+and under the fields widget settings. Options are:
+
+Location of the zip upload field:
  * Above
  * Below
  * Disabled
-This controls where the zip upload field will apear in relation to the
+This controls where the zip upload field will appear in relation to the
 imagefield.
+
+Upload field mode:
+ * Zip Files Only
+ * HTML 5 Multi-upload Only
+ * Both Zip & HTML 5
+Zip Files Only - Only zip files can be uploaded and the zip files must contain
+valid images.
+HTML 5 Multi-upload Only - Multiple images can be uploaded at once due to the
+html5 file input field.
+Both Zip & HTML 5 - Zip files or multiple images can be uploaded at the same
+time.
+
+Non HTML5 Fallback Mode:
+ * Degrade to zip only
+ * Show message that your browser does not support HTML5
+ * Disable Multi Upload
+This is only shown when "HTML 5 Multi-upload Only" is selected. If Both Zip &
+HTML 5 is selected then it will degrade to zip only by default.
diff --git a/imagefield_zip.admin.inc b/imagefield_zip.admin.inc
index ef03558..6fc1307 100755
--- a/imagefield_zip.admin.inc
+++ b/imagefield_zip.admin.inc
@@ -30,7 +30,7 @@ function imagefield_zip_admin_form($form_state) {
 
       $form['imagefield_zip_' . $node_type . '_' . $field_name] = array(
         '#type'           => 'fieldset',
-        '#title'          => t('%node - %field',array(
+        '#title'          => t('%node - %field', array(
           '%node' => $info['name'],
           '%field' => $data['widget']['label'],
         )),
diff --git a/imagefield_zip.ahah.inc b/imagefield_zip.ahah.inc
index 9be5fdc..11e996c 100644
--- a/imagefield_zip.ahah.inc
+++ b/imagefield_zip.ahah.inc
@@ -10,7 +10,7 @@
  */
 function imagefield_zip_js($type_name, $field_name) {
   // Get all images from the zip field.
-  $images = imagefield_zip_save_and_extract_upload($field_name . '_zip', $type_name);
+  $images = imagefield_zip_save_and_extract_upload($field_name . '_zip', $type_name, 'ahah');
 
   // Generate HTML for the images that where uploaded
   $result = imagefield_zip_add_files_to_form($type_name, $field_name, $images);
@@ -215,7 +215,7 @@ function imagefield_zip_add_files_to_form($type_name, $field_name, $files) {
  */
 function imagefield_zip_multigroup_js($type_name, $group_name) {
   // Get all images from the zip field.
-  $images = imagefield_zip_save_and_extract_upload($group_name . '_zip', $type_name);
+  $images = imagefield_zip_save_and_extract_upload($group_name . '_zip', $type_name, 'ahah');
 
   // Generate HTML for the images that where uploaded
   $result = imagefield_zip_add_files_to_multigroup_form($type_name, $group_name, $images);
diff --git a/imagefield_zip.info b/imagefield_zip.info
index d7d1499..e56e4b7 100644
--- a/imagefield_zip.info
+++ b/imagefield_zip.info
@@ -1,6 +1,6 @@
-name = ImageField Zip Extract
-description = "Upload a zip file containing images that will automatically be populated to a multi-value imagefield."
+
+name = ImageField Zip/HTML5 Bulk Upload
+description = "Upload via HTML5 or a zip file containing images that will automatically be populated to a multi-value imagefield."
 package = CCK
 dependencies[] = imagefield
 core = 6.x
-version = 6.x-1.x-dev
diff --git a/imagefield_zip.install b/imagefield_zip.install
index 3305a83..6f87968 100644
--- a/imagefield_zip.install
+++ b/imagefield_zip.install
@@ -45,8 +45,8 @@ function imagefield_zip_requirements($phase) {
       $requirements['imagefield_zip_function'] = array(
         'title' => $t('Zip support'),
         'value' => $phase == 'install' ? FALSE : $t('Not available'),
-        'severity' => REQUIREMENT_ERROR,
-        'description' => $t('Zip support is required for imagefield_zip to work. Visit the <a href="http://php.net/zip.installation">PHP Zip Installation</a> page to learn how to get zip support working on this server.'),
+        'severity' => REQUIREMENT_WARNING,
+        'description' => $t('Zip support is required for the zip portion of imagefield_zip to work. HTML5 uploading is still available on certian browsers (not IE). Visit the <a href="http://php.net/zip.installation">PHP Zip Installation</a> page to learn how to get zip support working on this server.'),
       );
     }
   }
diff --git a/imagefield_zip.module b/imagefield_zip.module
index e59c84f..65ea497 100644
--- a/imagefield_zip.module
+++ b/imagefield_zip.module
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Adds in a zip upload field to the form.
+ * Adds in a zip or html5 upload field to the form.
  */
 
 /**
@@ -10,7 +10,6 @@
  */
 define('IMAGEFIELD_ZIP_CCK_WIDGET', 0);
 
-
 if (!function_exists('zip_open')) {
   /**
   * Default mode for the multi upload form.
@@ -34,8 +33,6 @@ else {
   define('IMAGEFIELD_ZIP_FALLBACK', 0);
 }
 
-
-
 /**
  * Implementation of hook_menu().
  */
@@ -72,7 +69,7 @@ function imagefield_zip_menu() {
 }
 
 /**
- * Implementation of hook_perm(). [added by voodoo.child]
+ * Implementation of hook_perm().
  */
 function imagefield_zip_perm() {
   return array('access imagefield_zip widget');
@@ -82,25 +79,31 @@ function imagefield_zip_perm() {
  * Implementation of hook_form_alter().
  */
 function imagefield_zip_form_alter(&$form, &$form_state, $form_id) {
+  // Alter node add/edit forms & add in a zip/html5 upload form on imagefields.
   if (   isset($form['type'])
       && isset($form['#node'])
       && $form['type']['#value'] .'_node_form' == $form_id
       && ($type = content_types($form['#node']->type))
       && user_access('access imagefield_zip widget')
         ) {
-    $form['#after_build'][] = '_imagefield_zip_form_after_build';
+    // Get any field groups in the form
     $groups = imagefield_zip_get_groups($form);
 
+    // Add in the zip/html5 upload form to the correct form elements.
     $changed = FALSE;
     foreach (_imagefield_zip_fields($type) as $field) {
-      $changed = _imagefield_zip_form($form, $field['field_name'], $form['#node'], $groups);
+      $changed = imagefield_zip_add_to_node_form($form, $field['field_name'], $form['#node'], $groups);
     }
+
+    // Add in custom submit handler and after build function call.
     if ($changed) {
       $form['#submit'][] = 'imagefield_zip_page_submit';
+      $form['#after_build'][] = '_imagefield_zip_form_after_build';
     }
   }
 
-  // Make sure form is a filefiled using the imagefield widget
+  // Add form elements to the CCK admin widget configuration page.
+  // Make sure form is a filefiled using the imagefield widget.
   if (   isset($form['basic'])
       && $form['basic']['type']['#value'] == 'filefield'
       && !empty($form['widget_module']['#value'])
@@ -117,12 +120,14 @@ function imagefield_zip_form_alter(&$form, &$form_state, $form_id) {
  */
 function _imagefield_zip_form_after_build(&$form, &$form_state) {
   global $_imagefield_zip;
+  // Add in javascript that handles the file form element.
   drupal_add_js(drupal_get_path('module', 'imagefield_zip') . '/imagefield_zip.js');
 
   $type = content_types($form['#node']->type);
   foreach (_imagefield_zip_fields($type) as $field) {
     $field_name = $field['field_name'];
 
+    // Get the weight of the widget.
     $weight = 0.01;
     $widget_settings = variable_get('imagefield_zip_cck_widget_' . $type['type'] . '_' . $field_name, IMAGEFIELD_ZIP_CCK_WIDGET);
     if ($widget_settings == 2) {
@@ -153,6 +158,7 @@ function _imagefield_zip_form_after_build(&$form, &$form_state) {
       unset($form[$field_name .'_zip']);
     }
 
+    // Add field name to js settings for file form element handling.
     if (!$in_a_group) {
       _imagefield_zip_add_inline_js($field_name);
     }
@@ -202,6 +208,7 @@ function imagefield_zip_get_groups(&$form) {
       }
     }
 
+    // This function doesn't exist in CCK2.
     if (function_exists('fieldgroup_order_fields_groups')) {
       fieldgroup_order_fields_groups($group_rows, $groups, $field_rows);
     }
@@ -240,10 +247,15 @@ function _imagefield_zip_cck_walker(&$array, &$cck_field, &$zip_field) {
  *
  * @param $field_name
  *   Field containing the zip upload file input.
+ * @param $node_type
+ *   name of node type
+ * @param $op
+ *   what kind of operation; submit or ahah.
  * @return array
  *   array of image file objects.
  */
-function imagefield_zip_save_and_extract_upload($field_name, $node_type) {
+function imagefield_zip_save_and_extract_upload($field_name, $node_type, $op) {
+  // Get the target field from the given input.
   $content_type = content_types($node_type);
   $target_field = str_replace('_zip', '', $field_name);
   if (strpos($target_field, 'group_') === 0) {
@@ -258,9 +270,11 @@ function imagefield_zip_save_and_extract_upload($field_name, $node_type) {
       }
     }
   }
+  // Get the upload mode and the file extensions allowed.
   $upload_mode = variable_get('imagefield_zip_upload_mode_' . $node_type . '_' . $target_field, NULL);
   $formats = $content_type['fields'][$target_field]['widget']['file_extensions'];
 
+  // Get context from $_FILES and create a files array.
   $files_array = imagefield_zip_files_array_extractor($field_name);
   $images = array();
   if (!empty($files_array)) {
@@ -271,17 +285,17 @@ function imagefield_zip_save_and_extract_upload($field_name, $node_type) {
         continue;
       }
 
-      $extracted = array();
       // Verify & extract files.
+      $extracted = array();
       if ($upload_mode == 0) {
-        // Zip only
+        // Zip only.
         if (!imagefield_zip_is_valid_zip($file)) {
           continue;
         }
         $extracted = imagefield_zip_extract($file, $formats);
       }
       elseif ($upload_mode == 1) {
-        // Images only
+        // Images only.
         if (!imagefield_zip_is_image($file, $formats)) {
           continue;
         }
@@ -304,16 +318,18 @@ function imagefield_zip_save_and_extract_upload($field_name, $node_type) {
         watchdog('imagefield_zip', 'No images uploaded.', array(), WATCHDOG_WARNING);
         continue;
       }
+      // Add the extracted images to the return array.
       $images = array_merge($images, $extracted);
     }
   }
 
-  if (empty($images)) {
+  // Send error messages back if in ahah mode.
+  if (empty($images) && $op == 'ahah') {
     if (empty($files_array)) {
-      drupal_set_message('No file selected.', 'warning');
+      drupal_set_message(t('No file selected.'), 'warning');
     }
     elseif ($upload_mode == 0) {
-      drupal_set_message('The file uploaded was not a valid zip file.', 'warning');
+      drupal_set_message(t('The file uploaded was not a valid zip file.'), 'warning');
     }
     elseif ($upload_mode == 1) {
       drupal_set_message(t('Only image files in these formats can be uploaded: @formats.', array('@formats' => $formats)), 'warning');
@@ -378,7 +394,7 @@ function imagefield_zip_page_submit($form, &$form_state) {
     }
 
     // Get images from the zip file.
-    $images = imagefield_zip_save_and_extract_upload($field_name, $type);
+    $images = imagefield_zip_save_and_extract_upload($field_name, $form['#node']->type, 'submit');
     if (empty($images)) {
       continue;
     }
@@ -439,13 +455,23 @@ function &imagefield_zip_array_find_element_by_key($key, &$form) {
 }
 
 /**
- * Implementation of hook_form().
+ * Prep to add the zip/html5 file form element to the node form.
+ *
+ * @param $form
+ *   Array. The node form.
+ * @param $field_name
+ *   String. The name of the field.
+ * @param $node
+ *   The node object.
+ * @param $groups
+ *   Array from imagefield_zip_get_groups.
  */
-function _imagefield_zip_form(&$form, &$field_name, &$node, &$groups) {
+function imagefield_zip_add_to_node_form(&$form, &$field_name, &$node, &$groups) {
   if (empty($form[$field_name])) {
     return FALSE;
   }
 
+  // Get the position of the element; above, below or disabled.
   $weight = 0.01;
   $widget_settings = variable_get('imagefield_zip_cck_widget_' . $node->type . '_' . $field_name, IMAGEFIELD_ZIP_CCK_WIDGET);
   if ($widget_settings == 2) {
@@ -455,11 +481,14 @@ function _imagefield_zip_form(&$form, &$field_name, &$node, &$groups) {
     $weight = -0.01;
   }
 
+  // Get the other settings for the form element.
   $upload_mode = variable_get('imagefield_zip_upload_mode_' . $node->type . '_' . $field_name, IMAGEFIELD_ZIP_UPLOAD_MODE);
   $fallback_mode = variable_get('imagefield_zip_fallback_' . $node->type . '_' . $field_name, IMAGEFIELD_ZIP_FALLBACK);
+  $content_type = content_types($node->type);
+  $machine_node_type = $node->type;
+  $formats = $content_type['fields'][$field_name]['widget']['file_extensions'];
 
-  global $_imagefield_zip;
-
+  // Target filefield could be inside of a field group.
   if (!empty($groups)) {
     foreach ($groups as $group_name => $group) {
       if (empty($group['fields'][$field_name])) {
@@ -471,44 +500,53 @@ function _imagefield_zip_form(&$form, &$field_name, &$node, &$groups) {
         continue;
       }
 
-      // Make sure the form is cached so ahah can work.
-      $form['#cache'] = TRUE;
-      $content_type = content_types($group['type_name']);
-      $_imagefield_zip['groups'][] = $group['group_name'];
-
+      // Set variables needed.
       $machine_name = $group['group_name'];
       $nice_name = $group['label'];
-      $formats = $content_type['fields'][$field_name]['widget']['file_extensions'];
-      $machine_node_type = $node->type;
       $field_or_group = 'group';
-
-      if (imagefield_zip_build_upload_form($form, $machine_name, $nice_name, $formats, $machine_node_type, $upload_mode, $fallback_mode, $weight, $field_or_group)) {
-        return TRUE;
-      }
-      return FALSE;
+      break;
     }
   }
 
-  $content_type = content_types($node->type);
-
-  $machine_name = $field_name;
-  $nice_name = $content_type['fields'][$field_name]['widget']['label'];
-  $formats = $content_type['fields'][$field_name]['widget']['file_extensions'];
-  $machine_node_type = $node->type;
-  $field_or_group = 'field';
-  $machine_name_css = str_replace('_', '-', $machine_name);
+  if (empty($field_or_group)) {
+    // Set variables needed.
+    $machine_name = $field_name;
+    $nice_name = $content_type['fields'][$field_name]['widget']['label'];
+    $field_or_group = 'field';
+  }
 
+  // Add in the form.
   if (imagefield_zip_build_upload_form($form, $machine_name, $nice_name, $formats, $machine_node_type, $upload_mode, $fallback_mode, $weight, $field_or_group)) {
-    $form[$field_name]['#prefix'] .= '<div id="'. $machine_name_css .'-items">';
-    $form[$field_name]['#suffix'] .= '</div>';
-
     return TRUE;
   }
   return FALSE;
 }
 
+/**
+ * Adds the zip/html5 file form elements to the node form.
+ *
+ * @param $form
+ *   Array. The node form.
+ * @param $machine_name
+ *   String. The name of the field/group.
+ * @param $nice_name
+ *   String. The nice name of the field/group.
+ * @param $formats
+ *   String of file extensions.
+ * @param $machine_node_type
+ *   String of the node type.
+ * @param $upload_mode
+ *   Integer value for what type of files can be uploaded.
+ * @param $fallback_mode
+ *   What to do if html5 form can not be used.
+ * @param $weight
+ *   Float value for placing the form element above or below the target.
+ * @param $field_or_group
+ *   String of either "field" or "group".
+ */
 function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $formats, $machine_node_type, $upload_mode, $fallback_mode, $weight, $field_or_group) {
 
+  // Set some variables.
   $machine_name_css = str_replace('_', '-', $machine_name);
   $max_filesize = format_size(parse_size(file_upload_max_size()));
   $zip_mime = 'application/zip, application/x-zip, application/x-zip-compressed, application/x-compress, application/x-compressed';
@@ -524,6 +562,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
     }
   }
 
+  // Handle IE.
   if (imagefield_zip_is_ie()) {
     if ($upload_mode == 2) {
       $upload_mode = 0;
@@ -548,6 +587,9 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
     }
   }
 
+  // Make sure the form is cached so ahah can work.
+  $form['#cache'] = TRUE;
+
   // Set form defaults.
   $form[$machine_name .'_zip'] = array(
     '#prefix' => '<div class="zip-field">',
@@ -582,6 +624,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
 
   // Set attributes based off of settings.
   if ($upload_mode == 0) {
+    // Single zip upload.
     $form[$machine_name .'_zip'][$machine_name . '_upload'] += array(
       '#title' => t('Add Zip File Containing Images'),
       '#name' => "files[{$machine_name}_zip]",
@@ -589,7 +632,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
     $form[$machine_name .'_zip'][$machine_name . '_upload']['#attributes'] += array(
       'accept' => $zip_mime,
     );
-    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by selecting a zip file in the dialog box. Allowed image extensions in the zip: @formats. Maximum zip file size: @max_filesize', array(
+    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by selecting a zip file in the dialog box.<br />Allowed image extensions in the zip: @formats. Maximum zip file size: @max_filesize', array(
         '@max_filesize' => $max_filesize,
         '@formats' => $formats,
         '@name' => $nice_name,
@@ -598,6 +641,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
       )) . '</div></div>';
   }
   elseif ($upload_mode == 1) {
+    // Multiple file uploads via html5.
     $form[$machine_name .'_zip'][$machine_name . '_upload'] += array(
       '#title' => t('Add Multiple Images'),
       '#name' => "files[{$machine_name}_zip][]",
@@ -606,7 +650,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
       'multiple' => 'multiple',
       'accept' => 'image/' . implode(', image/', $formats_array),
     );
-    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by holding the <strong>CTRL key and clicking multiple images</strong> in the dialog. Allowed extensions: @formats with a maximum file size of @max_filesize', array(
+    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by holding the <strong>CTRL key and clicking multiple images</strong> in the dialog.<br />Allowed extensions: @formats with a maximum file size of @max_filesize', array(
         '@max_filesize' => $max_filesize,
         '@formats' => $formats,
         '@name' => $nice_name,
@@ -615,6 +659,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
       )) . '</div></div>';
   }
   elseif ($upload_mode == 2) {
+    // Multiple file uploads via html5; with zip support as well.
     $form[$machine_name .'_zip'][$machine_name . '_upload'] += array(
       '#title' => t('Add Multiple Images OR Zip File Containing Images'),
       '#name' => "files[{$machine_name}_zip][]",
@@ -623,7 +668,7 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
       'multiple' => 'multiple',
       'accept' => 'image/' . implode(', image/', $formats_array) . ', ' . $zip_mime,
     );
-    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by holding the <strong>CTRL key and clicking multiple images</strong> in the dialog. Allowed extensions: @formats with a maximum file size of @max_filesize', array(
+    $form[$machine_name .'_zip'][$machine_name . '_button']['#suffix'] .= t('Add multiple image files to the @name @type @location by holding the <strong>CTRL key and clicking multiple images</strong> in the dialog.<br />Allowed extensions: @formats with a maximum file size of @max_filesize', array(
         '@max_filesize' => $max_filesize,
         '@formats' => $formats . ' zip',
         '@name' => $nice_name,
@@ -634,6 +679,9 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
 
   // Multigroup or field?
   if ($field_or_group == 'group') {
+    global $_imagefield_zip;
+    $_imagefield_zip['groups'][] = $machine_name;
+
     $form[$machine_name .'_zip']['#weight'] = $weight;
     $form[$machine_name .'_zip'][$machine_name . '_button']['#submit'] = array('content_multigroup_add_more_submit');
     $form[$machine_name .'_zip'][$machine_name . '_button']['#ahah']['path'] = 'imagefield_zip/ahah-multigroup/' . $machine_node_type . '/' . $machine_name;
@@ -644,6 +692,8 @@ function imagefield_zip_build_upload_form(&$form, $machine_name, $nice_name, $fo
     $form[$machine_name .'_zip'][$machine_name . '_button']['#submit'] = array('content_add_more_submit_proxy');
     $form[$machine_name .'_zip'][$machine_name . '_button']['#ahah']['path'] = 'imagefield_zip/ahah/' . $machine_node_type . '/' . $machine_name;
     $form[$machine_name .'_zip'][$machine_name . '_button']['#field_name'] = $machine_name;
+    $form[$machine_name]['#prefix'] .= '<div id="'. $machine_name_css .'-items">';
+    $form[$machine_name]['#suffix'] .= '</div>';
   }
 
   return TRUE;
@@ -1102,13 +1152,19 @@ function imagefield_zip_files_array_extractor($field_name) {
   }
   // Remove empty files.
   foreach ($files_array as $delta => $file_array) {
-     if ($file_array['files']['error'][$field_name] == UPLOAD_ERR_NO_FILE) {
+    if ($file_array['files']['error'][$field_name] == UPLOAD_ERR_NO_FILE) {
       unset($files_array[$delta]);
     }
   }
   return $files_array;
 }
 
+/**
+ * See if the browser is IE.
+ *
+ * @return
+ *   TRUE if the browser is IE; false if the browser is not IE.
+ */
 function imagefield_zip_is_ie() {
   $is_ie = FALSE;
   if (isset($_SERVER['HTTP_USER_AGENT'])) {
