diff -up ./interface_sortable_demos.module ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.module
--- ./interface_sortable_demos.module	2007-05-09 23:43:34.000000000 +0200
+++ ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.module	2008-02-14 12:23:40.068346301 +0100
@@ -26,6 +26,15 @@ function interface_sortable_demos_menu($
       'type' => MENU_NORMAL_ITEM
     );
     $items[] = array(
+      'path' => 'demos/interface/dual_sortable_form_element',
+      'title' => t('Dual Interface Sortable Form Element Demo'),
+      'description' => t('Demonstrates two sortable form elements.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => 'interface_sortable_demos_dual_sortable_form_element',
+      'access' => user_access('access content'),
+      'type' => MENU_NORMAL_ITEM
+    );
+    $items[] = array(
       'path' => 'demos/interface/sortable_form_element_with_options',
       'title' => t('Interface Sortable Form Element Demo With Options'),
       'description' => t('Demonstrates a sortable form element with options.'),
@@ -100,6 +109,72 @@ function interface_sortable_demos_sortab
   drupal_set_message('submitted:  ['. implode(',', $sorted) .']');
 }
 
+function interface_sortable_demos_dual_sortable_form_element() {
+  _interface_sortable_demos_css();
+  
+  $items = array(
+    18 => 'eighteen',
+    17 => 'seventeen',
+    16 => 'sixteen',
+    'cat' => 'meow',
+    15 => 'fifteen',
+    14 => 'fourteen',
+    13 => 'thirteen',
+    12 => 'twelve'
+  );
+  
+  $options = array();
+  $options['accept'] = 'sortable-item';
+  $options['helperclass'] = 'sortable-helper';
+  $options['activeclass'] = 'sortable-active';
+  $options['hoverclass'] = 'sortable-hover';
+  $options['fx'] = 300;
+  $options['axis'] = 'vertically';
+  $options['opacity'] = 0.6;
+  $options['#onchange'] = <<<EOT
+    function (obj) {
+      serial1 = $.SortSerialize('sortee1-wrapper');
+      serial2 = $.SortSerialize('sortee2-wrapper');
+      document.getElementById('edit-sortee1').value = serial1.hash;
+      document.getElementById('edit-sortee2').value = serial2.hash;
+    }
+EOT;
+
+  $form['even']	= array(
+    '#type' => 'fieldset',
+    '#collapsible' => FALSE,
+    '#title' => t('Even numbers')
+  ); 
+  $form['odd']	= array(
+    '#type' => 'fieldset',
+    '#collapsible' => FALSE,
+    '#title' => t('Odd numbers')
+  ); 
+  $form['even']['sortee1'] = array(
+    '#type' => 'sortable',
+    '#items' => $items,
+    '#options' => $options,
+    '#inner_id' => 'sortee',
+  );
+  $form['odd']['sortee2'] = array(
+    '#type' => 'sortable',
+    '#items' => array(),
+    '#options' => $options,
+    '#inner_id' => 'sortee',
+  );
+  
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  
+  return $form;
+}
+
+function interface_sortable_demos_dual_sortable_form_element_submit($form_id, $edit) {
+  $sorted1 = interface_get_sort($edit['sortee1'], 'sortee');
+  $sorted2 = interface_get_sort($edit['sortee2'], 'sortee');
+  drupal_set_message('Even: ['. implode(',', $sorted1) .']');
+  drupal_set_message('Odd: ['. implode(',', $sorted2) .']');
+}
+
 function interface_sortable_demos_sortable_form_element_with_options() {
   _interface_sortable_demos_css();
   
diff -up ./interface_sortable.module ../5.7/sites/all/modules/interface_sortable/interface_sortable.module
--- ./interface_sortable.module	2007-05-09 23:43:34.000000000 +0200
+++ ../5.7/sites/all/modules/interface_sortable/interface_sortable.module	2008-02-14 11:28:34.379965894 +0100
@@ -64,13 +64,14 @@ function interface_sortable_process($ele
   } 
   
   $outerid = $element['#parents'][0];
+  $innerid = array_key_exists('#inner_id', $element) ? $element['#inner_id'] : $outerid;
   
   $sortables['#prefix'] = "<$outertag id='$outerid-wrapper' class='$outer_class'>\n";
   $sortables['#suffix'] = "</$outertag>\n";
   
   // if there's a #value, eval it and resort
   if ($element['#value']) {
-    $keyorder = interface_get_sort($element['#value']);
+    $keyorder = interface_get_sort($element['#value'], $innerid);
     $items = $element['#items'];
     foreach ($keyorder as $key) {
       $newitems[$key] = $items[$key];
@@ -83,11 +84,18 @@ function interface_sortable_process($ele
     $sortables[$k] = array(
       '#type' => 'markup',
       '#value' => $v,
-      '#prefix' => "<$innertag id='{$outerid}_{$k}' class='$inner_class'>",
+      '#prefix' => "<$innertag id='{$innerid}_{$k}' class='$inner_class'>",
       '#suffix' => "</$innertag>\n"
     );
     $order[] = $k;
   }
+  if (empty($element['#items'])) {
+    $order = array();
+    $sortables = array(
+      '#type' => 'markup',
+      '#value' => $sortables['#prefix'] . $sortables['#suffix']
+    );
+  }
 
   // If the user hasn't sent in an onchange handler, create a default
   // one that sets the sortable element's value every time the order
@@ -142,15 +150,16 @@ function theme_interface_sortable_hidden
  * @param string $sort
  * @return array
  */
-function interface_get_sort($sort) {
+function interface_get_sort($sort, $subst = '') {
   $return = array();
   parse_str($sort, $result);
   $prefixes = array_keys($result);
   if (!empty($prefixes)) {
     $prefix = $prefixes[0];
+	if (empty($subst)) $subst = $prefix;
     foreach ($result[$prefix] as $val) {
-      if (strpos($val, $prefix .'_') === 0) {
-        $val = substr($val, strlen($prefix) + 1);
+      if (strpos($val, $subst .'_') === 0) {
+        $val = substr($val, strlen($subst) + 1);
       }
       $return[] = $val;
     }
