diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index a9dd647..3f66dc0 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -921,19 +921,27 @@ public function __clone() {
       // The translation is a different object, and needs its own TypedData
       // adapter object.
       $this->typedData = NULL;
-      $definitions = $this->getFieldDefinitions();
+
+      // Ensure all the fields on each translation are initialized.
+      $translation_languages = $this->getTranslationLanguages();
+      if ($translation_languages) {
+        foreach ($translation_languages as $langcode => $language) {
+          $translation = $this->getTranslation($langcode);
+          foreach (array_keys($this->fields) as $field_name) {
+            $translation->getTranslatedField($field_name, $langcode);
+          }
+        }
+      }
+
+      // Untranslatable fields may have multiple references for the same field
+      // object keyed by language. Unfortunately we cannot avoid creating
+      // different field objects, because we have to ensure the right context
+      // is set for each translation.
       foreach ($this->fields as $name => $values) {
         $this->fields[$name] = array();
-        // Untranslatable fields may have multiple references for the same field
-        // object keyed by language. To avoid creating different field objects
-        // we retain just the original value, as references will be recreated
-        // later as needed.
-        if (!$definitions[$name]->isTranslatable() && count($values) > 1) {
-          $values = array_intersect_key($values, array(LanguageInterface::LANGCODE_DEFAULT => TRUE));
-        }
         foreach ($values as $langcode => $items) {
           $this->fields[$name][$langcode] = clone $items;
-          $this->fields[$name][$langcode]->setContext($name, $this->getTypedData());
+          $this->fields[$name][$langcode]->setContext($name, $this->getTranslation($langcode)->getTypedData());
         }
       }
 
diff --git a/core/modules/system/src/Tests/Entity/ContentEntityCloneTest.php b/core/modules/system/src/Tests/Entity/ContentEntityCloneTest.php
new file mode 100644
index 0000000..5c0489a
--- /dev/null
+++ b/core/modules/system/src/Tests/Entity/ContentEntityCloneTest.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\system\Tests\Entity\ContentEntityCloneTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\entity_test\Entity\EntityTestMul;
+
+/**
+ * Tests proper cloning of content entities.
+ *
+ * @group Entity
+ */
+class ContentEntityCloneTest extends EntityUnitTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['language', 'entity_test'];
+
+  /**
+   * @inheritdoc
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Enable an additional language.
+    ConfigurableLanguage::createFromLangcode('de')->save();
+
+    $this->installEntitySchema('entity_test_mul');
+  }
+
+  /**
+   * Tests correct entity reference on fields after clone.
+   */
+  public function testFieldEntityReferenceAfterClone() {
+    $user = $this->createUser();
+
+    // Create some test entities.
+    $entity = EntityTestMul::create([
+      'name' => $this->randomString(),
+      'user_id' => $user->id(),
+      'language' => 'en',
+    ]);
+
+    $clone = clone $entity->addTranslation('de');
+
+    foreach (array_keys($clone->getTranslationLanguages()) as $langcode) {
+      $translation = $clone->getTranslation($langcode);
+      foreach ($translation->getFields() as $field_name => $field) {
+        $this->assertEqual($langcode, $field->getEntity()->language()->getId(), format_string('Field %field_name on translation %langcode has correct entity reference after cloning.',
+          array('%field_name' => $field_name, '%langcode' => $langcode)));
+      }
+    }
+  }
+
+}
