diff --git a/entity_reference_revisions.info.yml b/entity_reference_revisions.info.yml
index ac32e2c..793a1ab 100644
--- a/entity_reference_revisions.info.yml
+++ b/entity_reference_revisions.info.yml
@@ -3,4 +3,7 @@ type: module
 description: Adds a Entity Reference field type with revision support.
 core: 8.x
 package: Field types
-
+dependencies:
+  - hal
+  - rest
+  - serialization
diff --git a/entity_reference_revisions.services.yml b/entity_reference_revisions.services.yml
new file mode 100644
index 0000000..3b79766
--- /dev/null
+++ b/entity_reference_revisions.services.yml
@@ -0,0 +1,7 @@
+services:
+  serializer.normalizer.entity_reference_revision_item.hal:
+    class: Drupal\entity_reference_revisions\Normalizer\hal\EntityReferenceRevisionItemNormalizer
+    parent: serializer.normalizer.entity_reference_item.hal
+    arguments: ['@rest.link_manager', '@serializer.entity_resolver']
+    tags:
+      - { name: normalizer, priority: 11 }
diff --git a/src/Normalizer/hal/EntityReferenceRevisionItemNormalizer.php b/src/Normalizer/hal/EntityReferenceRevisionItemNormalizer.php
new file mode 100644
index 0000000..56a39be
--- /dev/null
+++ b/src/Normalizer/hal/EntityReferenceRevisionItemNormalizer.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity_reference_revisions\Normalizer\hal\EntityReferenceRevisionItemNormalizer.
+ */
+
+namespace Drupal\entity_reference_revisions\Normalizer\hal;
+
+use Drupal\hal\Normalizer\EntityReferenceItemNormalizer;
+
+class EntityReferenceRevisionItemNormalizer extends EntityReferenceItemNormalizer {
+
+  /**
+   * The interface or class that this Normalizer supports.
+   *
+   * @var string
+   */
+  protected $supportedInterfaceOrClass = 'Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem';
+
+  /**
+   * Overrides \Drupal\hal\Normalizer\FieldItemNormalizer::constructValue().
+   */
+  protected function constructValue($data, $context) {
+    $value = parent::constructValue($data, $context);
+    if ($value) {
+			$value['target_revision_id'] = $value['target_id'];
+    }
+    return $value;
+  }
+
+}
diff --git a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
index 06b4977..147715f 100644
--- a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
+++ b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php
@@ -243,7 +243,7 @@ class EntityReferenceRevisionsItem extends EntityReferenceItem implements Option
    */
   public function preSave() {
     parent::preSave();
-    $this->target_revision_id = $this->entity->getRevisionId();
+    $this->target_revision_id = $this->values['target_revision_id'];
   }
 
   /**
@@ -270,6 +270,62 @@ class EntityReferenceRevisionsItem extends EntityReferenceItem implements Option
   /**
    * {@inheritdoc}
    */
+  public function postSave($update) {
+    parent::postSave($update);
+    $needs_save = FALSE;
+    // If any of entity, parent type or parent id is missing then return.
+    if (!$this->entity || !$this->entity->getEntityType()->get('entity_revision_parent_type_field') || !$this->entity->getEntityType()->get('entity_revision_parent_id_field')) {
+      return;
+    }
+
+    $entity = $this->entity;
+    $parent_entity = $this->getEntity();
+
+    // If the entity has a parent field name get the key.
+    if ($entity->getEntityType()->get('entity_revision_parent_field_name_field')) {
+      $parent_field_name = $entity->getEntityType()->get('entity_revision_parent_field_name_field');
+
+      // If parent field name has changed then set it.
+      if ($entity->get($parent_field_name)->value != $this->getFieldDefinition()->getName()) {
+        $entity->set($parent_field_name, $this->getFieldDefinition()->getName());
+        $needs_save = TRUE;
+      }
+    }
+
+    $parent_type = $entity->getEntityType()->get('entity_revision_parent_type_field');
+    $parent_id = $entity->getEntityType()->get('entity_revision_parent_id_field');
+
+    // If the parent type has changed then set it.
+    if ($entity->get($parent_type)->value != $parent_entity->getEntityTypeId()) {
+      $entity->set($parent_type, $parent_entity->getEntityTypeId());
+      $needs_save = TRUE;
+    }
+    // If the parent id has changed then set it.
+    if ($entity->get($parent_id)->value != $parent_entity->id()) {
+      $entity->set($parent_id, $parent_entity->id());
+      $needs_save = TRUE;
+    }
+
+    if ($needs_save) {
+      // Check if any of the keys has changed, save it, do not create a new
+      // revision.
+      $entity->setNewRevision(FALSE);
+      $entity->save();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function delete() {
+    parent::delete();
+    if ($this->entity && $this->entity->getEntityType()->get('entity_revision_parent_type_field') && $this->entity->getEntityType()->get('entity_revision_parent_id_field')) {
+      $this->entity->delete();
+    }
+}
+ /**
+ * {@inheritdoc}
+ */
   public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) {
     return FALSE;
   }
