diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index a15279e..24c5ed4 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;
@@ -249,20 +248,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'));
 
@@ -270,8 +255,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/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/modules/serialization/lib/Drupal/serialization/1903784-01-serialization-module.patch b/core/modules/serialization/lib/Drupal/serialization/1903784-01-serialization-module.patch
new file mode 100644
index 0000000..95ea69a
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/1903784-01-serialization-module.patch
@@ -0,0 +1,363 @@
+diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
+index a15279e..24c5ed4 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;
+@@ -249,20 +248,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'));
+ 
+@@ -270,8 +255,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/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 87%
+rename from core/lib/Drupal/Core/Serialization/JsonEncoder.php
+rename to core/modules/serialization/lib/Drupal/serialization/Encoder/JsonEncoder.php
+index 8d7e3d7..1f2e68a 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..170a37d 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..3d0426e 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..4b93cab 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 85%
+rename from core/lib/Drupal/Core/Serialization/NormalizerBase.php
+rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
+index f256b0e..7779682 100644
+--- a/core/lib/Drupal/Core/Serialization/NormalizerBase.php
++++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
+@@ -2,12 +2,11 @@
+ 
+ /**
+  * @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 Symfony\Component\Serializer\Exception\RuntimeException;
+ use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+ use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
+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..05027f0 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/SerializationBundle.php b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
+new file mode 100644
+index 0000000..949aa66
+--- /dev/null
++++ b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
+@@ -0,0 +1,42 @@
++<?php
++
++/**
++ * @file
++ * Contains Drupal\rest\SerializationBundle.
++ */
++
++namespace Drupal\serialization;
++
++use Drupal\Core\DependencyInjection\Compiler\RegisterSerializationClassesPass;
++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 RegisterSerializationClassesPass());
++  }
++}
+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..4d61057 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..33845d0 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..b3d9bbc
+--- /dev/null
++++ b/core/modules/serialization/serialization.module
+@@ -0,0 +1 @@
++<?php
+diff --git a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php b/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
+index edb3b5b..2f3896d 100644
+--- a/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
++++ b/core/modules/system/tests/modules/serialization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
+@@ -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/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 85%
rename from core/lib/Drupal/Core/Serialization/NormalizerBase.php
rename to core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
index f256b0e..c30cd3e 100644
--- a/core/lib/Drupal/Core/Serialization/NormalizerBase.php
+++ b/core/modules/serialization/lib/Drupal/serialization/Normalizer/NormalizerBase.php
@@ -2,12 +2,11 @@
 
 /**
  * @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 Symfony\Component\Serializer\Exception\RuntimeException;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
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/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..8be9661
--- /dev/null
+++ b/core/modules/serialization/lib/Drupal/serialization/SerializationBundle.php
@@ -0,0 +1,39 @@
+<?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) {
+    // 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/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..b3d9bbc
--- /dev/null
+++ b/core/modules/serialization/serialization.module
@@ -0,0 +1 @@
+<?php
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
