diff -rupN content.module content.module
--- content.module	2008-11-10 16:56:35.000000000 +0100
+++ content.module	2008-11-26 17:37:30.000000000 +0100
@@ -495,7 +495,7 @@ function theme_content_multiple_values($
         $items[] = &$element[$key];
       }
     }
-    usort($items, '_content_sort_items_value_helper');
+    uasort($items, '_content_sort_items_value_helper');
 
     // Add the items as table rows.
     foreach ($items as $key => $item) {
@@ -885,22 +885,37 @@ function content_field($op, &$node, $fie
  *   returns filtered and adjusted item array
  */
 function content_set_empty($field, $items) {
-  // Filter out empty values.
+  // Prepare an empty item.
+  $empty = array();
+  foreach (array_keys($field['columns']) as $column) {
+    $empty[$column] = NULL;
+  }
+
+  // Keep track of empty values.
   $filtered = array();
   $function = $field['module'] .'_content_is_empty';
   foreach ((array) $items as $delta => $item) {
-    if (!$function($item, $field)) {
-      $filtered[] = $item;
-    }
+    $filtered[$delta] = $function($item, $field) ? $empty : $item;
   }
 
   // Make sure we store the right number of 'empty' values.
-  $empty = array();
-  foreach (array_keys($field['columns']) as $column) {
-    $empty[$column] = NULL;
+  if ($field['multiple'] == 1) {
+    // Remove last element if empty for multi-valued fields.
+    $last_item = end($filtered);
+    if ($function($last_item, $field)) {
+      unset($filtered[key($filtered)]);
+    }
+  }
+  else {
+    $pad = $field['multiple'] > 1 ? (int)$field['multiple'] : 1;
+    $count = count($filtered);
+    if ($count < $pad) {
+      $delta = max(array_keys($filtered)) + 1;
+      for ($i = $count; $i < $pad; $i++) {
+        $filtered[$delta++] = $empty;
+      }
+    }
   }
-  $pad = $field['multiple'] > 1 ? $field['multiple'] : 1;
-  $filtered = array_pad($filtered, $pad, $empty);
 
   return $filtered;
 }
@@ -911,7 +926,7 @@ function content_set_empty($field, $item
  */
 function _content_sort_items($field, $items) {
   if ($field['multiple'] >= 1 && isset($items[0]['_weight'])) {
-    usort($items, '_content_sort_items_helper');
+    uasort($items, '_content_sort_items_helper');
     foreach ($items as $delta => $item) {
       if (is_array($items[$delta])) {
         unset($items[$delta]['_weight']);
@@ -994,7 +1009,14 @@ function content_storage($op, $node) {
             if (!isset($additions[$field_name])) {
               $additions[$field_name] = array();
             }
-            $additions[$field_name][] = $item;
+
+            // Preserve deltas when loading items from database.
+            if (isset($row['delta'])) {
+              $additions[$field_name][$row['delta']] = $item;
+            }
+            else {
+              $additions[$field_name][] = $item;
+            }
           }
         }
       }
diff -rupN includes/content.node_form.inc includes/content.node_form.inc
--- includes/content.node_form.inc	2008-10-04 15:14:21.000000000 +0200
+++ includes/content.node_form.inc	2008-11-26 13:54:19.000000000 +0100
@@ -157,21 +157,20 @@ function content_multiple_value_form(&$f
 
   switch ($field['multiple']) {
     case 0:
+      $deltas = array(0);
       $max = 0;
       break;
     case 1:
       $filled_items = content_set_empty($field, $items);
-      $current_item_count = isset($form_state['item_count'][$field_name])
-                            ? $form_state['item_count'][$field_name]
-                            : count($items);
+      $deltas = array_keys($filled_items);
       // We always want at least one empty icon for the user to fill in.
-      $max = ($current_item_count > count($filled_items))
-              ? $current_item_count - 1
-              : $current_item_count;
+      $max = max($deltas) + 1;
+      $deltas[] = $max;
 
       break;
     default:
       $max = $field['multiple'] - 1;
+      $deltas = array_keys(array_fill(0, $field['multiple'], 0));
       break;
   }
 
@@ -186,7 +185,7 @@ function content_multiple_value_form(&$f
   );
   $function = $field['widget']['module'] .'_widget';
 
-  for ($delta = 0; $delta <= $max; $delta++) {
+  foreach ($deltas as $delta) {
     if ($element = $function($form, $form_state, $field, $items, $delta)) {
       $defaults = array(
         '#title' => ($field['multiple'] >= 1) ? '' : $title,
