diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 4684695..9e16ab1 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -11,7 +11,6 @@
 use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterMatchersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterRouteFiltersPass;
-use Drupal\Core\DependencyInjection\Compiler\RegisterSerializationClassesPass;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -253,20 +252,6 @@ public function build(ContainerBuilder $container) {
     $container
       ->register('transliteration', 'Drupal\Core\Transliteration\PHPTransliteration');
 
-    // Add Serializer with arguments to be replaced in the compiler pass.
-    $container->register('serializer', 'Symfony\Component\Serializer\Serializer')
-      ->addArgument(array())
-      ->addArgument(array());
-
-    $container->register('serializer.normalizer.complex_data', 'Drupal\Core\Serialization\ComplexDataNormalizer')->addTag('normalizer');
-    $container->register('serializer.normalizer.list', 'Drupal\Core\Serialization\ListNormalizer')->addTag('normalizer');
-    $container->register('serializer.normalizer.typed_data', 'Drupal\Core\Serialization\TypedDataNormalizer')->addTag('normalizer');
-
-    $container->register('serializer.encoder.json', 'Drupal\Core\Serialization\JsonEncoder')
-      ->addTag('encoder', array('format' => array('json' => 'JSON')));
-    $container->register('serializer.encoder.xml', 'Drupal\Core\Serialization\XmlEncoder')
-      ->addTag('encoder', array('format' => array('xml' => 'XML')));
-
     $container->register('flood', 'Drupal\Core\Flood\DatabaseBackend')
       ->addArgument(new Reference('database'));
 
@@ -274,8 +259,6 @@ public function build(ContainerBuilder $container) {
     $container->addCompilerPass(new RegisterRouteFiltersPass());
     // Add a compiler pass for registering event subscribers.
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
-    // Add a compiler pass for adding Normalizers and Encoders to Serializer.
-    $container->addCompilerPass(new RegisterSerializationClassesPass());
     // Add a compiler pass for registering event subscribers.
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
     $container->addCompilerPass(new RegisterAccessChecksPass());
diff --git a/core/modules/jsonld/jsonld.info b/core/modules/jsonld/jsonld.info
index fce4688..6e89779 100644
--- a/core/modules/jsonld/jsonld.info
+++ b/core/modules/jsonld/jsonld.info
@@ -4,3 +4,4 @@ package = Core
 version = VERSION
 core = 8.x
 dependencies[] = rdf
+dependencies[] = serialization
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
index 3024883..b62328f 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
@@ -51,6 +51,7 @@ public function build(ContainerBuilder $container) {
         $container->register("serializer.normalizer.{$supported_class}.{$format}", $normalizer_class)
           ->addArgument(new Reference('rdf.site_schema_manager'))
           ->addArgument(new Reference('rdf.mapping_manager'))
+          ->addMethodCall('setEntityReferenceHandlerPluginManager', array(new Reference('plugin.manager.serialization.entityreference_handler')))
           ->addTag('normalizer', array('priority' => $priority));
       }
     }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
index ab662b3..0d2f25b 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
@@ -8,6 +8,7 @@
 namespace Drupal\jsonld;
 
 use Drupal\jsonld\JsonldNormalizerBase;
+use Drupal\serialization\Plugin\Type\EntityReferenceHandlerPluginManager;
 use Drupal\rdf\RdfMappingException;
 use Symfony\Component\Serializer\Exception\UnexpectedValueException;
 use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
@@ -88,6 +89,7 @@ public function denormalize($data, $class, $format = null, array $context = arra
       }
     }
 
+    $entityreference_settings = serialization_get_entityreference_handler_settings($entity->entityType(), $entity->bundle(), $format);
     // For each attribute in the JSON-LD, add the values as fields to the newly
     // created entity. It is assumed that the JSON attribute names are the same
     // as the site's field names.
