diff --git a/core/modules/hal/lib/Drupal/hal/HalBundle.php b/core/modules/hal/lib/Drupal/hal/HalBundle.php
index bb1e2dc..7ddc3e1 100644
--- a/core/modules/hal/lib/Drupal/hal/HalBundle.php
+++ b/core/modules/hal/lib/Drupal/hal/HalBundle.php
@@ -23,6 +23,7 @@ public function build(ContainerBuilder $container) {
     $priority = 10;
 
     $container->register('serializer.normalizer.entity_reference_item.hal', 'Drupal\hal\Normalizer\EntityReferenceItemNormalizer')
+      ->addMethodCall('setEntityResolver', array(new Reference('serializer.entity_resolver')))
       ->addMethodCall('setLinkManager', array(new Reference('rest.link_manager')))
       ->addTag('normalizer', array('priority' => $priority));
     $container->register('serializer.normalizer.field_item.hal', 'Drupal\hal\Normalizer\FieldItemNormalizer')
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
index 2618d9a..45d91ad 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
@@ -80,7 +80,6 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
     $typed_data_ids = $this->getTypedDataIds($data['_links']['type']);
     $entity = entity_create($typed_data_ids['entity_type'], array('langcode' => $langcode, 'type' => $typed_data_ids['bundle']));
 
-    // @todo Handle data in _links and _embedded, http://drupal.org/node/1880424
     // Get links and remove from data array.
     $links = $data['_links'];
     unset($data['_links']);
@@ -91,6 +90,15 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
       unset($data['_embedded']);
     }
 
+    // Flatten the embedded values.
+    foreach ($embedded as $relation => $field) {
+      $field_ids = $this->linkManager->getRelationInternalIds($relation);
+      if (!empty($field_ids)) {
+        $field_name = $field_ids['field_name'];
+        $data[$field_name] = $field;
+      }
+    }
+
     // Iterate through remaining items in data array. These should all
     // correspond to fields.
     foreach ($data as $field_name => $field_data) {
@@ -166,5 +174,4 @@ protected function getTypedDataIds($types) {
 
     return $typed_data_ids;
   }
-
 }
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityReferenceItemNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityReferenceItemNormalizer.php
index 76c43c7..fd9e931 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityReferenceItemNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityReferenceItemNormalizer.php
@@ -7,10 +7,12 @@
 
 namespace Drupal\hal\Normalizer;
 
+use Drupal\serialization\EntityResolver\UuidReferenceInterface;
+
 /**
  * Converts the Drupal entity reference item object to HAL array structure.
  */
-class EntityReferenceItemNormalizer extends FieldItemNormalizer {
+class EntityReferenceItemNormalizer extends FieldItemNormalizer implements UuidReferenceInterface {
 
   /**
    * The interface or class that this Normalizer supports.
@@ -61,7 +63,43 @@ public function normalize($field_item, $format = NULL, array $context = array())
    * Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::denormalize()
    */
   public function denormalize($data, $class, $format = NULL, array $context = array()) {
-    // @todo Implement this in http://drupal.org/node/1880424
+    if (!isset($context['target_instance'])) {
+      throw new LogicException('$context[\'target_instance\'] must be set to denormalize with the FieldItemNormalizer');
+    }
+    if ($context['target_instance']->getParent() == NULL) {
+      throw new LogicException('The field item passed in via $context[\'target_instance\'] must have a parent set.');
+    }
+
+    $field_item = $context['target_instance'];
+
+    $field_definition = $field_item->getDefinition();
+    // If this field is translatable, we need to create a translated instance.
+    if (isset($data['lang'])) {
+      $langcode = $data['lang'];
+      unset($data['lang']);
+      if ($field_definition['translatable']) {
+        $field_item = $this->createTranslatedInstance($field_item, $langcode);
+      }
+    }
+    $target_type = $field_definition['settings']['target_type'];
+
+    $resolved = $this->entityResolver->resolve($this, $data, $target_type);
+
+    $field_item->setValue($resolved);
+    return $field_item;
+  }
+
+  /**
+   * Implements \Drupal\serialization\EntityResolver\UuidReferenceInterface::getUuid().
+   */
+  public function getUuid($data) {
+    if (isset($data['uuid'])) {
+      $uuid = $data['uuid'];
+      while (is_array($uuid)) {
+        $uuid = reset($uuid);
+      }
+      return $uuid;
+    }
   }
 
 }
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/NormalizerBase.php b/core/modules/hal/lib/Drupal/hal/Normalizer/NormalizerBase.php
index afa9019..769f4f9 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/NormalizerBase.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/NormalizerBase.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\hal\Normalizer;
 
+use Drupal\serialization\EntityResolver\EntityResolverInterface;
 use Drupal\serialization\Normalizer\NormalizerBase as SerializationNormalizerBase;
 use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
 
@@ -23,6 +24,13 @@
   protected $formats = array('hal_json');
 
   /**
+   * The entity resolver.
+   *
+   * @var \Drupal\serialization\EntityResolver\EntityResolverInterface
+   */
+  protected $entityResolver;
+
+  /**
    * The hypermedia link manager.
    *
    * @var \Drupal\rest\LinkManager\LinkManager
@@ -64,4 +72,15 @@ public function setLinkManager($link_manager) {
     $this->linkManager = $link_manager;
   }
 
+  /**
+   * Sets the entity resolver.
+   *
+   * The entity resolver is used to
+   *
+   * @param \Drupal\serialization\EntityResolver\EntityResolverInterface $entity_resolver
+   */
+  public function setEntityResolver(EntityResolverInterface $entity_resolver) {
+    $this->entityResolver = $entity_resolver;
+  }
+
 }
