diff -rupN field_file.inc field_file.inc
--- field_file.inc	2009-03-03 13:56:31.000000000 +0100
+++ field_file.inc	2009-03-03 14:30:21.000000000 +0100
@@ -202,7 +202,7 @@ function field_file_save_file($filepath,
  */
 function field_file_save($node, &$file) {
   // If this item is marked for deletion.
-  if (!empty($file['delete'])) {
+  if (!empty($file['delete']) || !empty($file['_remove'])) {
     // If we're creating a new revision, return an empty array so CCK will
     // remove the item.
     if (!empty($node->old_vid)) {
diff -rupN filefield_field.inc filefield_field.inc
--- filefield_field.inc	2009-03-03 13:56:31.000000000 +0100
+++ filefield_field.inc	2009-03-03 17:18:32.000000000 +0100
@@ -87,14 +87,13 @@ function filefield_field_load($node, $fi
     // Despite hook_content_is_empty(), CCK still doesn't filter out
     // empty items from $op = 'load', so we need to do that ourselves.
     if (empty($item['fid']) || !($file = field_file_load($item['fid']))) {
-      unset($items[$delta]);
+      $items[$delta] = NULL;
     }
     else {
       $item['data'] = unserialize($item['data']);
       $items[$delta] = array_merge($item, $file);
     }
   }
-  $items = array_values($items); // compact deltas
   return array($field['field_name'] => $items);
 }
 
@@ -109,12 +108,10 @@ function filefield_field_update($node, $
   $curfids = array();
   foreach ($items as $delta => $item) {
     $items[$delta] = field_file_save($node, $item);
-    // Remove items from the array if they have been deleted.
-    if (empty($items[$delta])) unset($items[$delta]);
-    $curfids[] = $item['fid'];
+    if (!empty($items[$delta]['fid'])) {
+      $curfids[] = $item['fid'];
+    }
   }
-  $items = array_values($items); // compact deltas
-
 
   // if this is a new node... there are no
   // old items to worry about.
@@ -138,8 +135,9 @@ function filefield_field_delete_revision
   foreach ($items as $delta => $item) {
     // For hook_file_references, remember that this is being deleted.
     $item['field_name'] = $field['field_name'];
-    if (field_file_delete($item)) unset($items[$delta]);
-    $items = array_values($items); // compact deltas
+    if (field_file_delete($item)) {
+      $items[$delta] = NULL;
+    }
   }
 }
 
@@ -156,7 +154,6 @@ function filefield_field_sanitize($node,
   foreach ($items as $delta => $item) {
     // Cleanup $items during node preview.
     if (empty($item['fid']) || !empty($item['delete'])) {
-      unset($items[$delta]);
       continue;
     }
     // Load the complete file if a filepath is not available.
