diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
index c6ebff5..6d84d99 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
@@ -79,12 +79,21 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
             $columns = array_merge($columns, isset($info['columns']) ? $info['columns'] : array($group));
           }
           if (!empty($columns)) {
+            $values = array();
+            foreach ($translations as $langcode => $language) {
+              $values[$langcode] = $entity->getTranslation($langcode)->get($field_name)->getValue();
+            }
+
             // If a translation is being created, the original values should be
             // used as the unchanged items. In fact there are no unchanged items
             // to check against.
             $langcode = $original_langcode ?: $sync_langcode;
-            $unchanged_items = $entity_unchanged->getTranslation($langcode)->{$field_name};
-            $this->synchronizeItems($entity, $field_name, $unchanged_items, $sync_langcode, array_keys($translations), $columns);
+            $unchanged_items = $entity_unchanged->getTranslation($langcode)->{$field_name}->getValue();
+            $this->synchronizeItems($values, $unchanged_items, $sync_langcode, array_keys($translations), $columns);
+
+            foreach ($translations as $langcode => $language) {
+              $entity->getTranslation($langcode)->get($field_name)->setValue($values[$langcode]);
+            }
           }
         }
       }
@@ -94,10 +103,8 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
   /**
    * {@inheritdoc}
    */
-  public function synchronizeItems(EntityInterface $entity, $field_name, FieldInterface $unchanged_items, $sync_langcode, array $translations, array $columns) {
-    // Clone the object, since we are going to access the values after writing
-    // to the entity.
-    $source_items = clone $entity->getTranslation($sync_langcode)->{$field_name};
+  public function synchronizeItems(array &$values, array $unchanged_items, $sync_langcode, array $translations, array $columns) {
+    $source_items = $values[$sync_langcode];
 
     // Make sure we can detect any change in the source items.
     $change_map = array();
@@ -119,17 +126,12 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
     }
 
     // Backup field values and the change map.
-    foreach ($translations as $langcode) {
-      $original_field_values[$langcode] = $entity->getTranslation($sync_langcode)->{$field_name}->getValue();
-    }
+    $original_field_values = $values;
     $original_change_map = $change_map;
 
     // Reset field values so that no spurious one is stored. Source values must
     // be preserved in any case.
-    foreach ($translations as $langcode) {
-      $entity->getTranslation($langcode)->{$field_name}->setValue(array());
-    }
-    $entity->getTranslation($sync_langcode)->{$field_name}->setValue($source_items->getValue());
+    $values = array($sync_langcode => $source_items);
 
     // Update field translations.
     foreach ($translations as $langcode) {
@@ -139,7 +141,6 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
         // Reinitialize the change map as it is emptied while processing each
         // language.
         $change_map = $original_change_map;
-        $new_values = array();
 
         // By using the maximum cardinality we ensure to process removed items.
         for ($delta = 0; $delta < $total; $delta++) {
@@ -169,7 +170,7 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
           // If a synchronized column has changed or has been created from
           // scratch we need to override the full items array for all languages.
           elseif ($created) {
-            $new_values[$delta] = $source_items->offsetGet($delta)->getValue();
+            $values[$langcode][$delta] = $source_items[$delta];
           }
           // Otherwise the current item might have been reordered.
           elseif (isset($old_delta) && isset($new_delta)) {
@@ -178,17 +179,10 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
             // the new values are at least propagated to all the translations.
             // If the value has only been reordered we just move the old one in
             // the new position.
-            if (isset($original_field_values[$langcode][$old_delta])) {
-              $new_values[$delta] = $original_field_values[$langcode][$old_delta];
-            }
-            else {
-              $new_values[$delta] = $source_items->offsetGet($new_delta)->getValue();
-            }
+            $item = isset($original_field_values[$langcode][$old_delta]) ? $original_field_values[$langcode][$old_delta] : $source_items[$new_delta];
+            $values[$langcode][$new_delta] = $item;
           }
         }
-
-        $entity->getTranslation($langcode)->{$field_name}->setValue($new_values);
-
       }
     }
   }
@@ -196,7 +190,7 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
   /**
    * Computes a hash code for the specified item.
    *
-   * @param \Drupal\Core\Entity\Field\FieldInterface $items
+   * @param array $items
    *   An array of field items.
    * @param integer $delta
    *   The delta identifying the item to be processed.
@@ -206,13 +200,13 @@ public function synchronizeItems(EntityInterface $entity, $field_name, FieldInte
    * @returns string
    *   A hash code that can be used to identify the item.
    */