diff --git a/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php b/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php
index cbab209..976a023 100644
--- a/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php
+++ b/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php
@@ -129,7 +129,7 @@ function setUp() {
       new FieldItemNormalizer(),
       new FieldNormalizer(),
     );
-    $link_manager = new LinkManager(new TypeLinkManager(new MemoryBackend('cache')), new RelationLinkManager());
+    $link_manager = new LinkManager(new TypeLinkManager(new MemoryBackend('cache')), new RelationLinkManager(new MemoryBackend('cache')));
     foreach ($normalizers as $normalizer) {
       $normalizer->setLinkManager($link_manager);
     }
diff --git a/core/modules/rest/lib/Drupal/rest/LinkManager/LinkManager.php b/core/modules/rest/lib/Drupal/rest/LinkManager/LinkManager.php
index 2004a6c..742fcfd 100644
--- a/core/modules/rest/lib/Drupal/rest/LinkManager/LinkManager.php
+++ b/core/modules/rest/lib/Drupal/rest/LinkManager/LinkManager.php
@@ -55,4 +55,11 @@ public function getTypeInternalIds($type_uri) {
   public function getRelationUri($entity_type, $bundle, $field_name) {
     return $this->relationLinkManager->getRelationUri($entity_type, $bundle, $field_name);
   }
+
+  /**
+   * Implements \Drupal\rest\LinkManager\RelationLinkManagerInterface::getRelationInternalIds().
+   */
+  public function getRelationInternalIds($relation_uri) {
+    return $this->relationLinkManager->getRelationInternalIds($relation_uri);
+  }
 }
diff --git a/core/modules/rest/lib/Drupal/rest/LinkManager/RelationLinkManager.php b/core/modules/rest/lib/Drupal/rest/LinkManager/RelationLinkManager.php
index 78f5d7e..0e3fd91 100644
--- a/core/modules/rest/lib/Drupal/rest/LinkManager/RelationLinkManager.php
+++ b/core/modules/rest/lib/Drupal/rest/LinkManager/RelationLinkManager.php
@@ -7,24 +7,87 @@
 
 namespace Drupal\rest\LinkManager;
 
