diff --git a/hierarchical_select.js b/hierarchical_select.js
index 48dc3fb..b84c708 100644
--- a/hierarchical_select.js
+++ b/hierarchical_select.js
@@ -4,7 +4,7 @@
 Drupal.behaviors.HierarchicalSelect = function (context) {
   $('.hierarchical-select-wrapper:not(.hierarchical-select-wrapper-processed)', context)
   .addClass('hierarchical-select-wrapper-processed').each(function() {
-    var hsid = $(this).attr('id').replace(/^hierarchical-select-(\d+)-wrapper$/, "$1");
+    var hsid = $('.hierarchical-hsid', this).val();
     Drupal.HierarchicalSelect.initialize(hsid);
   });
 };
diff --git a/hierarchical_select.module b/hierarchical_select.module
index 5285aeb..aedfbd0 100644
--- a/hierarchical_select.module
+++ b/hierarchical_select.module
@@ -398,28 +398,10 @@ function hierarchical_select_json() {
  * Hierarchical select form element type #process callback.
  */
 function hierarchical_select_process($element, $edit, &$form_state, $form) {
-  if (!is_array($element['#value']) || !isset($element['#value']['hsid'])) {
-    // The HSID is stored in the session, to allow for multiple Hierarchical
-    // Select form items on the same page of which at least one is added through
-    // AHAH. A normal static variable won't do in this case, because then at
-    // least two Hierarchical Select form items will have HSID 0, because they
-    // are generated in different requests, both of which will have a first HSID
-    // of 0. This will then cause problems on the page. 
-    if (!isset($_SESSION['hsid'])) {
-      $_SESSION['hsid'] = 0;
-    }
-    else {
-      // Let the HSID go from 0 to 99, then start over. Larger numbers are
-      // pointless: who's going to use more than a hundred Hierarchical Select
-      // form items on the same page?
-      $_SESSION['hsid'] = ($_SESSION['hsid'] + 1) % 100;
-    }
-    $hsid = $_SESSION['hsid'];
-  }
-  else {
-    $hsid = check_plain($element['#value']['hsid']);
-  }
-  $element['hsid'] = array('#type' => 'hidden', '#value' => $hsid);
+  static $hsids_settings = array();
+  $hsid = $element['#id'];
+
+  $element['hsid'] = array('#type' => 'hidden', '#value' => $hsid, '#attributes' => array('class' => 'hierarchical-hsid'));
   // A hierarchical_select form element expands to multiple items. For example
   // $element['hsid'] got set just above. If #value is not an array, then
   // form_set_value(), which is called by form_builder() will fail, because it
@@ -457,11 +439,16 @@ function hierarchical_select_process($element, $edit, &$form_state, $form) {
            'createNewLevels'  => (isset($config['editability']['allow_new_levels'])) ? (int) $config['editability']['allow_new_levels'] : 0,
            'resizable'        => (isset($config['resizable'])) ? (int) $config['resizable'] : 0,
            'path'             => $config['path'],
+           'updatesEnabled'   => 'true',
         ),
        ),
      )
   );
-  _hierarchical_select_add_js_settings($settings, $form_state);
+
+  if(!in_array($hsid, $hsids_settings)) {
+    _hierarchical_select_add_js_settings($settings, $form_state);
+  }
+  $hsids_settings[] = $hsid;
 
   // Basic config validation and diagnostics.
   if (HS_DEVELOPER_MODE) {
