diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 0225c9b..28dcbf2 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -10,6 +10,7 @@
 use Drupal\Core\DependencyInjection\Compiler\RegisterKernelListenersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterMatchersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterNestedMatchersPass;
+use Drupal\Core\DependencyInjection\Compiler\RegisterSerializationClassesPass;
 use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Reference;
@@ -125,10 +126,17 @@ public function build(ContainerBuilder $container) {
       ->setFactoryClass('Drupal\Core\ExceptionController')
       ->setFactoryMethod('getExceptionListener');
 
+    // Add Serializer with arguments to be replaced in the compiler pass.
+    $container->register('serializer', 'Symfony\Component\Serializer\Serializer')
+      ->addArgument(array())
+      ->addArgument(array());
+
     $container->addCompilerPass(new RegisterMatchersPass());
     $container->addCompilerPass(new RegisterNestedMatchersPass());
     // 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());
   }
 
 }
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php
new file mode 100644
index 0000000..d22f3b6
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterSerializationClassesPass.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\serialization\RegisterSerializationClassesPass.
+ */
+
+namespace Drupal\Core\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Adds services tagged 'normalizer' and 'encoder' to the Serializer.
+ */
+class RegisterSerializationClassesPass implements CompilerPassInterface {
+
+  /**
+   * Adds services to the Serializer.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *   The container to process.
+   */
+  public function process(ContainerBuilder $container) {
+    $definition = $container->getDefinition('serializer');
+
+    // Retrieve registered Normalizers and Encoders from the container.
+    foreach ($container->findTaggedServiceIds('normalizer') as $id => $attributes) {
+      $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
+      $normalizers[$priority][] = new Reference($id);
+    }
+    foreach ($container->findTaggedServiceIds('encoder') as $id => $attributes) {
+      $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
+      $encoders[$priority][] = new Reference($id);
+    }
+
+    // Add the registered Normalizers and Encoders to the Serializer.
+    if (!empty($normalizers)) {
+      $definition->replaceArgument(0, $this->sort($normalizers));
+    }
+    if (!empty($encoders)) {
+      $definition->replaceArgument(1, $this->sort($encoders));
+    }
+  }
+
+  /**
+   * Sort by priority.
+   *
+   * The highest priority number is the highest priority (reverse sorting).
+   *
+   * @param array $services
+   *   A nested array of Normalizers/Encoders.
+   *
+   * @return array
+   *   An array of Normalizers/Encoders to be used by Serializer.
+   */
+  protected function sort($services) {
+    $sorted = array();
+    krsort($services);
+
+    // Flatten the array.
+    foreach ($services as $a) {
+      $sorted = array_merge($sorted, $a);
+    }
+
+    return $sorted;
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php b/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
new file mode 100644
index 0000000..3d74688
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\jsonld\Tests\SerializationTest.
+ */
+
+namespace Drupal\system\Tests\Serialization;
+
+use Drupal\simpletest\WebTestBase;
+
+class SerializationTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('serialization_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Serialization tests',
+      'description' => 'Funtional tests for serialization system.',
+      'group' => 'Serialization',
+    );
+  }
+
+  /**
+   * Confirms that modules can register normalizers and encoders.
+   */
+  public function testSerilizerComponentRegistration() {
+    $obj = (object) array();
+    $format = 'serialization_test';
+    $container = drupal_container();
+    $serializer = $container->get('serializer');
+
+    // Test that normalizer is added. The supportsNormalization function cannot
+    // be used to check this because if a default Normalizer is added, it will
+    // respond to any format, including the 'serialization_test' format.
+    $normalized = $serializer->normalize($obj, $format);
+    $this->assertEqual($normalized[0], 'normalize works', 'Registered normalizers are added to Serializer.');
+    // Test that encoder is added.
+    $this->assertTrue($serializer->supportsEncoding($format), 'Registered encoders are added to Serializer.');
+  }
+}
diff --git a/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestBundle.php b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
new file mode 100644
index 0000000..1acb3f2
--- /dev/null
+++ b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestBundle.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Definition of 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.
+ */
+class SerializationTestBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    $container->register('serializer.normalizer.serialization_test', 'Drupal\serialization_test\SerializationTestNormalizer')->addTag('normalizer');
+    $container->register('serializer.encoder.serialization_test', 'Drupal\serialization_test\SerializationTestEncoder')->addTag('encoder');
+  }
+}
diff --git a/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
new file mode 100644
index 0000000..097bec0
--- /dev/null
+++ b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestEncoder.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\serialization_test\SerializationTestEncoder.
+ */
+
+namespace Drupal\serialization_test;
+
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+
+class SerializationTestEncoder implements EncoderInterface {
+
+  /**
+   * The format that this Encoder supports.
+   *
+   * @var string
+   */
+  static protected $format = 'serialization_test';
+
+  /**
+   * Implementation required. This function not used for testing.
+   *
+   * @param mixed $data
+   *   Data to encode.
+   * @param string $format
+   *   Format name.
+   */
+  public function encode($data, $format) {
+  }
+
+  /**
+   * Check whether the request is for 'serialization_test'.
+   *
+   * @param string $format
+   *   The short name of the format returned by ContentNegotiation.
+   *
+   * @return bool
+   *   Returns TRUE if the encoder can handle the request.
+   */
+  public function supportsEncoding($format) {
+    return static::$format === $format;
+  }
+}
diff --git a/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
new file mode 100644
index 0000000..01f31bc
--- /dev/null
+++ b/core/modules/system/tests/modules/serilization_test/lib/Drupal/serialization_test/SerializationTestNormalizer.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\serialization_test\SerializationTestNormalizer.
+ */
+
+namespace Drupal\serialization_test;
+
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+class SerializationTestNormalizer implements NormalizerInterface {
+
+  /**
+   * The format that this Normalizer supports.
+   *
+   * @var string
+   */
+  static protected $format = 'serialization_test';
+
+  /**
+   * Normalizes an object into a set of arrays/scalars.
+   *
+   * @param object $object
+   *   Object to normalize.
+   * @param string $format
+   *   Format the normalization result will be encoded as.
+   *
+   * @return array
+   *   An array containing expected result.
+   */
+  public function normalize($object, $format = NULL) {
+    return array('normalize works');
+  }
+
+  /**
+   * Checks whether format is supported by this normalizer.
+   *
+   * @param mixed  $data
+   *   Data to normalize.
+   * @param string $format
+   *   Format the normalization result will be encoded as.
+   *
+   * @return bool
+   *   Returns TRUE if the normalizer can handle the request.
+   */
+  public function supportsNormalization($data, $format = NULL) {
+    return static::$format === $format;
+  }
+}
diff --git a/core/modules/system/tests/modules/serilization_test/serialization_test.info b/core/modules/system/tests/modules/serilization_test/serialization_test.info
new file mode 100644
index 0000000..7c6fa97
--- /dev/null
+++ b/core/modules/system/tests/modules/serilization_test/serialization_test.info
@@ -0,0 +1,5 @@
+name = Serialization test module
+description = "Support module for serialization tests."
+package = Testing
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/system/tests/modules/serilization_test/serialization_test.module b/core/modules/system/tests/modules/serilization_test/serialization_test.module
new file mode 100644
index 0000000..74f4a3d
--- /dev/null
+++ b/core/modules/system/tests/modules/serilization_test/serialization_test.module
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * Test serialization module.
+ */
