diff --git a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
index 0c2ee9ed4d..b5f37d74c4 100644
--- a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
+++ b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\hal\Normalizer;
 
+use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Field\FieldItemInterface;
 use Symfony\Component\Serializer\Exception\InvalidArgumentException;
 
@@ -127,9 +128,43 @@ protected function createTranslatedInstance(FieldItemInterface $item, $langcode)
 
     // Instead, create a new item for the entity in the requested language.
     $entity = $item->getEntity();
-    $entity_translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
+    // Get the translated entity, or create it if it does not exist.
+    $entity_translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $this->createTranslatedEntity($entity, $langcode);
     $field_name = $item->getFieldDefinition()->getName();
-    return $entity_translation->get($field_name)->appendItem();
+    $field = $entity_translation->get($field_name);
+
+    // Append an item only if the field is empty or allows multiple values.
+    if ($field->isEmpty() || $item->getFieldDefinition()->getFieldStorageDefinition()->isMultiple()) {
+      return $field->appendItem();
+    }
+    return $field->first();
+  }
+
+  /**
+   * Create an empty entity translation to fill with field data.
+   *
+   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
+   *   The untranslated entity.
+   * @param string $langcode
+   *   The langcode.
+   *
+   * @return \Drupal\Core\Entity\FieldableEntityInterface
+   *   The translated entity.
+   */
+  protected function createTranslatedEntity(FieldableEntityInterface $entity, $langcode) {
+    // Create a new translation.
+    /** @var \Drupal\Core\TypedData\TranslatableInterface $entity */
+    /** @var \Drupal\Core\Entity\FieldableEntityInterface $entity_translation */
+    $entity_translation = $entity->addTranslation($langcode);
+
+    // Remove all default values, except for the langcode.
+    $translated_fields = $entity_translation->getTranslatableFields(FALSE);
+    unset($translated_fields['langcode']);
+    foreach ($translated_fields as $field) {
+      $field->setValue([]);
+    }
+
+    return $entity_translation;
   }
 
 }
diff --git a/core/modules/hal/tests/src/Kernel/TranslationNormalizeTest.php b/core/modules/hal/tests/src/Kernel/TranslationNormalizeTest.php
new file mode 100644
index 0000000000..3634e5baa6
--- /dev/null
+++ b/core/modules/hal/tests/src/Kernel/TranslationNormalizeTest.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\Tests\hal\Kernel;
+
+use Drupal\entity_test\Entity\EntityTestMulChanged;
+
+/**
+ * Test normalizing and denormalizing an entity with a translation.
+ *
+ * @group hal
+ *
+ * @todo Add an annalogos class for Serializer module using 'json' format.
+ */
+class TranslationNormalizeTest extends NormalizerTestBase {
+
+  /**
+   * The class name of the test class.
+   *
+   * @var string
+   */
+  protected $entityClass = 'Drupal\entity_test\Entity\EntityTestMulChanged';
+
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test_mul_changed');
+
+  }
+
+
+  /**
+   * @param $format
+   *
+   * @dataProvider formatProvider
+   */
+  public function testTranslationNormalize($format) {
+    $target_entity = EntityTestMulChanged::create((['langcode' => 'en', 'field_test_entity_reference' => NULL]));
+    $target_entity->save();
+
+    $target_entity->addTranslation('de', $target_entity->toArray());
+
+    $this->assertEquals(1, count($target_entity->changed));
+    $this->assertEquals(1, count($target_entity->getTranslation('en')->changed));
+    $this->assertEquals(1, count($target_entity->getTranslation('de')->changed));
+
+    $data = $this->serializer->normalize($target_entity, $format);
+    $denormalized_entity = $this->serializer->denormalize($data, $this->entityClass, $format);
+
+    $this->assertEquals(1, count($denormalized_entity->changed));
+    $this->assertEquals(1, count($target_entity->getTranslation('en')->changed));
+    $this->assertEquals(1, count($denormalized_entity->getTranslation('de')->changed));
+  }
+
+  public function formatProvider() {
+    return [
+      'json' => [
+        'format' => 'json',
+      ],
+      'hal_json' => [
+        'format' => 'hal_json',
+      ],
+    ];
+  }
+
+}
