diff --git a/core/modules/content_translation/src/Tests/ContentTranslationLanguageChangeTest.php b/core/modules/content_translation/src/Tests/ContentTranslationLanguageChangeTest.php
new file mode 100644
index 0000000..a465476
--- /dev/null
+++ b/core/modules/content_translation/src/Tests/ContentTranslationLanguageChangeTest.php
@@ -0,0 +1,197 @@
+<?php
+
+namespace Drupal\content_translation\Tests;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\node\Tests\NodeTestBase;
+
+/**
+ * Tests the content translation language that is set.
+ *
+ * @group content_translation
+ */
+class ContentTranslationLanguageChangeTest extends NodeTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['language', 'content_translation', 'content_translation_test', 'node', 'block', 'field_ui', 'image'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $langcodes = ['de', 'fr'];
+    foreach ($langcodes as $langcode) {
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
+    }
+    $this->drupalPlaceBlock('local_tasks_block');
+    $user = $this->drupalCreateUser(array(
+      'administer site configuration',
+      'administer nodes',
+      'create article content',
+      'edit any article content',
+      'delete any article content',
+      'administer content translation',
+      'translate any entity',
+      'create content translations',
+      'administer languages',
+      'administer content types',
+      'administer node fields',
+    ));
+    $this->drupalLogin($user);
+
+    // Enable translation for article.
+    $edit = [
+      'entity_types[node]' => TRUE,
+      'settings[node][article][translatable]' => TRUE,
+      'settings[node][article][settings][language][language_alterable]' => TRUE,
+    ];
+    $this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
+
+    // Add an image field.
+    $this->drupalGet('admin/structure/types/manage/article/fields/add-field');
+    $edit = [
+      'new_storage_type' => 'image',
+      'field_name' => 'image_field',
+      'label' => 'image_field',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and continue'));
+    $this->drupalPostForm(NULL, [], t('Save field settings'));
+    $this->drupalPostForm(NULL, [], t('Save settings'));
+  }
+
+  /**
+   * Test that the source language is properly set when changing.
+   */
+  public function testLanguageChange() {
+    // Create a node in English.
+    $this->drupalGet('node/add/article');
+    $edit = [
+      'title[0][value]' => 'english_title',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and publish'));
+
+    // Create a translation in French.
+    $this->clickLink('Translate');
+    $this->clickLink('Add');
+    $this->drupalPostForm(NULL, [], t('Save and keep published (this translation)'));
+    $this->clickLink('Translate');
+
+    // Edit English translation.
+    $this->clickLink('Edit');
+    // Upload and image after changing the node language.
+    $images = $this->drupalGetTestFiles('image')[1];
+    $edit = [
+      'langcode[0][value]' => 'de',
+      'files[field_image_field_0]' => $images->uri,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Upload'));
+    $this->drupalPostForm(NULL, ['field_image_field[0][alt]' => 'alternative_text'], t('Save and keep published (this translation)'));
+
+    // Check that the translation languages are correct.
+    $node = $this->getNodeByTitle('english_title');
+    $translation_languages = array_keys($node->getTranslationLanguages());
+    $this->assertTrue(in_array('fr', $translation_languages));
+    $this->assertTrue(in_array('de', $translation_languages));
+  }
+
+  /**
+   * Test that title does not change on ajax call with new language value.
+   */
+  public function testTitleDoesNotChangesOnChangingLanguageWidgetAndTriggeringAjaxCall() {
+    // Create a node in English.
+    $this->drupalGet('node/add/article', ['query' => ['test_field_only_en_fr' => 1]]);
+    $edit = [
+      'title[0][value]' => 'english_title',
+      'test_field_only_en_fr' => 'node created',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and publish'));
+    $this->assertEqual('node created', \Drupal::state()->get('test_field_only_en_fr'));
+
+    // Create a translation in French.
+    $this->clickLink('Translate');
+    $this->clickLink('Add');
+    $this->drupalPostForm(NULL, [], t('Save and keep published (this translation)'));
+    $this->clickLink('Translate');
+
+    // Edit English translation.
+    $node = $this->getNodeByTitle('english_title');
+    $this->drupalGet('node/' . $node->id() . '/edit');
+    // Test the expected title when loading the form.
+    $this->assertRaw('<title>Edit Article english_title | Drupal</title>');
+    // Upload and image after changing the node language.
+    $images = $this->drupalGetTestFiles('image')[1];
+    $edit = [
+      'langcode[0][value]' => 'de',
+      'files[field_image_field_0]' => $images->uri,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Upload'));
+    // Test the expected title after triggering an ajax call with a new
+    // language selected.
+    $this->assertRaw('<title>Edit Article english_title | Drupal</title>');
+    $edit = [
+      'langcode[0][value]' => 'en',
+      'field_image_field[0][alt]' => 'alternative_text'
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published (this translation)'));
+
+    // Check that the translation languages are correct.
+    $node = $this->getNodeByTitle('english_title');
+    $translation_languages = array_keys($node->getTranslationLanguages());
+    $this->assertTrue(in_array('fr', $translation_languages));
+    $this->assertTrue(!in_array('de', $translation_languages));
+  }
+
+  /**
+   * Test not loosing user input when the changing language and executing ajax.
+   */
+  public function testUserInputIsNotLostOnLanguageChange() {
+    // Create a node in English.
+    $this->drupalGet('node/add/article', ['query' => ['test_field_only_en_fr' => 1]]);
+    $edit = [
+      'title[0][value]' => 'english_title',
+      'test_field_only_en_fr' => 'node created',
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and publish'));
+    // Test that the user input for english and french forms only has not been
+    // lost.
+    $this->assertEqual('node created', \Drupal::state()->get('test_field_only_en_fr'));
+
+    // Create a translation in French.
+    $this->clickLink('Translate');
+    $this->clickLink('Add');
+    $this->drupalPostForm(NULL, [], t('Save and keep published (this translation)'));
+    $this->clickLink('Translate');
+
+    // Edit English translation.
+    $node = $this->getNodeByTitle('english_title');
+    $this->drupalGet('node/' . $node->id() . '/edit', ['query' => ['test_field_only_en_fr' => 1]]);
+    // Upload and image after changing the node language.
+    $images = $this->drupalGetTestFiles('image')[1];
+    $edit = [
+      'langcode[0][value]' => 'de',
+      'test_field_only_en_fr' => 'node changed',
+      'files[field_image_field_0]' => $images->uri,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Upload'));
+    $edit = [
+      'langcode[0][value]' => 'en',
+      'field_image_field[0][alt]' => 'alternative_text'
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published (this translation)'));
+    // Test that the user input for english and french forms only has not been
+    // lost.
+    $this->assertEqual('node changed', \Drupal::state()->get('test_field_only_en_fr'));
+
+    // Check that the translation languages are correct.
+    $node = $this->getNodeByTitle('english_title');
+    $translation_languages = array_keys($node->getTranslationLanguages());
+    $this->assertTrue(in_array('fr', $translation_languages));
+    $this->assertTrue(!in_array('de', $translation_languages));
+  }
+
+}
diff --git a/core/modules/content_translation/tests/modules/content_translation_test/content_translation_test.module b/core/modules/content_translation/tests/modules/content_translation_test/content_translation_test.module
new file mode 100644
index 0000000..7093947
--- /dev/null
+++ b/core/modules/content_translation/tests/modules/content_translation_test/content_translation_test.module
@@ -0,0 +1,33 @@
+<?php
+
+use \Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ *
+ * Adds a textfield to node forms based on a request parameter.
+ */
+function content_translation_test_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
+  $langcode = $form_state->getFormObject()->getFormLangcode($form_state);
+  if (in_array($langcode, ['en', 'fr']) && \Drupal::request()->get('test_field_only_en_fr')) {
+    $form['test_field_only_en_fr'] = [
+      '#type' => 'textfield',
+      '#title' => 'Field only available on the english and french form',
+    ];
+
+    foreach (array_keys($form['actions']) as $action) {
+      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
+        $form['actions'][$action]['#submit'][] = 'content_translation_test_form_node_form_submit';
+      }
+    }
+  }
+}
+
+/**
+ * Form submission handler for custom field added based on a request parameter.
+ *
+ * @see content_translation_test_form_node_article_form_alter()
+ */
+function content_translation_test_form_node_form_submit($form, FormStateInterface $form_state) {
+  \Drupal::state()->set('test_field_only_en_fr', $form_state->getValue('test_field_only_en_fr'));
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php
index cca7eb1..6a5162c 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php
@@ -89,4 +89,50 @@ public function testEnforceIsNewOnClonedEntityTranslation() {
     $this->assertFalse($entity_translation->isNew());
   }
 
+  /**
+   * Tests if the entity fields are properly cloned.
+   */
+  public function testClonedEntityFields() {
+    $user = $this->createUser();
+
+    // Create a test entity.
+    $entity = EntityTestMul::create([
+      'name' => $this->randomString(),
+      'user_id' => $user->id(),
+      'language' => 'en',
+    ]);
+
+    $entity->addTranslation('de');
+    $entity->save();
+    $fields = array_keys($entity->getFieldDefinitions());
+
+    // Reload the entity, clone it and check that both entity objects reference
+    // different field instances.
+    $entity = $this->reloadEntity($entity);
+    $clone = clone $entity;
+
+    $different_references = TRUE;
+    foreach ($fields as $field_name) {
+      if ($entity->get($field_name) === $clone->get($field_name)) {
+        $different_references = FALSE;
+      }
+    }
+    $this->assertTrue($different_references, 'The entity object and the cloned entity object reference different field item list objects.');
+
+
+    // Reload the entity, initialize one translation, clone it and check that
+    // both entity objects reference different field instances.
+    $entity = $this->reloadEntity($entity);
+    $entity->getTranslation('de');
+    $clone = clone $entity;
+
+    $different_references = TRUE;
+    foreach ($fields as $field_name) {
+      if ($entity->get($field_name) === $clone->get($field_name)) {
+        $different_references = FALSE;
+      }
+    }
+    $this->assertTrue($different_references, 'The entity object and the cloned entity object reference different field item list objects if the entity is cloned after an entity translation has been initialized.');
+  }
+
 }
