diff --git a/lib/Drupal/pgn/Serializer/Encoder/PgnEncoder.php b/lib/Drupal/pgn/Serializer/Encoder/PgnEncoder.php
new file mode 100644
index 0000000..e859b96
--- /dev/null
+++ b/lib/Drupal/pgn/Serializer/Encoder/PgnEncoder.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\pgn\Serializer\Encoder\PgnEncoder.
+ */
+
+namespace Drupal\pgn\Serializer\Encoder;
+
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+
+/**
+ * Adds Games_Chess PGN support for serializer.
+ */
+class PgnEncoder implements EncoderInterface {
+
+  /**
+   * The formats that this Encoder supports.
+   *
+   * @var array
+   */
+  static protected $format = array('pgn_move_list');
+
+  /**
+   * {@inheritdoc}
+   */
+  public function encode($data, $format, array $context = array()) {
+    static $decisive = array('1-0', '0-1');
+
+    $movetext = '';
+    foreach($data as $number => $move) {
+      $movetext .= $number . '. ' . $move[0] . ' ';
+      if (isset($move[1])) {
+        $movetext .= $move[1] . ' ';
+      }
+    }
+    $last_move = end($data);
+    $last_half = end($last_move);
+    if (strpos($last_half, '#')) {
+      $decisive_index = count($last_move) - 1;
+    }
+    $result = !isset($decisive_index) ? '*' : $decisive[$decisive_index];
+    $movetext .= $result;
+
+    $pgn = array(
+      '[Event "?"]',
+      '[Site "?"]',
+      '[Date "????.??.??"]',
+      '[Round "?"]',
+      '[White "?"]',
+      '[Black "?"]',
+      '[Result "' . $result . '"]',
+      '',
+      $movetext,
+      '',
+    );
+    return implode("\n", $pgn);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function supportsEncoding($format) {
+    return in_array($format, static::$format);
+  }
+
+}
diff --git a/tests/Drupal/pgn/Tests/PgnEncoderUnitTest.php b/tests/Drupal/pgn/Tests/PgnEncoderUnitTest.php
new file mode 100644
index 0000000..69ee073
--- /dev/null
+++ b/tests/Drupal/pgn/Tests/PgnEncoderUnitTest.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\pgn\Tests\PgnEncoderUnitTest.
+ */
+
+namespace Drupal\pgn\Tests;
+
+use Drupal\Tests\UnitTestCase;
+use Drupal\pgn\Serializer\Encoder\PgnEncoder;
+
+/**
+ * Tests the PGN Encoder.
+ */
+class PgnEncoderUnitTest extends UnitTestCase {
+
+  protected static $encoder;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'PGN Encoder test',
+      'description' => 'Test that PGN Encoder encodes into PGN.',
+      'group' => 'PGN',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function setUpBeforeClass() {
+    $module_directory_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)));
+    require_once $module_directory_path . '/lib/Drupal/pgn/Serializer/Encoder/PgnEncoder.php';
+    self::$encoder = new PgnEncoder();
+  }
+
+  /**
+   * @dataProvider providerMoveListEncode
+   */
+  public function testMoveListEncode($normalized, $file) {
+    $encoded = self::$encoder->encode($normalized, 'pgn_move_list');
+
+    $module_directory_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)));
+    $expected = file_get_contents($module_directory_path . '/tests/' . $file);
+    $this->assertEquals($expected, $encoded, $expected . ' should equal ' . $encoded);
+  }
+
+  public function providerMoveListEncode() {
+    return array(
+      array(
+        array(
+          1=> array('e4', 'f5'),
+          2 => array('Qh5+'),
+        ),
+        'e4f5Dh5.pgn',
+      ),
+      array(
+        array(
+          1 => array('f3', 'e5'),
+          2 => array('g4', 'Dh4#'),
+        ),
+        'fools_mate.pgn',
+      ),
+      array(
+        array(
+          1 => array('e4', 'g5'),
+          2 => array('Qf3', 'f5'),
+          3 => array('Qh5#'),
+        ),
+        'e4g5Df3f5Dh5.pgn',
+      ),
+    );
+  }
+
+}
diff --git a/tests/e4f5Dh5.pgn b/tests/e4f5Dh5.pgn
new file mode 100644
index 0000000..d9fe616
--- /dev/null
+++ b/tests/e4f5Dh5.pgn
@@ -0,0 +1,9 @@
+[Event "?"]
+[Site "?"]
+[Date "????.??.??"]
+[Round "?"]
+[White "?"]
+[Black "?"]
+[Result "*"]
+
+1. e4 f5 2. Qh5+ *
diff --git a/tests/e4g5Df3f5Dh5.pgn b/tests/e4g5Df3f5Dh5.pgn
new file mode 100644
index 0000000..fcd9e00
--- /dev/null
+++ b/tests/e4g5Df3f5Dh5.pgn
@@ -0,0 +1,9 @@
+[Event "?"]
+[Site "?"]
+[Date "????.??.??"]
+[Round "?"]
+[White "?"]
+[Black "?"]
+[Result "1-0"]
+
+1. e4 g5 2. Df3 f5 3. Dh5# 1-0
diff --git a/tests/fools_mate.pgn b/tests/fools_mate.pgn
new file mode 100644
index 0000000..dddfed0
--- /dev/null
+++ b/tests/fools_mate.pgn
@@ -0,0 +1,9 @@
+[Event "?"]
+[Site "?"]
+[Date "????.??.??"]
+[Round "?"]
+[White "?"]
+[Black "?"]
+[Result "0-1"]
+
+1. f3 e5 2. g4 Qh4# 0-1
