diff --git a/field_collection.module b/field_collection.module
index 645093a..33837ca 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -903,10 +903,6 @@ function field_collection_field_presave($host_entity_type, $host_entity, $field,
 
       if ($entity = field_collection_field_get_entity($item)) {
 
-        if (!empty($entity->is_new)) {
-          $entity->setHostEntity($host_entity_type, $host_entity, LANGUAGE_NONE, FALSE);
-        }
-
         // If the host entity is saved as new revision, do the same for the item.
         if (!empty($host_entity->revision)) {
           $entity->revision = TRUE;
@@ -918,18 +914,25 @@ function field_collection_field_presave($host_entity_type, $host_entity, $field,
             $entity->archived = FALSE;
           }
         }
-        $entity->save(TRUE);
-
-        $item = array(
-          'value' => $entity->item_id,
-          'revision_id' => $entity->revision_id,
-        );
       }
     }
   }
 }
 
 /**
+ * Implements hook_field_insert().
+ */
+function field_collection_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  foreach ($items as &$item) {
+    if (isset($item['entity'])) {
+      $item['entity']->setHostEntity($entity_type, $entity, LANGUAGE_NONE, FALSE);
+      $item['entity']->save(TRUE);
+      $item = array('value' => $item['entity']->item_id, 'revision_id' => $entity->revision_id);
+    }
+  }
+}
+
+/**
  * Implements hook_field_update().
  *
  * Care about removed field collection items.
@@ -940,6 +943,10 @@ function field_collection_field_update($entity_type, $entity, $field, $instance,
 
   foreach ($items as $item) {
     unset($original_by_id[$item['value']]);
+    if (isset($item['entity'])) {
+      $item['entity']->save(TRUE);
+      $item = array('value' => $item['entity']->item_id);
+    }
   }
 
   // If there are removed items, care about deleting the item entities.
