diff --git a/multifield.field.inc b/multifield.field.inc
index a10305d..fb9ceb9 100644
--- a/multifield.field.inc
+++ b/multifield.field.inc
@@ -333,6 +333,7 @@ function multifield_field_update($entity_type, $entity, $field, $instance, $lang
   foreach ($items as $delta => $item) {
     $pseudo_entity = _multifield_field_item_to_entity($machine_name, $item);
     _multifield_field_attach_update('multifield', $pseudo_entity);
+    _multifield_update_file_usage($entity_type, $entity, $field, $instance);
     $items[$delta] = _multifield_field_entity_to_item($pseudo_entity);
   }
 
@@ -359,6 +360,55 @@ function _multifield_field_attach_update($entity_type, $entity) {
 }
 
 /**
+ * Updates file usage stats for managed files.
+ *
+ * @param string $entity_type
+ *   The entity type.
+ * @param object $entity
+ *   The host entity for this multifield field.
+ * @param array $field
+ *   The multifield field metadata.
+ * @param array $instance
+ *   The multifield field instance.
+ */
+function _multifield_update_file_usage($entity_type, $entity, $field, $instance) {
+  list($entity_id) = entity_extract_ids($entity_type, $entity);
+
+  if (!empty($field['foreign keys'])) {
+    foreach ($field['foreign keys'] as $key => $properties) {
+      if (!empty($properties['table']) && ($properties['table'] == 'file_managed')) {
+        foreach ($entity->{$field['field_name']}[$entity->language] as $delta => $delta_data) {
+          $fid = $delta_data[$key];
+          if (!empty($fid)) {
+            // Found a file. Check that we are tracking it's usage.
+            $file = new stdClass;
+            $file->fid = $fid;
+            $file_usage = file_usage_list($file);
+            if (empty($file_usage) || !isset($file_usage['multifield'][$entity_type][$entity_id])) {
+              file_usage_add($file, 'multifield', $entity_type, $entity_id);
+            }
+          }
+          // Check if the file was removed and update file_usage stats if so.
+          elseif (!empty($entity->original)) {
+            $original_entity = $entity->original;
+            // $key has a flattened version of the field array. We need to remove
+            // _fid from it in order to access the original entity's field name.
+            $file_field_name = preg_replace('/_fid$/', '', $key);
+            $original_field = $original_entity->{$field['field_name']}[$entity->language][$delta][$file_field_name];
+            if (!empty($original_field[$entity->language]) && !empty($original_field[$entity->language][0]['fid'])) {
+              $fid = $original_field[$entity->language][0]['fid'];
+              $file = new stdClass();
+              $file->fid = $fid;
+              file_usage_delete($file, 'multifield', $entity_type, $entity_id);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_field_delete().
  */
 function multifield_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
