diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
index 6c4a6fc..c3842c2 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
@@ -52,6 +52,13 @@ public function getPropertyDefinitions() {
         'read-only' => FALSE,
         'settings' => array('id source' => 'value'),
       );
+      // @todo Ask fago how to add this from REST module now that
+      // hook_entity_property_info_alter is gone.
+      self::$propertyDefinitions[$entity_type]['rest_import_uri'] = array(
+        'type' => 'string',
+        'label' => t('REST Import URI'),
+        'description' => t('The URI which can be used to access data about the referenced entity.'),
+      );
     }
     return self::$propertyDefinitions[$entity_type];
   }
@@ -78,6 +85,14 @@ public function setValue($values) {
       $this->properties['entity']->setValue(NULL);
     }
     unset($values['entity'], $values['value']);
+
+    //@todo This really shouldn't be here. Is there a way to add a property to
+    // EntityReferenceItem at all?
+    if (isset($values['rest_import_uri'])) {
+      $this->properties['rest_import_uri']->setValue($values['rest_import_uri']);
+    }
+    unset($values['rest_import_uri']);
+
     if ($values) {
       throw new InvalidArgumentException('Property ' . key($values) . ' is unknown.');
     }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
index 66767cf..5403892 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
@@ -46,8 +46,11 @@ public function normalize($object, $format = NULL) {
    * Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::denormalize()
    */
   public function denormalize($data, $class, $format = null) {
-    // @todo Support denormalization for Entity Reference.
-    return array();
+    $return = array();
+    foreach ($data as $node) {
+      $return[]['rest_import_uri'] = $node['@id'];
+    }
+    return $return;
   }
 
   /**
diff --git a/core/modules/rest/lib/Drupal/rest/RequestHandler.php b/core/modules/rest/lib/Drupal/rest/RequestHandler.php
index b8d6d42..6767b34 100644
--- a/core/modules/rest/lib/Drupal/rest/RequestHandler.php
+++ b/core/modules/rest/lib/Drupal/rest/RequestHandler.php
@@ -11,6 +11,7 @@
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
 
 /**
  * Acts as intermediate request forwarder for resource plugins.
@@ -45,6 +46,8 @@ public function handle(Request $request, $id = NULL) {
       // @todo Replace the format here with something we get from the HTTP
       //   Content-type header. See http://drupal.org/node/1850704
       $unserialized = $serializer->deserialize($received, $class, 'drupal_jsonld');
+      // Handle entity reference fields.
+      $this->handleEntityReference($unserialized);
     }
 
     // Invoke the operation on the resource plugin.
@@ -62,8 +65,58 @@ public function handle(Request $request, $id = NULL) {
       //   Accept headers. See http://drupal.org/node/1833440
       $output = $serializer->serialize($data, 'drupal_jsonld');
       $response->setContent($output);
-      $response->headers->set('Content-Type', 'application/vnd.drupal.ld+json');
+      $response->headers->set('Content-Type', 'application/vnd.drupal.ldjson');
     }
     return $response;
   }
+
+  protected function handleEntityReference($unserialized) {
+    // Only entities which support EntityInterface can be handled.
+    if (!($unserialized instanceof \Drupal\Core\Entity\EntityInterface)) {
+      return $unserialized;
+    }
+
+    // Use property definitions to determine which properties are
+    // entityreference_fields and thus need to be handled.
+    $definitions = $unserialized->getPropertyDefinitions();
+    foreach ($definitions as $property => $definition) {
+      if ($definition['type'] == 'entityreference_field') {
+        $entityreference_items = $unserialized->get($property)->getValue();
+        // Dereference each item separately.
+        foreach ($entityreference_items as $entityreference) {
+          // The dereference function returns the internal id. Set the value of
+          // the field to that internal id, which removes the REST data at the
+          // same time.
+          $value = $this->dereference($entityreference);
+          $unserialized->set($property, array('value' => $value));
+        }
+      }
+    }
+  }
+
+  /**
+   * Determines the internal ID of the referenced entity.
+   */
+  protected function dereference($entityreference) {
+    // For now, assume dereference by GET request.
+    // @todo Implement a pluggable dereferencer and enable choice of deferencer
+    // to use to vary by field instance.
+    if (isset($entityreference['rest_import_uri'])) {
+      $container = drupal_container();
+      $kernel = $container->get('http_kernel');
+      $uri = $entityreference['rest_import_uri'];
+
+      // @todo Add ESI-like exception handling.
+      // @todo Replace the format here with something we get from the HTTP
+      //   Accept headers. See http://drupal.org/node/1833440
+      $request = Request::create($uri, 'get', 'drupal_jsonld');
+      $response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST, true);
+
+      // For now just return 1 since the user_id is the only entity reference
+      // field on entity_test.
+      // @todo Actually use the data returned. Right now, only entity_test
+      // entities return data.
+      return 1;
+    }
+  }
 }
