--- a/hierarchical_select/hierarchical_select.module	2011-09-07 20:27:57.000000000 +0530
+++ b/hierarchical_select/hierarchical_select.module	2013-04-04 17:38:59.000000000 +0530
@@ -909,6 +909,14 @@
     }
     else {
       foreach ($element['#value']['hierarchical_select']['selects'] as $key => $value) {
+        // Exclude Labels & None values in multi select
+        if (is_array($value)) {
+          foreach ($value as $key => $element_value) {
+            if ($element_value == "none" || preg_match('/^label_\d+$/', $element_value, $matches, PREG_OFFSET_CAPTURE)) {
+              unset($value[$key]);
+            }
+          }          
+        }
         $hs_selection[] = $value;
       }
       $hs_selection = _hierarchical_select_hierarchy_validate($hs_selection, $config['module'], $config['params']);
@@ -1040,8 +1048,16 @@
       $db_selection = _hierarchical_select_process_get_db_selection($element, $hsid, $form_state);
 
       // Add $hs_selection to $db_selection.
-      $db_selection = array_unique(array_merge($db_selection, $hs_selection));
-
+      if (is_array($hs_selection[0])) {
+        foreach ($hs_selection[0] as $key => $multi_child) {
+          $multi_child_selection = array('0' => $multi_child);          
+          $db_selection = array_unique(array_merge($db_selection, $multi_child_selection));
+        }
+      }
+      else {        
+        $db_selection = array_unique(array_merge($db_selection, $hs_selection));
+      }     
+      
       // Only reset $hs_selection if the user has configured it that way.
       if ((bool) $config['dropbox']['reset_hs']) {
         $hs_selection = array();
@@ -1125,11 +1141,18 @@
 function _hs_process_render_hs_selects($hsid, $hierarchy, $size) {
   $form['#tree'] = TRUE;
   $form['#prefix'] = '<div class="selects">';
-  $form['#suffix'] = '</div>';
-
-  foreach ($hierarchy->lineage as $depth => $selected_item) {
+  $form['#suffix'] = '</div>';  
+  foreach ($hierarchy->lineage as $depth => $selected_item) {     
+    $multiple = TRUE;
+    foreach ($hierarchy->childinfo[$depth] as $key => $value) {
+      // Check for children in the elements . Multiple TRUE only if no children present in the list.
+      if ($value) {
+        $multiple = FALSE;
+      }
+    }
     $form[$depth] = array(
       '#type' => 'select',
+      '#multiple' => $multiple,
       '#options' => $hierarchy->levels[$depth],
       '#default_value' => $selected_item,
       '#size' => $size,
@@ -1826,7 +1849,6 @@
   $hierarchy->build_time['lineage'] = ($end_lineage - $start_lineage) * 1000;
   $hierarchy->build_time['levels'] = ($end_levels - $start_levels) * 1000;
   $hierarchy->build_time['childinfo'] = ($end_childinfo - $start_childinfo) * 1000;
-
   return $hierarchy;
 }
 
@@ -1933,8 +1955,18 @@
       if ($i > 0) {
         $parent = $selection[$i - 1];
         $child = $selection[$i];
-        $children = array_keys(module_invoke($module, 'hierarchical_select_children', $parent, $params));
-        $valid = $valid && in_array($child, $children);
+        if (is_array($child)) {
+          $multi_child = $child;
+          foreach ($$multi_child as $key => $child) {
+             # code...
+            $children = array_keys(module_invoke($module, 'hierarchical_select_children', $parent, $params));
+            $valid = $valid && in_array($child, $children);  
+           } 
+        }
+        else {
+          $children = array_keys(module_invoke($module, 'hierarchical_select_children', $parent, $params));
+          $valid = $valid && in_array($child, $children);  
+        }        
       }
     }
     if (!$valid) {