+use Drupal\Core\Cache\CacheBackendInterface;
+
 class RelationLinkManager implements RelationLinkManagerInterface{
 
   /**
-   * Get a relation link for the field.
-   *
-   * @param string $entity_type
-   *   The bundle's entity type.
-   * @param string $bundle
-   *   The name of the bundle.
-   * @param string $field_name
-   *   The name of the field.
+   * @var \Drupal\Core\Cache\CacheBackendInterface;
+   */
+  protected $cache;
+
+  /**
+   * Constructor.
    *
-   * @return array
-   *   The URI that identifies this field.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache of relation URIs and their associated Typed Data IDs.
+   */
+  public function __construct(CacheBackendInterface $cache) {
+    $this->cache = $cache;
+  }
+
+  /**
+   * Implements \Drupal\rest\LinkManager\RelationLinkManagerInterface::getRelationUri().
    */
   public function getRelationUri($entity_type, $bundle, $field_name) {
     // @todo Make the base path configurable.
     return url("rest/relation/$entity_type/$bundle/$field_name", array('absolute' => TRUE));
   }
 
+  /**
+   * Implements \Drupal\rest\LinkManager\RelationLinkManagerInterface::getRelationInternalIds().
+   */
+  public function getRelationInternalIds($relation_uri) {
+    $relations = $this->getRelations();
+    if (isset($relations[$relation_uri])) {
+      return $relations[$relation_uri];
+    }
+    return FALSE;
+  }
+
+  /**
+   * Get the array of relation links.
+   *
+   * Any field can be handled as a relation simply by changing how it is
+   * normalized. Therefore, there is no prior knowledge that can be used here
+   * to determine which fields to assign relation URIs. Instead, each field,
+   * even primitives, are given a relation URI. It is up to the caller to
+   * determine which URIs to use.
+   *
+   * @return array
+   *   An array of typed data ids (entity_type, bundle, and field name) keyed
+   *   by corresponding relation URI.
+   */
+  public function getRelations() {
+    $cid = 'rest:links:relations';
+    $cache = $this->cache->get($cid);
+    if (!$cache) {
+      $this->writeCache();
+      $cache = $this->cache->get($cid);
+    }
+    return $cache->data;
+  }
+
+  /**
+   * Writes the cache of relation links.
+   */
+  protected function writeCache() {
+    $data = array();
+
+    foreach (field_info_fields() as $field_info) {
+      foreach ($field_info['bundles'] as $entity_type => $bundles) {
+        foreach ($bundles as $bundle) {
+          $relation_uri = $this->getRelationUri($entity_type, $bundle, $field_info['field_name']);
+          $data[$relation_uri] = array(
+            'entity_type' => $entity_type,
+            'bundle' => $bundle,
+            'field_name' => $field_info['field_name'],
+          );
+        }
+      }
+    }
+    // These URIs only change when field info changes, so cache it permanently
+    // and only clear it when field_info is cleared.
+    $this->cache->set('rest:links:relations', $data, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+  }
 }
diff --git a/core/modules/rest/lib/Drupal/rest/RestBundle.php b/core/modules/rest/lib/Drupal/rest/RestBundle.php
index 1c98b79..294cbc6 100644
--- a/core/modules/rest/lib/Drupal/rest/RestBundle.php
+++ b/core/modules/rest/lib/Drupal/rest/RestBundle.php
@@ -38,6 +38,7 @@ public function build(ContainerBuilder $container) {
       ->addArgument(new Reference('rest.link_manager.relation'));
     $container->register('rest.link_manager.type', 'Drupal\rest\LinkManager\TypeLinkManager')
       ->addArgument(new Reference('cache.cache'));
-    $container->register('rest.link_manager.relation', 'Drupal\rest\LinkManager\RelationLinkManager');
+    $container->register('rest.link_manager.relation', 'Drupal\rest\LinkManager\RelationLinkManager')
+      ->addArgument(new Reference('cache.cache'));
   }
 }
