diff -up ./interface_sortable_demos.css ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.css
--- ./interface_sortable_demos.css	2007-05-09 23:43:34.000000000 +0200
+++ ../5.7/sites/all/modules/interface_sortable/interface_sortable_demos.css	2008-02-20 15:50:20.125463408 +0100
@@ -14,3 +14,14 @@ div.sortable-item {
 	background: yellow;
 	width: 300px !important;
 }
+.sortable-item .form-item {
+	display: inline;
+}
+
+.sortable-handle {
+	color: #a020f0;
+	font-size: 16px;
+	font-weight: bolder;
+	cursor: move;
+	margin-right: 5px;
+}
Nur in ../5.7/sites/all/modules/interface_sortable/: .interface_sortable_demos.css.swp.
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-20 15:58:12.652391146 +0100
@@ -26,6 +26,15 @@ function interface_sortable_demos_menu($
       'type' => MENU_NORMAL_ITEM
     );
     $items[] = array(
+      'path' => 'demos/interface/sortable_advanced',
+      'title' => t('Interface Sortable Advanced Demo'),
+      'description' => t('Demonstrates advanced usage of sortable form elements.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => 'interface_sortable_demos_sortable_advanced',
+      '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,89 @@ function interface_sortable_demos_sortab
   drupal_set_message('submitted:  ['. implode(',', $sorted) .']');
 }
 
+function interface_sortable_demos_sortable_advanced() {
+  _interface_sortable_demos_css();
+  $handle = '<span class="sortable-handle">&times;</span>';
+  $items = array(
+    18 => 'eighteen',
+    17 => 'seventeen',
+    16 => 'sixteen',
+    'cat' => 'meow',
+    15 => 'fifteen',
+    14 => 'fourteen',
+    13 => 'thirteen',
+    12 => 'twelve',
+    'custom' => array(
+      '#type' => 'markup',
+      '#value' => 'Enter a custom number:',
+      '#prefix' => $handle,
+      'inputfield' => array(
+        '#type' => 'textfield',
+        '#size' => 4,
+        '#default_value' => 20,
+      )
+    )
+  );
+  foreach ($items as $key => $value) {
+    if (is_array($value)) continue;
+    $items[$key] = array('#type' => 'markup', '#value' => $value, '#prefix' => $handle);
+  }
+  
+  $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['handle'] = 'span.sortable-handle';
+  $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'),
+    '#description' => 'Drag the values using the ' . $handle
+  ); 
+  $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_sortable_advanced_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) .']');
+  drupal_set_message(t('Custom number: !value', array('!value' => $_POST['inputfield'])));
+}
+
 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-16 11:20:58.453054152 +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];
@@ -80,13 +81,29 @@ function interface_sortable_process($ele
   }
   
   foreach ($element['#items'] as $k => $v) {
-    $sortables[$k] = array(
+    $prefix = "<$innertag id='{$innerid}_{$k}' class='$inner_class'>";
+    $suffix = "</$innertag>\n";
+    if (is_array($v)) {
+      $sortables[$k] = $v;
+      $sortables[$k]['#prefix'] = $prefix . (isset($v['#prefix']) ? $v['#prefix'] : '');
+      $sortables[$k]['#suffix'] = (isset($v['#suffix']) ? $v['#suffix'] : '') . $suffix;
+    }
+    else {
+      $sortables[$k] = array(
+        '#type' => 'markup',
+        '#value' => $v,
+        '#prefix' => $prefix,
+        '#suffix' => $suffix
+      );
+    }
+    $order[] = $k;
+  }
+  if (empty($element['#items'])) {
+    $order = array();
+    $sortables = array(
       '#type' => 'markup',
-      '#value' => $v,
-      '#prefix' => "<$innertag id='{$outerid}_{$k}' class='$inner_class'>",
-      '#suffix' => "</$innertag>\n"
+      '#value' => $sortables['#prefix'] . $sortables['#suffix']
     );
-    $order[] = $k;
   }
 
   // If the user hasn't sent in an onchange handler, create a default
@@ -142,15 +159,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;
     }
