Index: filefield.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield.module,v
retrieving revision 1.166
diff -u -r1.166 filefield.module
--- filefield.module	2 Mar 2009 07:27:18 -0000	1.166
+++ filefield.module	9 Mar 2009 21:47:56 -0000
@@ -578,7 +549,7 @@
 function filefield_file_references($file) {
   $references = 0;
   foreach(content_fields() as $field) {
-    if ($field['type'] != 'file') {
+    if ($field['type'] != 'filefield') {
       continue;
     }
     $references += field_file_references($file, $field);
Index: filefield_field.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_field.inc,v
retrieving revision 1.14
diff -u -r1.14 filefield_field.inc
--- filefield_field.inc	2 Mar 2009 07:09:32 -0000	1.14
+++ filefield_field.inc	9 Mar 2009 21:47:56 -0000
@@ -122,12 +122,14 @@
     return;
   } 
 
-  // Try to delete items from original node.
+  // Delete items from original node if no new revision was created.
   $orig = node_load($node->nid); 
   // If there are, figure out which ones must go.
-  if (!empty($orig->$field['field_name'])) {
+  if ($node->revision == 0 && !empty($orig->$field['field_name'])) {
     foreach ($orig->$field['field_name'] as $oitem) {
-      if (!in_array($oitem['fid'], $curfids))  {
+      if (!in_array($oitem['fid'], $curfids)) {
+        // For hook_file_references, remember that this is being deleted.
+        $oitem['field_name'] = $field['field_name'];
         field_file_delete($oitem); 
       }
     }
Index: field_file.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/field_file.inc,v
retrieving revision 1.23
diff -u -r1.23 field_file.inc
--- field_file.inc	4 Feb 2009 00:42:50 -0000	1.23
+++ field_file.inc	9 Mar 2009 21:47:56 -0000
@@ -367,13 +367,16 @@
 
 function field_file_references($file, $field) {
   $db_info = content_database_info($field);
-  $references += db_result(db_query(
+  $references = db_result(db_query(
     'SELECT count('. $db_info['columns']['fid']['column'] .')
       FROM {'. $db_info['table'] .'}
       WHERE '. $db_info['columns']['fid']['column'] .' = %d', $file->fid
   ));
+
+  // If a field_name is present in the file object, the file is being deleted
+  // from this field, decrement the number of total references by one.
   if (isset($file->field_name) && $field['field_name'] == $file->field_name) {
-    --$references; // doesn't count as it's being deleted
+    --$references;
   }
   return $references;
 }
