diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index a9dd647..f62cbc1 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -374,30 +374,23 @@ protected function getTranslatedField($name, $langcode) {
       // LanguageInterface::LANGCODE_DEFAULT as key.
 
       $default = $langcode == LanguageInterface::LANGCODE_DEFAULT;
-      if (!$default && !$definition->isTranslatable()) {
-        if (!isset($this->fields[$name][LanguageInterface::LANGCODE_DEFAULT])) {
-          $this->fields[$name][LanguageInterface::LANGCODE_DEFAULT] = $this->getTranslatedField($name, LanguageInterface::LANGCODE_DEFAULT);
-        }
-        $this->fields[$name][$langcode] = &$this->fields[$name][LanguageInterface::LANGCODE_DEFAULT];
+      $value = NULL;
+      if (isset($this->values[$name][$langcode])) {
+        $value = $this->values[$name][$langcode];
+      }
+      $field = \Drupal::service('plugin.manager.field.field_type')->createFieldItemList($this->getTranslation($langcode), $name, $value);
+      if ($default) {
+        // $this->defaultLangcode might not be set if we are initializing the
+        // default language code cache, in which case there is no valid
+        // langcode to assign.
+        $field_langcode = isset($this->defaultLangcode) ? $this->defaultLangcode : LanguageInterface::LANGCODE_NOT_SPECIFIED;
       }
       else {
-        $value = NULL;
-        if (isset($this->values[$name][$langcode])) {
-          $value = $this->values[$name][$langcode];
-        }
-        $field = \Drupal::service('plugin.manager.field.field_type')->createFieldItemList($this, $name, $value);
-        if ($default) {
-          // $this->defaultLangcode might not be set if we are initializing the
-          // default language code cache, in which case there is no valid
-          // langcode to assign.
-          $field_langcode = isset($this->defaultLangcode) ? $this->defaultLangcode : LanguageInterface::LANGCODE_NOT_SPECIFIED;
-        }
-        else {
-          $field_langcode = $langcode;
-        }
-        $field->setLangcode($field_langcode);
-        $this->fields[$name][$langcode] = $field;
+        $field_langcode = $langcode;
       }
+      $field->setLangcode($field_langcode);
+      $this->fields[$name][$langcode] = $field;
+
     }
     return $this->fields[$name][$langcode];
   }
@@ -921,19 +914,13 @@ public function __clone() {
       // The translation is a different object, and needs its own TypedData
       // adapter object.
       $this->typedData = NULL;
-      $definitions = $this->getFieldDefinitions();
       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));
-        }
+        // All the fields, inclusive the untranslatable ones should be cloned,
+        // because on each translation each field has a different context.
         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..ae55f49
--- /dev/null
+++ b/core/modules/system/src/Tests/Entity/ContentEntityCloneTest.php
@@ -0,0 +1,64 @@
+<?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');
+
+    $this->assertEqual($entity->getTranslationLanguages(), $clone->getTranslationLanguages(), 'The entity and its clone have the same translation languages.');
+
+    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)));
+      }
+    }
+  }
+}
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
index 138794f..885b08b 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
@@ -769,4 +769,25 @@ function testEntityAdapter() {
     }
   }
 
+  /**
+   * Tests correct entity reference on fields after adding new translation.
+   */
+  public function testFieldEntityReference() {
+    $entity_type = 'entity_test_mul';
+    $controller = $this->entityManager->getStorage($entity_type);
+    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    $entity = $controller->create();
+
+    foreach ($this->langcodes as $langcode) {
+      $entity->addTranslation($langcode);
+    }
+
+    foreach (array_keys($entity->getTranslationLanguages()) as $langcode) {
+      $translation = $entity->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.',
+          array('%field_name' => $field_name, '%langcode' => $langcode)));
+      }
+    }
+  }
 }
