diff --git a/lib/Drupal/pgn/Serializer/Encoder/PgnEncode.php b/lib/Drupal/pgn/Serializer/Encoder/PgnEncode.php
new file mode 100644
index 0000000..3e7993d
--- /dev/null
+++ b/lib/Drupal/pgn/Serializer/Encoder/PgnEncode.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\pgn\serializer\Encoder\PgnEncode.
+ */
+
+namespace Drupal\pgn\Serializer\Encoder;
+
+use Symfony\Component\Serializer\Encoder\EncoderInterface;
+
+/**
+ * Encodes PGN game data.
+ */
+class PgnEncode implements EncoderInterface {
+
+/**
+* The formats that this Encoder supports.
+*
+* @var array
+*/
+  static protected $format = array('pgn');
+
+  private $encoded_pgn;
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::encode().
+   */
+  public function encode($data, $format, array $context = array()) {
+    foreach ($data as $game) {
+      $this->appendGame($game, $format, $context);
+    }
+
+    return $this->encoded_pgn;
+  }
+
+  /**
+   * Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::supportsEncoding().
+   */
+  public function supportsEncoding($format) {
+    return in_array($format, static::$format);
+  }
+
+  protected function appendGame($game, $format, $context) {
+    foreach ($game['info'] as $info) {
+      $this->appendGameInfo($info, $format, $context);
+    }
+    foreach ($game['moves'] as $move) {
+      $this->appendGameMoves($moves, $format, $context);
+    }
+  }
+
+  protected function appendGameInfo($info, $format, $context) {
+    foreach ($info as $tag_pair) {
+      $this->appendGameInfoTagPair($tag_pair, $format, $context);
+    }
+  }
+
+  protected function appendGameMoves($moves, $format, $context) {
+    foreach ($moves as $move) {
+      $this->appendGameMove($move, $format, $context);
+    }
+  }
+
+  protected function appendGameInfoTagPair($tag_pair, $format, $context) {
+    // Append.
+  }
+
+  protected function appendGameMove($move, $format, $context) {
+    // Append.
+  }
+
+}
+
