diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 3f91b32..c5c5296 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -234,6 +234,7 @@ public function build(ContainerBuilder $container) {
     $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');
+    $container->register('serializer.encoder.xml', 'Drupal\Core\Serialization\XmlEncoder')->addTag('encoder');
 
     $container->register('flood', 'Drupal\Core\Flood\DatabaseBackend')
       ->addArgument(new Reference('database'));
@@ -244,6 +245,7 @@ public function build(ContainerBuilder $container) {
     $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/lib/Drupal/Core/Serialization/XmlEncoder.php b/core/lib/Drupal/Core/Serialization/XmlEncoder.php
new file mode 100644
index 0000000..dd9d7bf
--- /dev/null
+++ b/core/lib/Drupal/Core/Serialization/XmlEncoder.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Serialization\XmlEncoder.
+ */
+
+namespace Drupal\Core\Serialization;
+
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+use Symfony\Component\Serializer\Encoder\DecoderInterface;
+use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder;
+use Symfony\Component\Serializer\SerializerInterface;
+use Symfony\Component\Serializer\Encoder\SerializerAwareEncoder;
+
+/**
+ * Adds XML to the support for serialization.
+ *
+ * This acts as a wrapper class for Symfony's XmlEncoder so that it is not
+ * implementing NormalizationAwareInterface, and can be normalized externally.
+ */
+class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, DecoderInterface {
+
+  /**
+   * The formats that this Encoder supports.
+   *
+   * @var array
+   */
+  static protected $format = 'xml';
+
+  /**
+   * An instance of the Symfony XmlEncoder to perform the actual serialization.
+   *
+   * @var \Symfony\Component\Serializer\Encoder\XmlEncoder
+   */
+  protected $baseEncoder;
+
+  /**
+   * Constucts the XmlEncoder object, creating a BaseXmlEncoder class also.
+   */
+  public function __construct() {
+    $this->baseEncoder = new BaseXmlEncoder();
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::encode().
+   */
+  public function encode($data, $format){
+    $normalized = $this->serializer->normalize($data, $format);
+    return $this->baseEncoder->encode($normalized, $format);
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\JsonEncoder::supportEncoding().
+   */
+  public function supportsEncoding($format) {
+    return $format === static::$format;
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::decode().
+   */
+  public function decode($data, $format){
+    return $this->baseEncoder->decode($data, $format);
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\JsonEncoder::supportDecoding().
+   */
+  public function supportsDecoding($format) {
+    return $format === static::$format;
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
index f34cd9d..c866549 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Serialization/EntitySerializationTest.php
@@ -10,6 +10,7 @@
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\Serializer\Serializer;
 use Drupal\Core\Serialization\JsonEncoder;
+use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder;
 use Drupal\Core\Serialization\ComplexDataNormalizer;
 use Drupal\Core\Serialization\TypedDataNormalizer;
 
@@ -124,5 +125,11 @@ public function testSerialize() {
     // Test 'ajax'.
     $actual = $serializer->serialize($this->entity, 'ajax');
     $this->assertIdentical($actual, $expected, 'Entity serializes to JSON when ajax is requested.');
+    // Test 'xml'. The expected output should match that of Symfony's XmlEncoder.
+    $base_encoder = new BaseXmlEncoder();
+    // We need to pass the normalized array structure to this.
+    $expected = $base_encoder->encode($serializer->normalize($this->entity), 'xml');
+    $actual = $serializer->serialize($this->entity, 'xml');
+    $this->assertIdentical($actual, $expected, 'Entity serializes to XML when xml is requested.');
   }
 }