diff --git a/core/modules/serialization/lib/Drupal/serialization/EntityResolver/ChainEntityResolver.php b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/ChainEntityResolver.php
new file mode 100644
index 0000000..f8edbb3
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/ChainEntityResolver.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\EntityResolver\ChainEntityResolver
+ */
+
+namespace Drupal\serialization\EntityResolver;
+
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+/**
+ * Resolver delegating the entity resolution to a chain of resolvers.
+ */
+class ChainEntityResolver implements EntityResolverInterface {
+
+  /**
+   * The concrete resolvers.
+   *
+   * @var array
+   */
+  protected $resolvers;
+
+  /**
+   * Constructor.
+   *
+   * @param array $resolvers
+   *   The array of concrete resolvers.
+   */
+  public function __construct(array $resolvers = array()) {
+    $this->resolvers = $resolvers;
+  }
+
+  /**
+   * Implements \Drupal\serialization\EntityResolver\EntityResolverInterface::resolve().
+   */
+  public function resolve(NormalizerInterface $normalizer, $data, $target_type) {
+    foreach ($this->resolvers as $resolver) {
+      if ($resolved = $resolver->resolve($normalizer, $data, $target_type)) {
+        return $resolved;
+      }
+    }
+    return NULL;
+  }
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/EntityResolver/EntityResolverInterface.php b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/EntityResolverInterface.php
new file mode 100644
index 0000000..440a82a
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/EntityResolverInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\EntityResolver\EntityResolverInterface
+ */
+
+namespace Drupal\serialization\EntityResolver;
+
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+interface EntityResolverInterface {
+
+  /**
+   * Resolve an ID to the corresponding entity.
+   *
+   * If the local id is found, the target_id property should be set in the
+   * returned array. Otherwise, if the EntityResolver knows how to dereference
+   * the value, the dereferencer should be set.
+   *
+   * @param \Symfony\Component\Serializer\Normalizer\NormalizerInterface $normalizer
+   *   The normalizer which is handling the data.
+   *
+   * @return array|NULL
+   *   Returns an array containing either target_id or dereferencer, if found.
+   *   Otherwise, return NULL.
+   */
+  public function resolve(NormalizerInterface $normalizer, $data, $target_type);
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidReferenceInterface.php b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidReferenceInterface.php
new file mode 100644
index 0000000..9371113
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidReferenceInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\EntityResolver\UuidReferenceInterface
+ */
+
+namespace Drupal\serialization\EntityResolver;
+
+/**
+ * Interface for extracting UUID from entity reference data when denormalizing.
+ */
+interface UuidReferenceInterface {
+
+  /**
+   * Get the uuid from the data array.
+   *
+   * @param array $data
+   *   The data, as was passed into the Normalizer.
+   *
+   * @return string
+   *   A UUID.
+   */
+  public function getUuid($data);
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidResolver.php b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidResolver.php
new file mode 100644
index 0000000..2fe4d93
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/EntityResolver/UuidResolver.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\EntityResolver\UuidResolver
+ */
+
+namespace Drupal\serialization\EntityResolver;
+
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+class UuidResolver implements EntityResolverInterface {
+
+  /**
+   * Implements \Drupal\serialization\EntityResolver\EntityResolverInterface::resolve().
+   */
+  public function resolve(NormalizerInterface $normalizer, $data, $target_type) {
+    if (($normalizer instanceof UuidReferenceInterface) && $uuid = $normalizer->getUuid($data)) {
+      // If an entity with this UUID exists on the site, return the local id.
+      if ($entity = entity_load_by_uuid($target_type, $uuid)) {
+        return array('target_id' => $entity->id());
+      }
+    }
+    return NULL;
+  }
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/RegisterEntityResolversCompilerPass.php b/core/modules/serialization/lib/Drupal/serialization/RegisterEntityResolversCompilerPass.php
new file mode 100644
index 0000000..6399f50
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/RegisterEntityResolversCompilerPass.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\RegisterEntityResolversCompilerPass.
+ */
+
+namespace Drupal\serialization;
+
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Adds services tagged 'normalizer' and 'encoder' to the Serializer.
+ */
+class RegisterEntityResolversCompilerPass implements CompilerPassInterface {
+
+  /**
+   * Adds services to the Serializer.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *   The container to process.
+   */
+  public function process(ContainerBuilder $container) {
+    $definition = $container->getDefinition('serializer.entity_resolver');
+
+    // Retrieve registered Normalizers and Encoders from the container.
+    foreach ($container->findTaggedServiceIds('entity_resolver') as $id => $attributes) {
+      $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
+      $resolvers[$priority][] = new Reference($id);
+    }
+
+    // Add the registered concrete EntityResolvers to the ChainEntityResolver.
+    if (!empty($resolvers)) {
+      $definition->replaceArgument(0, $this->sort($resolvers));
+    }
+  }
+
+  /**
+   * Sorts by priority.
+   *
+   * Order services from highest priority number to lowest (reverse sorting).
+   *
+   * @param array $services
+   *   A nested array keyed on priority number. For each priority number, the
+   *   value is an array of Symfony\Component\DependencyInjection\Reference
+   *   objects, each a reference to a normalizer or encoder service.
+   *
+   * @return array
+   *   A flattened array of Reference objects from $services, ordered from high
+   *   to low priority.
+   */
+  protected function sort($services) {
+    $sorted = array();
+    krsort($services);
+
+    // Flatten the array.
+    foreach ($services as $a) {
+      $sorted = array_merge($sorted, $a);
+    }
+
+    return $sorted;
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
index a2744b5..7bfea43 100644
--- a/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
+++ b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
@@ -24,16 +24,28 @@ public function build(ContainerBuilder $container) {
       ->addArgument(array())
       ->addArgument(array());
 
+    // Register the normalizers.
     $container->register('serializer.normalizer.complex_data', 'Drupal\serialization\Normalizer\ComplexDataNormalizer')->addTag('normalizer');
     $container->register('serializer.normalizer.list', 'Drupal\serialization\Normalizer\ListNormalizer')->addTag('normalizer');
     $container->register('serializer.normalizer.typed_data', 'Drupal\serialization\Normalizer\TypedDataNormalizer')->addTag('normalizer');
 
+    // Register the encoders.
     $container->register('serializer.encoder.json', 'Drupal\serialization\Encoder\JsonEncoder')
       ->addTag('encoder', array('format' => array('json' => 'JSON')));
     $container->register('serializer.encoder.xml', 'Drupal\serialization\Encoder\XmlEncoder')
       ->addTag('encoder', array('format' => array('xml' => 'XML')));
 
+    // Add the chain entity resolver with an argument to be replaced in the
+    // compiler pass.
+    $container->register('serializer.entity_resolver', 'Drupal\serialization\EntityResolver\ChainEntityResolver')
+      ->addArgument(array());
+    // Add the concrete entity resolvers.
+    $container->register('serializer.entityresolver.uuid', 'Drupal\serialization\EntityResolver\UuidResolver')
+      ->addTag('entity_resolver');
+
     // Add a compiler pass for adding Normalizers and Encoders to Serializer.
     $container->addCompilerPass(new RegisterSerializationClassesCompilerPass());
+    // Add a compiler pass for adding concrete Resolvers to chain Resolver.
+    $container->addCompilerPass(new RegisterEntityResolversCompilerPass());
   }
 }
diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/EntityResolverTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntityResolverTest.php
new file mode 100644
index 0000000..dfbb7ba
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntityResolverTest.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\serialization\Tests\EntityResolverTest.
+ */
+
+namespace Drupal\serialization\Tests;
+
+class EntityResolverTest extends NormalizerTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_reference', 'hal', 'rest');
+
+  /**
+   * The format being tested.
+   *
+   * @var string
+   */
+  protected $format = 'hal_json';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity resolver tests',
+      'description' => 'Tests that entities references can be resolved.',
+      'group' => 'Serialization',
+    );
+  }
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Create the test field.
+    $field = array(
+      'settings' => array(
+        'target_type' => 'entity_test_mulrev',
+      ),
+      'field_name' => 'field_test_entity_reference',
+      'type' => 'entity_reference',
+    );
+    field_create_field($field);
+
+    // Create the test field instance.
+    $instance = array(
+      'entity_type' => 'entity_test_mulrev',
+      'field_name' => 'field_test_entity_reference',
+      'bundle' => 'entity_test_mulrev',
+    );
+    field_create_instance($instance);
+  }
+
+  /**
+   * Test that fields referencing UUIDs can be denormalized.
+   */
+  function testUuidEntityResolver() {
+    // Create an entity to get the UUID from.
+    $entity = entity_create('entity_test_mulrev', array('type' => 'entity_test_mulrev'));
+    $entity->set('name', 'foobar');
+    $entity->set('field_test_entity_reference', array(array('target_id' => 1)));
+    $entity->save();
+
+    $field_uri = url('rest/relation/entity_test_mulrev/entity_test_mulrev/field_test_entity_reference', array('absolute' => TRUE));
+
+    $data = array(
+      '_links' => array(
+        'type' => array(
+          'href' => url('rest/type/entity_test_mulrev/entity_test_mulrev', array('absolute' => TRUE)),
+        ),
+        $field_uri => array(
+          array(
+            'href' => url('entity/entity_test_mulrev/' . $entity->id()),
+          ),
+        ),
+      ),
+      '_embedded' => array(
+        $field_uri => array(
+          array(
+            '_links' => array(
+              'self' => url('entity/entity_test_mulrev/' . $entity->id()),
+            ),
+            'uuid' => array(
+              array(
+                'value' => $entity->uuid(),
+              ),
+            ),
+          ),
+        ),
+      ),
+    );
+
+    $denormalized = $this->container->get('serializer')->denormalize($data, 'Drupal\entity_test\Plugin\Core\Entity\EntityTestMulRev', $this->format);
+    $field_value = $denormalized->get('field_test_entity_reference')->getValue();
+    $this->assertEqual($field_value[0]['target_id'], 1, 'Entity reference resolved using UUID.');
+  }
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
index fb7019e..5afc882 100644
--- a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
@@ -16,14 +16,7 @@
 /**
  * Tests entity normalization and serialization of supported core formats.
  */
-class EntitySerializationTest extends DrupalUnitTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('serialization', 'system', 'entity', 'field', 'entity_test', 'text', 'field_sql_storage');
+class EntitySerializationTest extends NormalizerTestBase {
 
   /**
    * The test values.
@@ -57,28 +50,6 @@ public static function getInfo() {
   protected function setUp() {
     parent::setUp();
 
-    $this->installSchema('field', array('field_config', 'field_config_instance'));
-    $this->installSchema('entity_test', array('entity_test_mulrev', 'entity_test_mulrev_property_revision', 'entity_test_mulrev_property_data'));
-
-    // Auto-create a field for testing.
-    field_create_field(array(
-      'field_name' => 'field_test_text',
-      'type' => 'text',
-      'cardinality' => 1,
-      'translatable' => FALSE,
-    ));
-    $instance = array(
-      'entity_type' => 'entity_test_mulrev',
-      'field_name' => 'field_test_text',
-      'bundle' => 'entity_test_mulrev',
-      'label' => 'Test text-field',
-      'widget' => array(
-        'type' => 'text_textfield',
-        'weight' => 0,
-      ),
-    );
-    field_create_instance($instance);
-
     // Create a test entity to serialize.
     $this->values = array(
       'name' => $this->randomName(),
diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/NormalizerTestBase.php b/core/modules/serialization/lib/Drupal/serialization/Tests/NormalizerTestBase.php
new file mode 100644
index 0000000..cef60b5
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/NormalizerTestBase.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ *
+ */
+
+namespace Drupal\serialization\Tests;
+
+use Drupal\simpletest\DrupalUnitTestBase;
+
+abstract class NormalizerTestBase extends DrupalUnitTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('serialization', 'system', 'entity', 'field', 'entity_test', 'text', 'field_sql_storage');
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('field', array('field_config', 'field_config_instance'));
+    $this->installSchema('entity_test', array('entity_test_mulrev', 'entity_test_mulrev_property_revision', 'entity_test_mulrev_property_data'));
+    $this->installSchema('system', array('url_alias'));
+
+    // Auto-create a field for testing.
+    field_create_field(array(
+      'field_name' => 'field_test_text',
+      'type' => 'text',
+      'cardinality' => 1,
+      'translatable' => FALSE,
+    ));
+    $instance = array(
+      'entity_type' => 'entity_test_mulrev',
+      'field_name' => 'field_test_text',
+      'bundle' => 'entity_test_mulrev',
+      'label' => 'Test text-field',
+      'widget' => array(
+        'type' => 'text_textfield',
+        'weight' => 0,
+      ),
+    );
+    field_create_instance($instance);
+  }
+}