@@ -112,7 +114,14 @@ public function denormalize($data, $class, $format = null, array $context = arra
       // The vnd.drupal.ld+json mime type will always use language keys, per
       // http://drupal.org/node/1838700.
       foreach ($incomingFieldValues as $langcode => $incomingFieldItems) {
-        $fieldValue = $this->serializer->denormalize($incomingFieldItems, $fieldItemClass, $format);
+        $context = array();
+        $field_definition = $entity->getPropertyDefinition($fieldName);
+        if ($field_definition['type'] == 'entityreference_field') {
+          $handler_settings = $entityreference_settings->getHandler($fieldName);
+          $handler_settings['settings']['target_entity_type'] = $field_definition['settings']['entity type'];
+          $context['entityreference_handler'] = $this->entityReferenceHandlerPluginManager->createInstance($handler_settings['plugin_id'], $handler_settings['settings']);
+        }
+        $fieldValue = $this->serializer->denormalize($incomingFieldItems, $fieldItemClass, $format, $context);
         $entity->getTranslation($langcode)
           ->set($fieldName, $fieldValue);
       }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
index f57066d..6e2c3d3 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityReferenceNormalizer.php
@@ -30,24 +30,36 @@ class JsonldEntityReferenceNormalizer extends JsonldNormalizerBase implements De
   /**
    * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize()
    */
-  public function normalize($object, $format = NULL, array $context = array()) {
-    // @todo If an $options parameter is added to the serialize signature, as
+  public function normalize($object, $format = null, array $context = array()) {
+    $return = array();
+    // @todo Since the context parameter was added to Serilizer's interface, as
     // requested in https://github.com/symfony/symfony/pull/4938, then instead
     // of creating the array of properties, we could simply call normalize and
     // pass in the referenced entity with a flag that ensures it is rendered as
     // a node reference and not a node definition.
     $entity_wrapper = new JsonldEntityWrapper($object->entity, $format, $this->serializer, $this->siteSchemaManager);
-    return array(
-      '@id' => $entity_wrapper->getId(),
-    );
+    $return['@id'] = $entity_wrapper->getId();
+
+    // @todo Remove this if statement once all entities are EntityNG.
+    if ($object instanceof \Drupal\Core\Entity\EntityNG) {
+      $properties = $entity_wrapper->getProperties();
+      $return['uuid'] = $properties['uuid'];
+    }
+
+    return $return;
   }
 
   /**
    * Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::denormalize()
    */
   public function denormalize($data, $class, $format = null, array $context = array()) {
-    // @todo Support denormalization for Entity Reference.
-    return array();
+    $return = array();
+    $entityreference_handler = $context['entityreference_handler'];
+
+    foreach ($data as $node) {
+      $return[]['value'] = $entityreference_handler->getEntityId($node, $format, $this->serializer);
+    }
+    return $return;
   }
 
   /**
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldNormalizerBase.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldNormalizerBase.php
index e898da8..b5ba7ed 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldNormalizerBase.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldNormalizerBase.php
@@ -8,22 +8,14 @@
 namespace Drupal\jsonld;
 
 use ReflectionClass;
+use Drupal\serialization\Normalizer\NormalizerBase;
 use Drupal\rdf\RdfMappingManager;
 use Drupal\rdf\SiteSchema\SiteSchemaManager;
-use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
-use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
 
 /**
  * Provide a base class for JSON-LD Normalizers.
  */
-abstract class JsonldNormalizerBase extends SerializerAwareNormalizer implements NormalizerInterface {
-
-  /**
-   * The interface or class that this Normalizer supports.
-   *
-   * @var string
-   */
-  protected static $supportedInterfaceOrClass;
+abstract class JsonldNormalizerBase extends NormalizerBase {
 
   /**
    * The formats that this Normalizer supports.
@@ -60,7 +52,7 @@ public function __construct(SiteSchemaManager $site_schema_manager, RdfMappingMa
   }
 
   /**
-   * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize()
+   * Overrides \Drupal\Core\Serialization\NormalizerBase::supportsNormalization()
    */
   public function supportsNormalization($data, $format = NULL) {
     return is_object($data) && in_array($format, static::$format) && ($data instanceof static::$supportedInterfaceOrClass);
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/DenormalizeTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/DenormalizeTest.php
new file mode 100644
index 0000000..70e68e7
--- /dev/null
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/DenormalizeTest.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\jsonld\Tests\DenormalizeTest.
+ */
+
+namespace Drupal\jsonld\Tests;
+
+use Drupal\rdf\SiteSchema\SiteSchema;
+use Symfony\Component\Serializer\Exception\UnexpectedValueException;
+
+class DenormalizeTest extends NormalizerTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Denormalize Test',
+      'description' => 'Test that entities can be denormalized from JSON-LD.',
+      'group' => 'JSON-LD',
+    );
+  }
+
+  /**
+   * Overrides NormalizerTestBase::setUp().
+   */
+  public function setUp() {
+    parent::setUp();
+    $schema = new SiteSchema(SiteSchema::CONTENT_DEPLOYMENT);
+    $this->bundle_uri = $schema->bundle('entity_test', 'entity_test')->getUri();
+  }
+
+  /**
+   * Test that fields with literal values can be denormalized.
+   */
+  function testBasicDenormalize() {
+    $incoming_data = array(
+      '@type' => $this->bundle_uri,
+      'name' => array(
+        'en' => array(
+          array(
+            'value' => $this->randomName(),
+          ),
+        ),
+        'de' => array(
+          array(
+            'value' => $this->randomName(),
+          ),
+        ),
+      ),
+      'field_test_text' => array(
+        'und' => array(
+          array(
+            'value' => $this->randomName(),
+            'format' => 'full_html',
+          ),
+        ),
+      ),
+    );
+
+    // Test valid request.
+    $serializer = $this->container->get('serializer');
+    $entity = $serializer->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', $this->format);
+    $this->assertEqual('entity_test', $entity->bundle(), "Denormalize creates entity with correct bundle.");
+    $this->assertEqual($incoming_data['name']['en'], $entity->get('name')->getValue(), "Translatable field denormalized correctly in default language.");
+    $this->assertEqual($incoming_data['name']['de'], $entity->getTranslation('de')->get('name')->getValue(), "Translatable field denormalized correctly in translation language.");
+    $this->assertEqual($incoming_data['field_test_text']['und'], $entity->get('field_test_text')->getValue(), "Untranslatable field denormalized correctly.");
+
+    // Test request without @type.
+    unset($incoming_data['@type']);
+    try {
+      $serializer->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', $this->format);
+      $this->fail('Trying to denormalize entity data without @type results in exception.');
+    }
+    catch (UnexpectedValueException $e) {
+      $this->pass('Trying to denormalize entity data without @type results in exception.');
+    }
+
+    // Test request with @type that has no valid mapping.
+    $incoming_data['@type'] = 'http://failing-uri.com/type';
+    try {
+      $serializer->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', $this->format);
+      $this->fail('Trying to denormalize entity data with unrecognized @type results in exception.');
+    }
+    catch (UnexpectedValueException $e) {
+      $this->pass('Trying to denormalize entity data with unrecognized @type results in exception.');
+    }
+  }
+
+  /**
+   * Test that fields with resource values can be denormalized.
+   */
+  function testEntityReferenceDenormalize() {
+    // Configure the entity reference handlers.
+    $handler_settings = serialization_get_entityreference_handler_settings($this->entityType, $this->bundle, $this->format);
+    $uid = 1;
+    $handler_settings->setHandler('user_id', 'configured_value', array('value' => $uid));
+    $handler_settings->save();
+
+    $incoming_data = array(
+      '@type' => $this->bundle_uri,
+      'name' => array(
+        'en' => array(
+          array(
+            'value' => $this->randomName(),
+          ),
+        ),
+      ),
+      'user_id' => array(
+        'und' => array(
+          array(
+            '@id' => 'http://example.org/user/foo',
+          ),
+        ),
+      ),
+    );
+
+    // Deserialize the data.
+    $serializer = $this->container->get('serializer');
+    $entity = $serializer->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', $this->format);
+
+    // Test the configured value handler.
+    $this->assertEqual(array(array('value' => $uid)), $entity->get('user_id')->getValue(), 'The configured value entity reference handler sets field to correct value.');
+  }
+}
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/JsonldTestSetupHelper.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/JsonldTestSetupHelper.php
index d0eb0c3..8ae5a3b 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/JsonldTestSetupHelper.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/JsonldTestSetupHelper.php
@@ -8,6 +8,7 @@
 namespace Drupal\jsonld\Tests;
 
 use Drupal\Core\Cache\DatabaseBackend;
+use Drupal\Core\Language\Language;
 use Drupal\jsonld\JsonldEncoder;
 use Drupal\jsonld\JsonldEntityNormalizer;
 use Drupal\jsonld\JsonldEntityReferenceNormalizer;
@@ -15,11 +16,14 @@
 use Drupal\rdf\RdfMappingManager;
 use Drupal\rdf\EventSubscriber\MappingSubscriber;
 use Drupal\rdf\SiteSchema\SiteSchemaManager;
+use Drupal\serialization\Plugin\Type\EntityReferenceHandlerPluginManager;
 use Symfony\Component\EventDispatcher\EventDispatcher;
 use Symfony\Component\Serializer\Serializer;
 
 /**
  * Constructs services for JSON-LD tests.
+ *
+ * @todo Remove this once REST tests use DrupalUnitTestBase.
  */
 class JsonldTestSetupHelper {
 
@@ -45,6 +49,13 @@ class JsonldTestSetupHelper {
   protected $normalizers;
 
   /**
+   * The Serializer.
+   *
+   * @var \Symfony\Component\Serializer\Serializer
+   */
+  protected $serializer;
+
+  /**
    * Constructor.
    */
   public function __construct() {
@@ -60,8 +71,10 @@ public function __construct() {
       'field_item' => new JsonldFieldItemNormalizer($this->siteSchemaManager, $this->rdfMappingManager),
       'entity' => new JsonldEntityNormalizer($this->siteSchemaManager, $this->rdfMappingManager),
     );
-    $serializer = new Serializer($this->normalizers, array(new JsonldEncoder()));
-    $this->normalizers['entity']->setSerializer($serializer);
+    $this->serializer = new Serializer($this->normalizers, array(new JsonldEncoder()));
+    $this->normalizers['entity']->setSerializer($this->serializer);
+    $this->normalizers['entity']->setEntityReferenceHandlerPluginManager(new EntityReferenceHandlerPluginManager());
+
   }
 
   /**
@@ -75,6 +88,16 @@ public function getNormalizers() {
   }
 
   /**
+   * Get Serializer.
+   *
+   * @return \Symfony\Component\Serializer\Serializer
+   *   The serializer.
+   */
+  public function getSerializer() {
+    return $this->serializer;
+  }
+
+  /**
    * Get the SiteSchemaManager object.
    *
    * @return \Drupal\rdf\SiteSchema\SiteSchemaManager
@@ -93,4 +116,16 @@ public function getSiteSchemaManager() {
   public function getRdfMappingManager() {
     return $this->rdfMappingManager;
   }
+
+  /**
+   * Create a second language to use when testing multilingual values.
+   */
+  public function saveSecondLanguage() {
+    // Add German as a language.
+    $language = new Language(array(
+      'langcode' => 'de',
+      'name' => 'Deutsch',
+    ));
+    language_save($language);
+  }
 }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
index a9e057d..75edfac 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
@@ -145,6 +145,13 @@ function testDenormalize() {
     $bundle_uri = $schema->bundle('entity_test', 'entity_test')->getUri();
     $incoming_data = array(
       '@type' => $bundle_uri,
+      'user_id' => array(
+        'de' => array(
+          array(
+            '@id' => 'http://example.com/user/foo',
+          ),
+        ),
+      ),
       'name' => array(
         'en' => array(
           array(
@@ -167,12 +174,26 @@ function testDenormalize() {
       ),
     );
 
+    // Set the entity reference handlers for entity reference fields.
+    $values = array(
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'format' => static::$format,
+    );
+    $config = entity_create('entityreference_handler_settings', $values);
+    $config->setHandler('user_id', 'configured_value', array('value' => 1));
+    $config->save();
+
     // Test valid request.
     $entity = $this->normalizers['entity']->denormalize($incoming_data, 'Drupal\Core\Entity\EntityNG', static::$format);
     $this->assertEqual('entity_test', $entity->bundle(), "Denormalize creates entity with correct bundle.");
     $this->assertEqual($incoming_data['name']['en'], $entity->get('name')->getValue(), "Translatable field denormalized correctly in default language.");
     $this->assertEqual($incoming_data['name']['de'], $entity->getTranslation('de')->get('name')->getValue(), "Translatable field denormalized correctly in translation language.");
     $this->assertEqual($incoming_data['field_test_text']['und'], $entity->get('field_test_text')->getValue(), "Untranslatable field denormalized correctly.");
+    // For now, we just test that the user_id is equal to one.
+    // @todo Fix this once configured_value entity reference handler is
+    // enhanced.
+    $this->assertEqual(array(array('value' => 1)), $entity->getTranslation('de')->get('user_id')->getValue(), "Entity reference field denormalized correctly.");
 
     // Test request without @type.
     unset($incoming_data['@type']);
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeTest.php
new file mode 100644
index 0000000..f8f8f59
--- /dev/null
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeTest.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\jsonld\Tests\NormalizeTest.
+ */
+
+namespace Drupal\jsonld\Tests;
+
+/**
+ * Test the vendor specific JSON-LD normalizer.
+ */
+class NormalizeTest extends NormalizerTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Normalize Test',
+      'description' => 'Test that entities can be normalized in JSON-LD.',
+      'group' => 'JSON-LD',
+    );
+  }
+
+  /**
+   * Tests the normalize function.
+   */
+  public function testNormalize() {
+    // Create a German entity.
+    $values = array(
+      'langcode' => 'de',
+      'name' => $this->randomName(),
+      'user_id' => 1,
+      'field_test_text' => array(
+        'value' => $this->randomName(),
+        'format' => 'full_html',
+      ),
+    );
+    // Array of translated values.
+    $translationValues = array(
+      'name' => $this->randomName(),
+    );
+
+    $entity = entity_create('entity_test', $values);
+    $entity->save();
+    // Add an English value for name property.
+    $entity->getTranslation('en')->set('name', array(0 => array('value' => $translationValues['name'])));
+
+    $expectedArray = array(
+      '@id' => $this->getEntityId($entity),
+      'uuid' => array(
+        'und' => array(
+          array(
+            'value' => $entity->uuid(),
+          ),
+        ),
+      ),
+      'user_id' => array(
+        'de' => array(
+          array(
+            '@id' => url('user/' . $values['user_id'], array('absolute' => TRUE)),
+          ),
+        ),
+      ),
+      'name' => array(
+        'de' => array(
+          array(
+            'value' => $values['name'],
+          ),
+        ),
+        'en' => array(
+          array(
+            'value' => $translationValues['name'],
+          ),
+        ),
+      ),
+      'field_test_text' => array(
+        'und' => array(
+          array(
+            'value' => $values['field_test_text']['value'],
+            'format' => $values['field_test_text']['format'],
+          ),
+        ),
+      ),
+    );
+
+    $normalized = $this->container->get('serializer')->normalize($entity, $this->format);
+    // Test ordering. The @context and @id properties should always be first.
+    $keys = array_keys($normalized);
+    $this->assertEqual($keys[0], '@id', '@id and @context attributes placed correctly.');
+    // Test @id value.
+    $this->assertEqual($normalized['@id'], $expectedArray['@id'], '@id uses correct value.');
+    // Test non-translatable field.
+    $this->assertEqual($normalized['uuid'], $expectedArray['uuid'], 'Non-translatable fields are nested correctly.');
+    // Test single-language translatable.
+    $this->assertEqual($normalized['user_id'], $expectedArray['user_id'], 'Translatable field with single language value is nested correctly.');
+    // Test multi-language translatable.
+    $this->assertEqual($normalized['name'], $expectedArray['name'], 'Translatable field with multiple language values is nested correctly.');
+    // Test multi-property untranslatable field.
+    $this->assertEqual($normalized['field_test_text'], $expectedArray['field_test_text'], 'Field with properties is nested correctly.');
+  }
+
+  /**
+   * Get the Entity ID.
+   *
+   * @param \Drupal\Core\Entity\EntityNG $entity
+   *   Entity to get URI for.
+   *
+   * @return string
+   *   Return the entity URI.
+   */
+  protected function getEntityId($entity) {
+    global $base_url;
+    $uriInfo = $entity->uri();
+    return $base_url . '/' . $uriInfo['path'];
+  }
+
+}
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizerTestBase.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizerTestBase.php
new file mode 100644
index 0000000..4b5cd8b
--- /dev/null
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizerTestBase.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\jsonld\Tests\NormalizerTestBase.
+ */
+
+namespace Drupal\jsonld\Tests;
+
+use Drupal\Core\Language\Language;
+use Drupal\rdf\SiteSchema\SiteSchema;
+use Drupal\simpletest\DrupalUnitTestBase;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Serializer\Exception\UnexpectedValueException;
+
+/**
+ * Test the vendor specific JSON-LD normalizer.
+ *
+ * This is implemented as a WebTest because it requires use of the Entity API.
+ */
+abstract class NormalizerTestBase extends DrupalUnitTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('field', 'field_sql_storage', 'language', 'system', 'text', 'serialization');
+
+  /**
+   * The entity type used for testing.
+   *
+   * @var string
+   */
+  protected $entityType = 'entity_test';
+
+  /**
+   * The bundle used for testing.
+   *
+   * @var string
+   */
+  protected $bundle = 'entity_test';
+
+  /**
+   * The format being tested.
+   */
+  protected $format = 'drupal_jsonld';
+
+  /**
+   * Overrides \Drupal\simpletest\DrupalUnitTestBase::setup().
+   */
+  function setUp() {
+    parent::setUp();
+    $this->installSchema('system', 'variable');
+    $this->installSchema('system', 'url_alias');
+    $this->installSchema('field', 'field_config');
+    $this->installSchema('field', 'field_config_instance');
+
+    // English must be added before entity_test is enabled.
+    $this->enableModules(array('language'));
+    $english = new Language(array(
+      'langcode' => 'en',
+      'name' => 'English',
+    ));
+    language_save($english);
+    // Add German as a language.
+    $german = new Language(array(
+      'langcode' => 'de',
+      'name' => 'Deutsch',
+    ));
+    language_save($german);
+
+    $this->enableModules(array('entity_test', 'serialization', 'rdf', 'jsonld', 'user'));
+  }
+
+}
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
index 38cee8a..5e5698b 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
@@ -8,24 +8,12 @@
 namespace Drupal\jsonld\Tests;
 
 use Drupal\config\Tests\ConfigEntityTest;
-use Drupal\simpletest\WebTestBase;
+use Drupal\jsonld\Tests\NormalizerTestBase;
 
 /**
  * Test the vendor specific JSON-LD normalizer.
  */
-class SupportsSerializationTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('entity_test', 'jsonld');
-
-  /**
-   * The format being tested.
-   */
-  protected static $format = 'drupal_jsonld';
+class SupportsSerializationTest extends NormalizerTestBase {
 
   /**
    * The Normalizers to be tested.
@@ -54,28 +42,28 @@ function setUp() {
    * Tests the supportsNormalization function.
    */
   public function testSupportsNormalization() {
-    $format = static::$format;
+    $format = $this->format;
     $supportedEntity = entity_create('entity_test', array());
     $unsupportedEntity = new ConfigEntityTest();
     $field = $supportedEntity->get('uuid');
     $entityreferenceField = $supportedEntity->get('user_id');
 
     // Supported entity.
-    $this->assertTrue($this->normalizers['entity']->supportsNormalization($supportedEntity, static::$format), "Entity normalization is supported for $format on content entities.");
+    $this->assertTrue($this->normalizers['entity']->supportsNormalization($supportedEntity, $format), "Entity normalization is supported for $format on content entities.");
     // Unsupported entity.
-    $this->assertFalse($this->normalizers['entity']->supportsNormalization($unsupportedEntity, static::$format), "Normalization is not supported for other entity types.");
+    $this->assertFalse($this->normalizers['entity']->supportsNormalization($unsupportedEntity, $format), "Normalization is not supported for other entity types.");
 
     // Field item.
-    $this->assertTrue($this->normalizers['field_item']->supportsNormalization($field->offsetGet(0), static::$format), "Field item normalization is supported for $format.");
+    $this->assertTrue($this->normalizers['field_item']->supportsNormalization($field->offsetGet(0), $format), "Field item normalization is supported for $format.");
     // Entity reference field item.
-    $this->assertTrue($this->normalizers['entityreference']->supportsNormalization($entityreferenceField->offsetGet(0), static::$format), "Entity reference field item normalization is supported for $format.");
+    $this->assertTrue($this->normalizers['entityreference']->supportsNormalization($entityreferenceField->offsetGet(0), $format), "Entity reference field item normalization is supported for $format.");
   }
 
   /**
    * Tests the supportsDenormalization function.
    */
   public function testSupportsDenormalization() {
-    $format = static::$format;
+    $format = $this->format;
     $data = array();
     $supportedEntityClass = 'Drupal\Core\Entity\EntityNG';
     $unsupportedEntityClass = 'Drupal\config\Tests\ConfigEntityTest';
@@ -83,14 +71,14 @@ public function testSupportsDenormalization() {
     $entityreferenceFieldClass = 'Drupal\Core\Entity\Field\Type\EntityReferenceItem';
 
     // Supported entity.
-    $this->assertTrue($this->normalizers['entity']->supportsDenormalization($data, $supportedEntityClass, static::$format), "Entity denormalization is supported for $format on content entities.");
+    $this->assertTrue($this->normalizers['entity']->supportsDenormalization($data, $supportedEntityClass, $format), "Entity denormalization is supported for $format on content entities.");
     // Unsupported entity.
-    $this->assertFalse($this->normalizers['entity']->supportsDenormalization($data, $unsupportedEntityClass, static::$format), "Denormalization is not supported for other entity types.");
+    $this->assertFalse($this->normalizers['entity']->supportsDenormalization($data, $unsupportedEntityClass, $format), "Denormalization is not supported for other entity types.");
 
     // Field item.
-    $this->assertTrue($this->normalizers['field_item']->supportsDenormalization($data, $fieldClass, static::$format), "Field item denormalization is supported for $format.");
+    $this->assertTrue($this->normalizers['field_item']->supportsDenormalization($data, $fieldClass, $format), "Field item denormalization is supported for $format.");
     // Entity reference field item.
-    $this->assertTrue($this->normalizers['entityreference']->supportsDenormalization($data, $entityreferenceFieldClass, static::$format), "Entity reference field item denormalization is supported for $format.");
+    $this->assertTrue($this->normalizers['entityreference']->supportsDenormalization($data, $entityreferenceFieldClass, $format), "Entity reference field item denormalization is supported for $format.");
   }
 
 }
diff --git a/core/modules/rest/lib/Drupal/rest/Tests/CreateTest.php b/core/modules/rest/lib/Drupal/rest/Tests/CreateTest.php
index c5b298a..cb35d69 100644
--- a/core/modules/rest/lib/Drupal/rest/Tests/CreateTest.php
+++ b/core/modules/rest/lib/Drupal/rest/Tests/CreateTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\rest\Tests;
 
+use Drupal\jsonld\Tests\JsonldTestSetupHelper;
 use Drupal\rest\Tests\RESTTestBase;
 
 /**
@@ -33,12 +34,16 @@ public static function getInfo() {
    * Tests several valid and invalid create requests on all entity types.
    */
   public function testCreate() {
-    $serializer = drupal_container()->get('serializer');
+    // Get the mock Serializer.
+    $jsonld_setup_helper = new JsonldTestSetupHelper();
+    $serializer = $jsonld_setup_helper->getSerializer();
+
     // @todo once EntityNG is implemented for other entity types test all other
     // entity types here as well.
     $entity_type = 'entity_test';
 
     $this->enableService('entity:' . $entity_type);
+    $this->setupEntityReferenceHandlers();
     // Create a user account that has the required permissions to create
     // resources via the web API.
     $account = $this->drupalCreateUser(array('restful post entity:' . $entity_type));
@@ -59,9 +64,6 @@ public function testCreate() {
     $loaded_entity = entity_load($entity_type, $id);
     $this->assertNotIdentical(FALSE, $loaded_entity, 'The new ' . $entity_type . ' was found in the database.');
     $this->assertEqual($entity->uuid(), $loaded_entity->uuid(), 'UUID of created entity is correct.');
-    // @todo Remove the user reference field for now until deserialization for
-    // entity references is implemented.
-    unset($entity_values['user_id']);
     foreach ($entity_values as $property => $value) {
       $actual_value = $loaded_entity->get($property)->value;
       $send_value = $entity->get($property)->value;
diff --git a/core/modules/rest/lib/Drupal/rest/Tests/RESTTestBase.php b/core/modules/rest/lib/Drupal/rest/Tests/RESTTestBase.php
index f7dbdb6..0d763fb 100644
--- a/core/modules/rest/lib/Drupal/rest/Tests/RESTTestBase.php
+++ b/core/modules/rest/lib/Drupal/rest/Tests/RESTTestBase.php
@@ -151,6 +151,21 @@ protected function entityValues($entity_type) {
   }
 
   /**
+   * Saves configuration for entity reference handlers for deserialization.
+   */
+  protected function setupEntityReferenceHandlers() {
+    // Set up the Entity Reference Handler for user_id field.
+    $values = array(
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'format' => 'drupal_jsonld',
+    );
+    $config = entity_create('entityreference_handler_settings', $values);
+    $config->setHandler('user_id', 'configured_value', array('value' => 1));
+    $config->save();
+  }
+
+  /**
    * Enables the web service interface for a specific entity type.
    *
    * @param string|FALSE $resource_type
diff --git a/core/modules/rest/lib/Drupal/rest/Tests/UpdateTest.php b/core/modules/rest/lib/Drupal/rest/Tests/UpdateTest.php
index fa65a2f..129d8e2 100644
--- a/core/modules/rest/lib/Drupal/rest/Tests/UpdateTest.php
+++ b/core/modules/rest/lib/Drupal/rest/Tests/UpdateTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\rest\Tests;
 
+use Drupal\jsonld\Tests\JsonldTestSetupHelper;
 use Drupal\rest\Tests\RESTTestBase;
 
 /**
@@ -33,12 +34,15 @@ public static function getInfo() {
    * Tests several valid and invalid partial update requests on test entities.
    */
   public function testPatchUpdate() {
-    $serializer = drupal_container()->get('serializer');
+    // Get the mock Serializer.
+    $jsonld_setup_helper = new JsonldTestSetupHelper();
+    $serializer = $jsonld_setup_helper->getSerializer();
     // @todo once EntityNG is implemented for other entity types test all other
     // entity types here as well.
     $entity_type = 'entity_test';
 
     $this->enableService('entity:' . $entity_type);
+    $this->setupEntityReferenceHandlers();
     // Create a user account that has the required permissions to create
     // resources via the web API.
     $account = $this->drupalCreateUser(array('restful patch entity:' . $entity_type));
@@ -98,12 +102,15 @@ public function testPatchUpdate() {
    * Tests several valid and invalid PUT update requests on test entities.
    */
   public function testPutUpdate() {
-    $serializer = drupal_container()->get('serializer');
+    // Get the mock Serializer.
+    $jsonld_setup_helper = new JsonldTestSetupHelper();
+    $serializer = $jsonld_setup_helper->getSerializer();
     // @todo once EntityNG is implemented for other entity types test all other
     // entity types here as well.
     $entity_type = 'entity_test';
 
     $this->enableService('entity:' . $entity_type);
+    $this->setupEntityReferenceHandlers();
     // Create a user account that has the required permissions to create
     // resources via the web API.
     $account = $this->drupalCreateUser(array('restful put entity:' . $entity_type));
@@ -127,9 +134,6 @@ public function testPutUpdate() {
 
     // Re-load the updated entity from the database.
     $entity = entity_load($entity_type, $entity->id(), TRUE);
-    // @todo Don't check the user reference field for now until deserialization
-    // for entity references is implemented.
-    unset($update_values['user_id']);
     foreach ($update_values as $property => $value) {
       $update_value = $update_entity->{$property}->value;
       $stored_value = $entity->{$property}->value;
diff --git a/core/modules/rest/rest.info b/core/modules/rest/rest.info
index c0bf4bd..c450567 100644
--- a/core/modules/rest/rest.info
+++ b/core/modules/rest/rest.info
@@ -5,4 +5,5 @@ version = VERSION
 core = 8.x
 ; @todo Remove this dependency once hard coding to JSON-LD is gone.
 dependencies[] = jsonld
+dependencies[] = serialization
 configure = admin/config/services/rest
diff --git a/core/lib/Drupal/Core/Serialization/JsonEncoder.php b/core/modules/serialization/lib/Drupal/serialization/Encoder/JsonEncoder.php
similarity index 86%
rename from core/lib/Drupal/Core/Serialization/JsonEncoder.php
rename to core/modules/serialization/lib/Drupal/serialization/Encoder/JsonEncoder.php
index 8d7e3d7..35898a7 100644
--- a/core/lib/Drupal/Core/Serialization/JsonEncoder.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Encoder/JsonEncoder.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains Drupal\Core\Serialization\JsonEncoder.
+ * Contains \Drupal\serialization\Encoder\JsonEncoder.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Encoder;
 
 use Symfony\Component\Serializer\Encoder\EncoderInterface;
 use Symfony\Component\Serializer\Encoder\JsonEncoder as BaseJsonEncoder;
diff --git a/core/lib/Drupal/Core/Serialization/XmlEncoder.php b/core/modules/serialization/lib/Drupal/serialization/Encoder/XmlEncoder.php
similarity index 95%
rename from core/lib/Drupal/Core/Serialization/XmlEncoder.php
rename to core/modules/serialization/lib/Drupal/serialization/Encoder/XmlEncoder.php
index d79a6d9..1f25389 100644
--- a/core/lib/Drupal/Core/Serialization/XmlEncoder.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Encoder/XmlEncoder.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Serialization\XmlEncoder.
+ * Contains \Drupal\serialization\Encoder\XmlEncoder.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Encoder;
 
 use Symfony\Component\Serializer\Encoder\EncoderInterface;
 use Symfony\Component\Serializer\Encoder\DecoderInterface;
diff --git a/core/lib/Drupal/Core/Serialization/ComplexDataNormalizer.php b/core/modules/serialization/lib/Drupal/serialization/Normalizer/ComplexDataNormalizer.php
similarity index 89%
rename from core/lib/Drupal/Core/Serialization/ComplexDataNormalizer.php
rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/ComplexDataNormalizer.php
index 642352d..456cc0e 100644
--- a/core/lib/Drupal/Core/Serialization/ComplexDataNormalizer.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/ComplexDataNormalizer.php
@@ -2,12 +2,11 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Serialization\ComplexDataNormalizer.
+ * Contains \Drupal\serialization\Normalizer\ComplexDataNormalizer.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Normalizer;
 
-use Drupal\Core\Serialization\NormalizerBase;
 use Symfony\Component\Serializer\Exception\RuntimeException;
 
 /**
diff --git a/core/lib/Drupal/Core/Serialization/ListNormalizer.php b/core/modules/serialization/lib/Drupal/serialization/Normalizer/ListNormalizer.php
similarity index 88%
rename from core/lib/Drupal/Core/Serialization/ListNormalizer.php
rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/ListNormalizer.php
index d590b7b..32c3f68 100644
--- a/core/lib/Drupal/Core/Serialization/ListNormalizer.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/ListNormalizer.php
@@ -2,12 +2,11 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Serialization\ListNormalizer.
+ * Contains \Drupal\serialization\Normalizer\ListNormalizer.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Normalizer;
 
-use Drupal\Core\Serialization\NormalizerBase;
 use Symfony\Component\Serializer\Exception\RuntimeException;
 
 /**
diff --git a/core/lib/Drupal/Core/Serialization/NormalizerBase.php b/core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
similarity index 65%
rename from core/lib/Drupal/Core/Serialization/NormalizerBase.php
rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
index f256b0e..f293781 100644
--- a/core/lib/Drupal/Core/Serialization/NormalizerBase.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
@@ -2,12 +2,12 @@
 
 /**
  * @file
- * Contains Drupal\Core\Serialization\NormalizerBase.
+ * Contains \Drupal\serialization\Normalizer\NormalizerBase.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Normalizer;
 
-use Drupal\Core\Entity\EntityInterface;
+use Drupal\serialization\Plugin\Type\EntityReferenceHandlerPluginManager;
 use Symfony\Component\Serializer\Exception\RuntimeException;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
@@ -24,6 +24,8 @@
    */
   protected static $supportedInterfaceOrClass;
 
+  protected $entityReferenceHandlerPluginManager;
+
   /**
    * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::supportsNormalization().
    */
@@ -31,4 +33,8 @@ public function supportsNormalization($data, $format = NULL) {
     return is_object($data) && ($data instanceof static::$supportedInterfaceOrClass);
   }
 
+  public function setEntityReferenceHandlerPluginManager(EntityReferenceHandlerPluginManager $plugin_manager) {
+    $this->entityReferenceHandlerPluginManager = $plugin_manager;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Serialization/TypedDataNormalizer.php b/core/modules/serialization/lib/Drupal/serialization/Normalizer/TypedDataNormalizer.php
similarity index 80%
rename from core/lib/Drupal/Core/Serialization/TypedDataNormalizer.php
rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/TypedDataNormalizer.php
index cf2a879..38e9505 100644
--- a/core/lib/Drupal/Core/Serialization/TypedDataNormalizer.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/TypedDataNormalizer.php
@@ -2,12 +2,11 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Serialization\TypedDataNormalizer.
+ * Contains \Drupal\serialization\Normalizer\TypedDataNormalizer.
  */
 
-namespace Drupal\Core\Serialization;
+namespace Drupal\serialization\Normalizer;
 
-use Drupal\Core\Serialization\NormalizerBase;
 use Symfony\Component\Serializer\Exception\RuntimeException;
 
 /**
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/Core/Entity/EntityReferenceHandlerSettings.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/Core/Entity/EntityReferenceHandlerSettings.php
new file mode 100644
index 0000000..405bf12
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/Core/Entity/EntityReferenceHandlerSettings.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * @file
+ * Contains Drupal/serialization/Plugin/Core/Entity/EntityReferenceHandlerSettings
+ */
+
+namespace Drupal\serialization\Plugin\Core\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Configuration entity specifying how entity references should be imported.
+ *
+ * @Plugin(
+ *   id = "entityreference_handler_settings",
+ *   label = @Translation("Entity reference handler settings"),
+ *   module = "serialization",
+ *   controller_class = "Drupal\Core\Config\Entity\ConfigStorageController",
+ *   config_prefix = "serialization.entityreference",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "uuid" = "uuid"
+ *   }
+ * )
+ */
+class EntityReferenceHandlerSettings extends ConfigEntityBase {
+
+  /**
+   * Unique ID for the config entity.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * Unique UUID for the config entity.
+   *
+   * @var string
+   */
+  public $uuid;
+
+  /**
+   * Entity type to be deserialized.
+   *
+   * @var string
+   */
+  public $targetEntityType;
+
+  /**
+   * Bundle to be deserialized.
+   *
+   * @var string
+   */
+  public $bundle;
+
+  /**
+   * The short name of the serialization format.
+   *
+   * @var string
+   */
+  public $format;
+
+  /**
+   * List of entity reference field handlers, keyed by format and field name.
+   *
+   * @var array
+   */
+  public $entityreferenceHandlers = array();
+
+  /**
+   * Overrides \Drupal\Core\Entity\Entity::id().
+   */
+  public function id() {
+    return $this->targetEntityType . '.' . $this->bundle . '.' . $this->format;
+  }
+
+  /**
+   * Overrides \Drupal\config\ConfigEntityBase::save().
+   */
+  public function save() {
+    // Build an ID if none is set.
+    if (empty($this->id)) {
+      $this->id = $this->id();
+    }
+    return parent::save();
+  }
+
+  /**
+   * Sets the Entity Reference Handler to use when deserializing this field.
+   *
+   * @param $field_name
+   *   Name of the field which the handler will handle.
+   * @param $handler_name
+   *   The plugin id of the handler.
+   * @param $settings
+   *   The settings to use when creating a handler plugin instance.
+   */
+  public function setHandler($field_name, $handler_name, array $settings = array()) {
+    $this->entityreferenceHandlers[$field_name] = array(
+      'plugin_id' => $handler_name,
+      'settings' => $settings,
+    );
+  }
+
+  /**
+   * Gets the Entity Reference Handler to use when deserializing this field.
+   *
+   * @param $field_name
+   *   Name of the field which the handler will handle.
+   *
+   * @return string
+   *   The plugin id of the handler.
+   */
+  public function getHandler($field_name) {
+    if (isset($this->entityreferenceHandlers[$field_name])) {
+      return $this->entityreferenceHandlers[$field_name];
+    }
+    else {
+      // For now, return configured_value plugin whenever it isn't specified.
+      // @todo Make it possible to configure a default per format.
+      return array(
+        'plugin_id' => 'configured_value',
+        'settings' => array(
+          'value' => NULL,
+        )
+      );
+      //return FALSE;
+    }
+  }
+
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerBase.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerBase.php
new file mode 100644
index 0000000..5104269
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerBase.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\serialization\Plugin\EntityReferenceHandlerBase.
+ */
+
+namespace Drupal\serialization\Plugin;
+
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\serialization\Plugin\EntityReferenceHandlerInterface;
+
+/**
+ * Base class for entity reference handlers.
+ */
+abstract class EntityReferenceHandlerBase extends PluginBase implements EntityReferenceHandlerInterface {
+
+  /**
+   * Whether default settings have been merged into the current $settings.
+   *
+   * @var bool
+   */
+  protected $defaultSettingsMerged = FALSE;
+
+  /**
+   * Returns the value of a setting, or its default value if absent.
+   *
+   * @param string $key
+   *   The setting name.
+   *
+   * @return mixed
+   *   The setting value.
+   */
+  public function getSetting($key) {
+    // Merge defaults if we have no value for the key.
+    if (!$this->defaultSettingsMerged && !array_key_exists($key, $this->configuration)) {
+      $this->mergeDefaults();
+    }
+    return isset($this->configuration[$key]) ? $this->configuration[$key] : NULL;
+  }
+
+  /**
+   * Merges default settings values into the configuration passed in.
+   */
+  protected function mergeDefaults() {
+    $this->configuration += $this->getDefaultSettings();
+    $this->defaultSettingsMerged = TRUE;
+  }
+
+  /**
+   * Returns the default settings for the plugin.
+   *
+   * @return array
+   *   The array of default setting values, keyed by setting names.
+   */
+  public function getDefaultSettings() {
+    $definition = $this->getDefinition();
+    return $definition['settings'];
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerInterface.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerInterface.php
new file mode 100644
index 0000000..fc2cf8c
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/EntityReferenceHandlerInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\serialization\Plugin\EntityReferenceHandlerInterface;
+ */
+
+namespace Drupal\serialization\Plugin;
+
+/**
+ * Specifies the public methods of an entity reference handler plugin.
+ */
+interface EntityReferenceHandlerInterface {
+
+  /**
+   * Get the entity ID of the referenced entity.
+   *
+   * @return int
+   */
+  public function getEntityId($data, $format, $serializer);
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/Type/EntityReferenceHandlerPluginManager.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/Type/EntityReferenceHandlerPluginManager.php
new file mode 100644
index 0000000..02a01f2
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/Type/EntityReferenceHandlerPluginManager.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal/serialization/Plugin/Type/EntityReferenceHandlerPluginManager
+ */
+
+namespace Drupal\serialization\Plugin\Type;
+
+use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+
+/**
+ * Defines the plugin manager for Entity Reference Handler plugins.
+ */
+class EntityReferenceHandlerPluginManager extends PluginManagerBase {
+
+  /**
+   * Overrides Drupal\Component\Plugin\PluginManagerBase::__construct().
+   */
+  public function __construct() {
+    $this->discovery = new AnnotatedClassDiscovery('serialization', 'entityreference_handler');
+    $this->factory = new DefaultFactory($this);
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/ConfiguredValue.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/ConfiguredValue.php
new file mode 100644
index 0000000..f0b5daa
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/ConfiguredValue.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal/rest/Plugin/rest/entityreference_handler/ConfiguredValue
+ */
+
+namespace Drupal\serialization\Plugin\serialization\entityreference_handler;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\serialization\Plugin\EntityReferenceHandlerBase;
+
+/**
+ * Provides an entity reference handler for using a configured value.
+ *
+ * @Plugin(
+ *   id = "configured_value",
+ *   label = @Translation("URI Dereference"),
+ *   settings = {
+ *     "value" = NULL
+ *   }
+ * )
+ */
+class ConfiguredValue extends EntityReferenceHandlerBase {
+
+  /**
+   * Implements EntityReferenceHandlerInterface::getEntityId()
+   */
+  public function getEntityId($data, $format, $serializer) {
+    return $this->getSetting('value');
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/UriDereference.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/UriDereference.php
new file mode 100644
index 0000000..cb6b9e6
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/UriDereference.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal/rest/Plugin/rest/entityreference_handler/UriDereference
+ */
+
+namespace Drupal\serialization\Plugin\serialization\entityreference_handler;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\serialization\Plugin\EntityReferenceHandlerBase;
+
+/**
+ * Provides an entity reference handler for dereferencing URIs.
+ *
+ * @Plugin(
+ *   id = "uri_dereference",
+ *   label = @Translation("URI Dereference"),
+ *   settings = {
+ *     "uri_key" = "uri"
+ *   }
+ * )
+ */
+class UriDereference extends EntityReferenceHandlerBase {
+  public function getEntityId($data, $format, $serializer) {
+    // Determine which attribute holds the URI.
+    $uri_key = $this->getSetting('uri_key');
+    // Get the data from that URI and decode it.
+    $response = $this->request($data[$uri_key], $format);
+    $response_data = $serializer->decode($response->getBody(TRUE), $format);
+
+    // @todo Being able to set the UUID like this depends on the UUID being a
+    // top level property in the entity representation. This might not be the
+    // case in some  formats. This would be handled by the Normalizer if we
+    // were using a recursive denormalization strategy.
+    $uuid = $response_data['uuid'];
+    while (is_array($uuid)) {
+      $uuid = reset($uuid);
+    }
+
+    $entity = entity_load_by_uuid($this->getSetting('target_entity_type'), $uuid);
+    return $entity->id();
+  }
+
+  protected function request($url, $format) {
+    $mimetype = drupal_container()->get('request')->getMimeType($format);
+    $request = drupal_container()->get('http_default_client')->get($url);
+    $request->setHeader('Accept', $mimetype);
+
+    try {
+      $response = $request->send();
+    }
+    catch (BadResponseException $e) {
+      // @todo Figure out what to do.
+    }
+    if ($response->getStatusCode() != 200) {
+      // @todo Figure out what to do.
+    }
+
+    return $response;
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/Uuid.php b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/Uuid.php
new file mode 100644
index 0000000..34b43f1
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Plugin/serialization/entityreference_handler/Uuid.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\serialization\Plugin\serialization\entityreference_handler/Uuid
+ */
+
+namespace Drupal\serialization\Plugin\serialization\entityreference_handler;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\serialization\Plugin\EntityReferenceHandlerBase;
+
+/**
+ * Provides an entity reference handler for matching based on UUID.
+ *
+ * @Plugin(
+ *   id = "uuid",
+ *   label = @Translation("URI Dereference"),
+ *   settings = {
+ *     "uuid_key" = "uuid"
+ *   }
+ * )
+ */
+class Uuid extends EntityReferenceHandlerBase {
+
+  /**
+   * Implements EntityReferenceHandlerInterface::getEntityId()
+   */
+  public function getEntityId($data, $format, $serializer) {
+    // Determine which attribute holds the UUID.
+    $uuid_key = $this->getSetting('uuid_key');
+    $uuid = $data[$uuid_key];
+    while (is_array($uuid)) {
+      $uuid = reset($uuid);
+    }
+
+    $entity = entity_load_by_uuid($this->getSetting('target_entity_type'), $uuid);
+    return $entity->id();
+  }
+
+}
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php b/core/modules/serialization/lib/Drupal/serialization/RegisterSerializationClassesCompilerPass.php
similarity index 92%
rename from core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php
rename to core/modules/serialization/lib/Drupal/serialization/RegisterSerializationClassesCompilerPass.php
index bb5914d..e48af2e 100644
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php
+++ b/core/modules/serialization/lib/Drupal/serialization/RegisterSerializationClassesCompilerPass.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains Drupal\serialization\RegisterSerializationClassesPass.
+ * Contains \Drupal\serialization\RegisterSerializationClassesCompilerPass.
  */
 
-namespace Drupal\Core\DependencyInjection\Compiler;
+namespace Drupal\serialization;
 
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -14,7 +14,7 @@
 /**
  * Adds services tagged 'normalizer' and 'encoder' to the Serializer.
  */
-class RegisterSerializationClassesPass implements CompilerPassInterface {
+class RegisterSerializationClassesCompilerPass implements CompilerPassInterface {
 
   /**
    * Adds services to the Serializer.
diff --git a/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
new file mode 100644
index 0000000..90db371
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\serialization\SerializationBundle.
+ */
+
+namespace Drupal\serialization;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Serialization dependency injection container.
+ */
+class SerializationBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    // Register the entity reference handler plugin manager class.
+    $container->register('plugin.manager.serialization.entityreference_handler', 'Drupal\serialization\Plugin\Type\EntityReferenceHandlerPluginManager');
+    // Add Serializer with arguments to be replaced in the compiler pass.
+    $container->register('serializer', 'Symfony\Component\Serializer\Serializer')
+      ->addArgument(array())
+      ->addArgument(array());
+
+    $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');
+
+    $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 a compiler pass for adding Normalizers and Encoders to Serializer.
+    $container->addCompilerPass(new RegisterSerializationClassesCompilerPass());
+  }
+}
diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/EntityReferenceHandlerSettingsTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntityReferenceHandlerSettingsTest.php
new file mode 100644
index 0000000..26ca72e
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntityReferenceHandlerSettingsTest.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\serialization\Tests\EntityReferenceHandlerSettingsTest
+ */
+
+namespace Drupal\serialization\Tests;
+
+use Drupal\serialization\Plugin\serialization\entityreference_handler\ConfiguredValue;
+use Drupal\simpletest\DrupalUnitTestBase;
+
+class EntityReferenceHandlerSettingsTest extends DrupalUnitTestBase {
+
+  public static $modules = array('entity', 'serialization');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Reference Deserialize Settings Test',
+      'description' => "Tests the Entity Reference Deserialize Settings config object.",
+      'group' => 'Serialization',
+    );
+  }
+
+  public function testSetGet() {
+    $values = array(
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'format' => 'drupal_jsonld',
+    );
+    $id = implode('.', $values);
+    $config = entity_create('entityreference_handler_settings', $values);
+    $config->setHandler('user_id', 'configured_value', array('value' => 1));
+    $config->save();
+
+    $loadedConfig = entity_load('entityreference_handler_settings', $id);
+    // Test that setHandler works.
+    $expected = array (
+      'user_id' => array(
+        'plugin_id' => 'configured_value',
+        'settings' => array(
+          'value' => 1,
+        ),
+      ),
+    );
+    $this->assertEqual($expected, $loadedConfig->get('entityreferenceHandlers'), 'setHandler() sets the appropriate handler.');
+
+    // Test that getHandler works.
+    $handler = $loadedConfig->getHandler('user_id');
+    $this->assertEqual($handler, $expected['user_id'], 'getHandler() returns the handler name.');
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
similarity index 94%
rename from core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
rename to core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
index 89fa5ce..d5dc025 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php
@@ -2,16 +2,16 @@
 
 /**
  * @file
- * Contains \Drupal\system\Tests\Serialization\EntitySerializationTest.
+ * Contains \Drupal\serialization\Tests\EntitySerializationTest.
  */
 
-namespace Drupal\system\Tests\Serialization;
+namespace Drupal\serialization\Tests;
 
+use Drupal\serialization\Encoder\JsonEncoder;
+use Drupal\serialization\Normalizer\ComplexDataNormalizer;
+use Drupal\serialization\Normalizer\TypedDataNormalizer;
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\Serializer\Serializer;
-use Drupal\Core\Serialization\JsonEncoder;
-use Drupal\Core\Serialization\ComplexDataNormalizer;
-use Drupal\Core\Serialization\TypedDataNormalizer;
 
 /**
  * Tests entity normalization and serialization of supported core formats.
@@ -23,7 +23,7 @@ class EntitySerializationTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('entity_test');
+  public static $modules = array('entity_test', 'serialization');
 
   /**
    * The test values.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/SerializationTest.php
similarity index 86%
rename from core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
rename to core/modules/serialization/lib/Drupal/serialization/Tests/SerializationTest.php
index 0a69208..e0c62cd 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Tests/SerializationTest.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Serialization\SerializationTest.
+ * Contains \Drupal\serialization\Tests\SerializationTest.
  */
 
-namespace Drupal\system\Tests\Serialization;
+namespace Drupal\serialization\Tests;
 
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\Serializer\Exception\UnexpectedValueException;
@@ -17,12 +17,12 @@ class SerializationTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('serialization_test');
+  public static $modules = array('serialization', 'serialization_test');
 
   /**
    * The serializer service to test.
    *
-   * @var Symfony\Component\Serializer\SerializerInterface
+   * @var \Symfony\Component\Serializer\SerializerInterface
    */
   protected $serializer;
 
diff --git a/core/modules/serialization/serialization.info b/core/modules/serialization/serialization.info
new file mode 100644
index 0000000..9ae7649
--- /dev/null
+++ b/core/modules/serialization/serialization.info
@@ -0,0 +1,4 @@
+name = Serialization
+description = Provides a service for (de)serializing data to/from formats such as JSON and XML
+package = Core
+core = 8.x
diff --git a/core/modules/serialization/serialization.module b/core/modules/serialization/serialization.module
new file mode 100644
index 0000000..105a731
--- /dev/null
+++ b/core/modules/serialization/serialization.module
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ * Manage the serialization system.
+ *
+ * The module is mostly an anchor point for configuration items owned by the
+ * serialization system.
+ */
+
+/**
+ * Get the entity reference handler settings for a bundle in a format.
+ *
+ * @param $entity_type
+ *   The entity type of the bundle.
+ * @param $bundle
+ *   The bundle.
+ * @param $format
+ *   The format of the data being deserialzed.
+ *
+ * @return Drupal\serialization\Plugin\Core\Entity\EntityReferenceDeserializeSettings
+ *   The config object.
+ */
+function serialization_get_entityreference_handler_settings($entity_type, $bundle, $format) {
+  // Try loading the settings from configuration.
+  $settings = entity_load('entityreference_handler_settings', $entity_type . '.' . $bundle . '.' . $format);
+
+  // If not found, create a fresh config object.
+  if (!$settings) {
+    $settings = entity_create('entityreference_handler_settings', array(
+      'targetEntityType' => $entity_type,
+      'bundle' => $bundle,
+      'format' => $format,
+    ));
+  }
+
+  return $settings;
+}
diff --git a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
similarity index 87%
rename from core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
rename to core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
index 83be4ff..ab9f0f1 100644
--- a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
+++ b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
@@ -2,14 +2,13 @@
 
 /**
  * @file
- * Definition of Drupal\serialization_test\SerializationTestBundle.
+ * Contains \Drupal\serialization_test\SerializationTestBundle.
  */
 
 namespace Drupal\serialization_test;
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\HttpKernel\Bundle\Bundle;
-use Symfony\Component\Serializer\Serializer;
 
 /**
  * SerializationTest dependency injection container.
diff --git a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
similarity index 56%
rename from core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
rename to core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
index edb3b5b..7d15f30 100644
--- a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
+++ b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\serialization_test\SerializationTestEncoder.
+ * Contains \Drupal\serialization_test\SerializationTestEncoder.
  */
 
 namespace Drupal\serialization_test;
@@ -19,15 +19,7 @@ class SerializationTestEncoder implements EncoderInterface {
   static protected $format = 'serialization_test';
 
   /**
-   * Encodes data into the requested format.
-   *
-   * @param mixed $data
-   *   Data to encode.
-   * @param string $format
-   *   Format name.
-   *
-   * @return string
-   *   A string representation of $data in the requested format.
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::encode().
    */
   public function encode($data, $format, array $context = array()) {
     // @see Drupal\serialization_test\SerializationTestNormalizer::normalize().
@@ -35,13 +27,7 @@ public function encode($data, $format, array $context = array()) {
   }
 
   /**
-   * Checks whether this encoder can encode to the requested format.
-   *
-   * @param string $format
-   *   The short name of the format.
-   *
-   * @return bool
-   *   Returns TRUE if this encoder can encode to the requested format.
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::supportsEncoding().
    */
   public function supportsEncoding($format) {
     return static::$format === $format;
diff --git a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
similarity index 95%
rename from core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
rename to core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
index 81478c5..8b5c4f7 100644
--- a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
+++ b/core/modules/serialization/tests/serialization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\serialization_test\SerializationTestNormalizer.
+ * Contains \Drupal\serialization_test\SerializationTestNormalizer.
  */
 
 namespace Drupal\serialization_test;
diff --git a/core/modules/system/tests/modules/serialization_test/serialization_test.info b/core/modules/serialization/tests/serialization_test/serialization_test.info
similarity index 100%
rename from core/modules/system/tests/modules/serialization_test/serialization_test.info
rename to core/modules/serialization/tests/serialization_test/serialization_test.info
diff --git a/core/modules/system/tests/modules/serialization_test/serialization_test.module b/core/modules/serialization/tests/serialization_test/serialization_test.module
similarity index 100%
rename from core/modules/system/tests/modules/serialization_test/serialization_test.module
rename to core/modules/serialization/tests/serialization_test/serialization_test.module
