diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index aae2896..914822b 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -489,7 +489,7 @@ protected function getTranslatedField($name, $langcode) {
         if (isset($this->values[$name][$langcode])) {
           $value = $this->values[$name][$langcode];
         }
-        $field = \Drupal::service('plugin.manager.field.field_type')->createFieldItemList($this, $name, $value);
+        $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
@@ -520,10 +520,12 @@ public function set($name, $value, $notify = TRUE) {
   /**
    * {@inheritdoc}
    */
-  public function getFields($include_computed = TRUE) {
+    public function getFields($include_computed = TRUE, $include_translatable = TRUE, $include_non_translatable = TRUE) {
     $fields = array();
     foreach ($this->getFieldDefinitions() as $name => $definition) {
-      if ($include_computed || !$definition->isComputed()) {
+      if (($include_computed || !$definition->isComputed()) &&
+        (($include_translatable && $include_non_translatable) || ($include_translatable && $definition->isTranslatable()) || ($include_non_translatable && !$definition->isTranslatable()))
+      ) {
         $fields[$name] = $this->get($name);
       }
     }
@@ -1041,7 +1043,7 @@ public function __clone() {
         }
         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/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index c3ae6a3..61bc0f0 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -405,11 +405,23 @@ protected function invokeFieldMethod($method, ContentEntityInterface $entity) {
     $args = array_slice(func_get_args(), 2);
     foreach (array_keys($entity->getTranslationLanguages()) as $langcode) {
       $translation = $entity->getTranslation($langcode);
-      foreach ($translation->getFields() as $name => $items) {
-        // call_user_func_array() is way slower than a direct call so we avoid
-        // using it if have no parameters.
-        $result[$langcode][$name] = $args ? call_user_func_array([$items, $method], $args) : $items->{$method}();
+      // Call the field methods for non translatable fields only once and on the
+      // default entity translation.
+      if ($translation->isDefaultTranslation()) {
+        foreach ($translation->getFields() as $name => $items) {
+          // call_user_func_array() is way slower than a direct call so we avoid
+          // using it if have no parameters.
+          $result[$langcode][$name] = $args ? call_user_func_array([$items, $method], $args) : $items->{$method}();
+        }
+      }
+      else {
+        foreach ($translation->getFields(TRUE, TRUE, FALSE) as $name => $items) {
+          // call_user_func_array() is way slower than a direct call so we avoid
+          // using it if have no parameters.
+          $result[$langcode][$name] = $args ? call_user_func_array([$items, $method], $args) : $items->{$method}();
+        }
       }
+
     }
     return $result;
   }
diff --git a/core/lib/Drupal/Core/Entity/FieldableEntityInterface.php b/core/lib/Drupal/Core/Entity/FieldableEntityInterface.php
index 2e5cce7..3f853ec 100644
--- a/core/lib/Drupal/Core/Entity/FieldableEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/FieldableEntityInterface.php
@@ -179,11 +179,15 @@ public function set($field_name, $value, $notify = TRUE);
    *
    * @param bool $include_computed
    *   If set to TRUE, computed fields are included. Defaults to TRUE.
+   * @param bool $include_translatable
+   *   If set to TRUE, translatable fields are included. Defaults to TRUE.
+   * @param bool $include_non_translatable
+   *   If set to TRUE, non translatable fields are included. Defaults to TRUE.
    *
    * @return \Drupal\Core\Field\FieldItemListInterface[]
    *   An array of field item lists implementing, keyed by field name.
    */
-  public function getFields($include_computed = TRUE);
+  public function getFields($include_computed = TRUE, $include_translatable = TRUE, $include_non_translatable = TRUE);
 
   /**
    * Reacts to changes to a field.
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..7f7a0a7
--- /dev/null
+++ b/core/modules/system/src/Tests/Entity/ContentEntityCloneTest.php
@@ -0,0 +1,71 @@
+<?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.');
+
+    $default_langcode = $entity->getUntranslated()->language()->getId();
+    foreach (array_keys($clone->getTranslationLanguages()) as $langcode) {
+      $translation = $clone->getTranslation($langcode);
+      foreach ($translation->getFields() as $field_name => $field) {
+        if ($field->getFieldDefinition()->isTranslatable()) {
+          $this->assertEqual($langcode, $field->getEntity()->language()->getId(), format_string('Translatable field %field_name on translation %langcode has correct entity reference in translation %langcode after cloning.',
+            array('%field_name' => $field_name, '%langcode' => $langcode)));
+        }
+        else {
+          $this->assertEqual($default_langcode, $field->getEntity()->language()->getId(), format_string('Non translatable field %field_name on translation %langcode has correct entity reference in the default translation %default_langcode after cloning.',
+            array('%field_name' => $field_name, '%langcode' => $langcode, '%default_langcode' => $default_langcode)));
+        }
+      }
+    }
+  }
+}
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
index 11ec589..53fbedd 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
@@ -769,4 +769,33 @@ 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);
+    }
+
+    $default_langcode = $entity->getUntranslated()->language()->getId();
+    foreach (array_keys($entity->getTranslationLanguages()) as $langcode) {
+      $translation = $entity->getTranslation($langcode);
+      foreach ($translation->getFields() as $field_name => $field) {
+        if ($field->getFieldDefinition()->isTranslatable()) {
+          $this->assertEqual($langcode, $field->getEntity()->language()->getId(), format_string('Translatable field %field_name on translation %langcode has correct entity reference in translation %langcode.',
+            array('%field_name' => $field_name, '%langcode' => $langcode)));
+        }
+        else {
+
+          $this->assertEqual($default_langcode, $field->getEntity()->language()->getId(), format_string('Non translatable field %field_name on translation %langcode has correct entity reference in the default translation %default_langcode.',
+            array('%field_name' => $field_name, '%langcode' => $langcode, '%default_langcode' => $default_langcode)));
+        }
+      }
+    }
+  }
 }
