diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
index 008f20e..8fbc128 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
@@ -34,9 +34,8 @@ public function normalize($field_item, $format = NULL, array $context = array())
     // keyed by field name so that field items can be merged by the
     // FieldNormalizer. This is necessary for the EntityReferenceItemNormalizer
     // to be able to place values in the '_links' array.
-    $field = $field_item->getParent();
     return array(
-      $field->getName() => array($values),
+      $field_item->getFieldDefinition()->getFieldName() => array($values),
     );
   }
 
@@ -99,26 +98,15 @@ protected function constructValue($data, $context) {
    *   The translated field item instance.
    */
   protected function createTranslatedInstance(FieldItemInterface $field_item, $langcode) {
-    $parent = $field_item->getParent();
-    $ancestors = array();
-
     // Remove the untranslated instance from the field's list of items.
-    $parent->offsetUnset($field_item->getName());
-
-    // Get the property path.
-    while (!method_exists($parent, 'getTranslation')) {
-      array_unshift($ancestors, $parent);
-      $parent = $parent->getParent();
-    }
-
-    // Recreate the property path with translations.
-    $translation = $parent->getTranslation($langcode);
-    foreach ($ancestors as $ancestor) {
-      $ancestor_name =  $ancestor->getName();
-      $translation = $translation->get($ancestor_name);
-    }
+    $delta = $field_item->getName();
+    $items = $field_item->getParent();
+    $items->offsetUnset($delta);
 
     // Create a new instance at the end of the property path and return it.
+    $entity = $field_item->getEntity();
+    $field_name = $field_item->getFieldDefinition()->getFieldName();
+    $translation = $entity->getTranslation($langcode)->get($field_name);
     $count = $translation->isEmpty() ? 0 : $translation->count();
     return $translation->offsetGet($count);
   }
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
index bd3472f..4a7661f 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
@@ -27,35 +27,33 @@ class FieldNormalizer extends NormalizerBase {
   /**
    * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize()
    */
-  public function normalize($field, $format = NULL, array $context = array()) {
-    $normalized_field_items = array();
+  public function normalize($field_items, $format = NULL, array $context = array()) {
+    $normalized_items = array();
 
     // Get the field definition.
-    $entity = $field->getEntity();
-    $field_name = $field->getName();
+    $entity = $field_items->getEntity();
+    $field_name = $field_items->getName();
     $field_definition = $entity->getPropertyDefinition($field_name);
 
     // If this field is not translatable, it can simply be normalized without
     // separating it into different translations.
     if (empty($field_definition['translatable'])) {
-      $normalized_field_items = $this->normalizeFieldItems($field, $format, $context);
+      $normalized_items = $this->normalizeFieldItems($field_items, $format, $context);
     }
     // Otherwise, the languages have to be extracted from the entity and passed
     // in to the field item normalizer in the context. The langcode is appended
     // to the field item values.
     else {
-      foreach ($entity->getTranslationLanguages() as $lang) {
-        $context['langcode'] = $lang->id == 'und' ? Language::LANGCODE_DEFAULT : $lang->id;
-        $translation = $entity->getTranslation($lang->id);
-        $translated_field = $translation->get($field_name);
-        $normalized_field_items = array_merge($normalized_field_items, $this->normalizeFieldItems($translated_field, $format, $context));
+      foreach ($entity->getTranslationLanguages() as $language) {
+        $context['langcode'] = $language->id == 'und' ? Language::LANGCODE_DEFAULT : $language->id;
+        $translated_items = $entity->getTranslation($language->id)->get($field_name);
+        $normalized_items = array_merge($normalized_items, $this->normalizeFieldItems($translated_items, $format, $context));
       }
     }
 
     // Merge deep so that links set in entity reference normalizers are merged
     // into the links property.
-    $normalized = NestedArray::mergeDeepArray($normalized_field_items);
-    return $normalized;
+    return NestedArray::mergeDeepArray($normalized_items);
   }
 
 
@@ -70,26 +68,26 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
       throw new LogicException('The field passed in via $context[\'target_instance\'] must have a parent set.');
     }
 
-    $field = $context['target_instance'];
-    foreach ($data as $field_item_data) {
-      $count = $field->count();
+    $field_items = $context['target_instance'];
+    foreach ($data as $item_data) {
+      $count = $field_items->count();
       // Get the next field item instance. The offset will serve as the field
       // item name.
-      $field_item = $field->offsetGet($count);
-      $field_item_class = get_class($field_item);
+      $item = $field_items->offsetGet($count);
+      $item_class = get_class($item);
       // Pass in the empty field item object as the target instance.
-      $context['target_instance'] = $field_item;
-      $this->serializer->denormalize($field_item_data, $field_item_class, $format, $context);
+      $context['target_instance'] = $item;
+      $this->serializer->denormalize($item_data, $item_class, $format, $context);
     }
 
-    return $field;
+    return $field_items;
 
   }
 
   /**
    * Helper function to normalize field items.
    *
-   * @param \Drupal\Core\Field\FieldItemListInterface $field
+   * @param \Drupal\Core\Field\FieldItemListInterface $field_items
    *   The field object.
    * @param string $format
    *   The format.
@@ -99,14 +97,14 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
    * @return array
    *   The array of normalized field items.
    */
-  protected function normalizeFieldItems($field, $format, $context) {
-    $normalized_field_items = array();
-    if (!$field->isEmpty()) {
-      foreach ($field as $field_item) {
-        $normalized_field_items[] = $this->serializer->normalize($field_item, $format, $context);
+  protected function normalizeFieldItems($field_items, $format, $context) {
+    $normalized_items = array();
+    if (!$field_items->isEmpty()) {
+      foreach ($field_items as $item) {
+        $normalized_items[] = $this->serializer->normalize($item, $format, $context);
       }
     }
-    return $normalized_field_items;
+    return $normalized_items;
   }
 
 }