-  protected function itemHash(FieldInterface $items, $delta, array $columns) {
+  protected function itemHash(array $items, $delta, array $columns) {
     $values = array();
 
-    if ($items->offsetExists($delta)) {
+    if (isset($items[$delta])) {
       foreach ($columns as $column) {
-        $value = $items->offsetGet($delta)->get($column)->getValue();
-        if (!empty($value)) {
+        if (!empty($items[$delta][$column])) {
+          $value = $items[$delta][$column];
           // String and integer values are by far the most common item values,
           // thus we special-case them to improve performance.
           $values[] = is_string($value) || is_int($value) ? $value : hash('sha256', serialize($value));
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizerInterface.php b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizerInterface.php
index 9fd3040..1ae361c 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizerInterface.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizerInterface.php
@@ -8,7 +8,6 @@
 namespace Drupal\translation_entity;
 
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Entity\Field\FieldInterface;
 
 /**
  * Provides field translation synchronization capabilities.
@@ -46,11 +45,9 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
    * order. Subsequently the detected changes are performed on the field items
    * in other available languages.
    *
-   * @todo Adjust phpdoc
-   *
    * @param array $field_values
    *   The field values to be synchronized.
-   * @param \Drupal\Core\Entity\Field\FieldInterface $unchanged_items
+   * @param array $unchanged_items
    *   The unchanged items to be used to detect changes.
    * @param string $sync_langcode
    *   The language code of the items to use as source values.
@@ -59,6 +56,6 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
    * @param array $columns
    *   An array of column names to be synchronized.
    */
-  public function synchronizeItems(EntityInterface $entity, $field_name, FieldInterface $unchanged_items, $sync_langcode, array $translations, array $columns);
+  public function synchronizeItems(array &$field_values, array $unchanged_items, $sync_langcode, array $translations, array $columns);
 
 }
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
index cadf70a..95826ac 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php
@@ -88,7 +88,7 @@ function testImageFieldSync() {
     $langcode = $this->langcodes[1];
 
     // Populate the required contextual values.
-    $attributes = drupal_container()->get('request')->attributes;
+    $attributes = $this->container->get('request')->attributes;
     $attributes->set('working_langcode', $langcode);
     $attributes->set('source_langcode', $default_langcode);
 
@@ -122,8 +122,8 @@ function testImageFieldSync() {
       // the entity.
       $item = array(
         'fid' => $fid,
-        'alt' => $this->randomName(),
-        'title' => $this->randomName(),
+        'alt' => $default_langcode . '_' . $fid . '_' . $this->randomName(),
+        'title' => $default_langcode . '_' . $fid . '_' . $this->randomName(),
       );
       $entity->{$this->fieldName}->offsetGet($delta)->setValue($item);
 
@@ -147,8 +147,8 @@ function testImageFieldSync() {
       $fid = $this->files[$index]->fid;
       $item = array(
         'fid' => $fid,
-        'alt' => $this->randomName(),
-        'title' => $this->randomName(),
+        'alt' => $langcode . '_' . $fid . '_' . $this->randomName(),
+        'title' => $langcode . '_' . $fid . '_' . $this->randomName(),
       );
       $entity->getTranslation($langcode)->{$this->fieldName}->offsetGet($delta)->setValue($item);
 
@@ -171,10 +171,6 @@ function testImageFieldSync() {
       $value = $values[$default_langcode][$item->fid];
       $source_item = $entity->getTranslation($langcode)->{$this->fieldName}->offsetGet($delta);
       $assert = $item->fid == $source_item->fid && $item->alt == $value['alt'] && $item->title == $value['title'];
-      debug($source_item->fid, 'source item fid');
-      debug($item->fid, 'item fid');
-      debug($item->getValue(), 'item');
-      debug($value, 'value');
       $this->assertTrue($assert, format_string('Field item @fid has been successfully synchronized.', array('@fid' => $item->fid)));
       $fids[$item->fid] = TRUE;
     }
@@ -184,15 +180,14 @@ function testImageFieldSync() {
     $this->assertTrue(!isset($fids[$removed_fid]), format_string('Field item @fid has been correctly removed.', array('@fid' => $removed_fid)));
 
     // Add back an item for the dropped value and perform synchronization again.
-    // @todo Actually we would need to reset the contextual information to test
-    //   an update, but there is no entity field class for image fields yet,
-    //   hence field translation update does not work properly for those.
     $values[$langcode][$removed_fid] = array(
       'fid' => $removed_fid,
-      'alt' => $this->randomName(),
-      'title' => $this->randomName(),
+      'alt' => $langcode . '_' . $removed_fid . '_' . $this->randomName(),
+      'title' => $langcode . '_' . $removed_fid . '_' . $this->randomName(),
     );
     $entity->getTranslation($langcode)->{$this->fieldName}->setValue(array_values($values[$langcode]));
+    // When updating an entity we do not have a source language defined.
+    $attributes->remove('source_langcode');
     $entity = $this->saveEntity($entity);
 
     // Check that the value has been added to the default language.
