diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index c6381c8..879bd02 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -223,6 +223,11 @@ public function build(ContainerBuilder $container) {
       ->addArgument(array())
       ->addArgument(array());
 
+    $container->register('serializer.normalizer.entity', 'Drupal\Core\Serialization\EntityNormalizer')->addTag('normalizer');
+    $container->register('serializer.encoder.json', 'Drupal\Core\Serialization\DrupalJsonEncoder')->addTag('encoder');
+    $container->register('serializer.encoder.ajax', 'Drupal\Core\Serialization\DrupalJsonEncoder')->addTag('encoder');
+    $container->register('serializer.encoder.xml', 'Symfony\Component\Serializer\Encoder\XmlEncoder')->addTag('encoder');
+
     $container->register('flood', 'Drupal\Core\Flood\DatabaseBackend')
       ->addArgument(new Reference('database'));
 
diff --git a/core/lib/Drupal/Core/Serialization/DrupalJsonEncoder.php b/core/lib/Drupal/Core/Serialization/DrupalJsonEncoder.php
new file mode 100644
index 0000000..f661c6d
--- /dev/null
+++ b/core/lib/Drupal/Core/Serialization/DrupalJsonEncoder.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Serialization\DrupalJsonEncoder.
+ */
+
+namespace Drupal\Core\Serialization;
+
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+use Symfony\Component\Serializer\Encoder\JsonEncoder;
+
+/**
+ * Adds 'ajax to the supported content types of the JSON encoder'
+ */
+class DrupalJsonEncoder extends JsonEncoder implements EncoderInterface {
+
+  /**
+   * The formats that this Encoder supports.
+   *
+   * @var array
+   */
+  static protected $format = array('json', 'ajax');
+
+  /**
+   * Overrides Symfony\Component\Serializer\Encoder\JsonEncoder::supportEncoding().
+   */
+  public function supportsEncoding($format) {
+    return in_array($format, static::$format);
+  }
+}
diff --git a/core/lib/Drupal/Core/Serialization/EntityNormalizer.php b/core/lib/Drupal/Core/Serialization/EntityNormalizer.php
new file mode 100644
index 0000000..61239fc
--- /dev/null
+++ b/core/lib/Drupal/Core/Serialization/EntityNormalizer.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Entity\EntityNormalizer.
+ */
+
+namespace Drupal\Core\Serialization;
+
+use Drupal\Core\Entity\EntityInterface;
+use Symfony\Component\Serializer\Exception\RuntimeException;
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+
+/**
+ * Converts the Drupal entity object structures to a normalized array.
+ *
+ * The format is not checked here, but assumed it will be supported.
+ * @see \Drupal\Core\Entity\EntityInterface
+ */
+class EntityNormalizer implements NormalizerInterface {
+
+  /**
+   * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize().
+   */
+  public function normalize($object, $format = NULL) {
+    return $object->getPropertyValues();
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::supportsNormalization().
+   */
+  public function supportsNormalization($data, $format = NULL) {
+    return is_object($data) && ($data instanceof EntityInterface);
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntityNormalizerTest.php b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntityNormalizerTest.php
new file mode 100644
index 0000000..0f7e84c
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntityNormalizerTest.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Serialization\EntityNormalizerTest.
+ */
+
+namespace Drupal\system\Tests\Serialization;
+
+use Drupal\Core\Serialization\EntityNormalizer;
+use Drupal\simpletest\WebTestBase;
+
+class EntityNormalizerTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Normalizer tests',
+      'description' => 'Tests that entities can be normalized.',
+      'group' => 'Serialization',
+    );
+  }
+
+  /**
+   * Tests the normalize function.
+   */
+  public function testNormalize() {
+    $normalizer = new EntityNormalizer();
+
+    $values = array(
+      'name' => $this->randomName(),
+      'user_id' => $GLOBALS['user']->uid,
+      'field_test_text' => array(
+        'value' => $this->randomName(),
+        'format' => 'full_html',
+      ),
+    );
+    $entity = entity_create('entity_test', $values);
+    $entity->save();
+
+    $expected = array(
+      'id' => array(
+        array('value' => 1),
+      ),
+      'revision_id' => array(
+        array('value' => 1),
+      ),
+      'uuid' => array(
+        array('value' => $entity->uuid()),
+      ),
+      'langcode' => array(
+        array('value' => LANGUAGE_NOT_SPECIFIED),
+      ),
+      'default_langcode' => array(NULL),
+      'name' => array(
+        array('value' => $values['name']),
+      ),
+      'user_id' => array(
+        array('value' => $values['user_id']),
+      ),
+      'field_test_text' => array(
+        array(
+          'value' => $values['field_test_text']['value'],
+          'format' => $values['field_test_text']['format'],
+        ),
+      ),
+    );
+
+    $normalized = $normalizer->normalize($entity);
+    $this->assertEqual($expected, $normalized);
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
new file mode 100644
index 0000000..cf33531
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Serialization\EntitySerializationTest.
+ */
+
+namespace Drupal\system\Tests\Serialization;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\Core\Serialization\EntityNormalizer;
+use Symfony\Component\Serializer\Encoder\XmlEncoder;
+
+class EntitySerializationTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity serialization tests',
+      'description' => 'Tests that entities can be serialized to JSON and XML formats.',
+      'group' => 'Serialization',
+    );
+  }
+
+  /**
+   * Tests the normalize function.
+   */
+  public function testSerialize() {
+    $serializer = drupal_container()->get('serializer');
+    $normalizer = new EntityNormalizer();
+
+    $values = array(
+      'name' => $this->randomName(),
+      'user_id' => $GLOBALS['user']->uid,
+      'field_test_text' => array(
+        'value' => $this->randomName(),
+        'format' => 'full_html',
+      ),
+    );
+    $entity = entity_create('entity_test', $values);
+    $entity->save();
+
+    // Get a normalized array to use for assertions.
+    $normalized = $normalizer->normalize($entity);
+
+    // Test the JSON output.
+    $expected = json_encode($normalized);
+    $actual = $serializer->serialize($entity, 'json');
+    $this->assertIdentical($actual, $expected);
+
+    // Test the XML output.
+    $xml_encoder = new XmlEncoder();
+    $expected = $xml_encoder->encode($normalized, 'xml');
+    $actual = $serializer->serialize($entity, 'xml');
+    $this->assertIdentical($actual, $expected);
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php b/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
index cf766ec..0a69208 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Serialization/SerializationTest.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\jsonld\Tests\SerializationTest.
+ * Definition of Drupal\system\Tests\Serialization\SerializationTest.
  */
 
 namespace Drupal\system\Tests\Serialization;
