diff --git a/chessboard_filter/src/ChessboardBulletinBoardCodeTagContentFilter.php b/chessboard_filter/src/ChessboardBulletinBoardCodeTagContentFilter.php
index 60270b2..cf1551d 100644
--- a/chessboard_filter/src/ChessboardBulletinBoardCodeTagContentFilter.php
+++ b/chessboard_filter/src/ChessboardBulletinBoardCodeTagContentFilter.php
@@ -8,6 +8,7 @@
 namespace Drupal\chessboard_filter;
 
 use Drupal\chessboard\ChessboardFilterInterface as FilterInterface;
+use Drupal\chessboard_images\Diagram;
 use Drupal\chessboard_images\PiecePlacement;
 
 /**
@@ -42,19 +43,8 @@ class ChessboardBulletinBoardCodeTagContentFilter implements FilterInterface{
    */
   public function filter($value) {
     $item = $this->parse($value);
-    $element = array(
-      '#attached' => array(
-        'library' => array('chessboard_images/drupal.chessboard_images'),
-      ),
-      '#theme_wrappers' => array('container'),
-      '#attributes' => array('class' => array('chessboard')),
-      'chessboard' => array(
-        '#type' => 'chessboard_images_diagram',
-        '#piece_placement' => new PiecePlacement($item['board_value'], $item['file_max']),
-        '#border' => $item['border'],
-        '#square_color_first' => $item['square_color_first'],
-      ),
-    );
+    $diagram = new Diagram();
+    $element = $diagram->setPiecePlacement(new PiecePlacement($item['board_value'], $item['file_max']))->toRenderable();
     return $element;
   }
 
diff --git a/chessboard_images/src/Diagram.php b/chessboard_images/src/Diagram.php
new file mode 100644
index 0000000..f9de632
--- /dev/null
+++ b/chessboard_images/src/Diagram.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\chessboard_images\Diagram.
+ */
+
+namespace Drupal\chessboard_images;
+
+use Drupal\Core\Render\RenderableInterface;
+use Drupal\chessboard\PiecePlacementInterface;
+
+/**
+ * @internal
+ *
+ * Defines a Chessboard Images Diagram.
+ *
+ */
+class Diagram implements RenderableInterface {
+
+  /**
+   * The piece placement object.
+   *
+   * @var Drupal\chessboard\PiecePlacementInterface
+   */
+  protected $piecePlacement;
+
+  public function setPiecePlacement(PiecePlacementInterface $piece_placement) {
+    $this->piecePlacement = $piece_placement;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function toRenderable() {
+    $elements = array(
+        '#attached' => array(
+          'library' => array('chessboard_images/drupal.chessboard_images'),
+        ),
+        '#theme_wrappers' => array('container'),
+        '#attributes' => array('class' => array('chessboard')),
+        'chessboard' => array(
+          '#type' => 'chessboard_images_diagram',
+          '#piece_placement' => $this->piecePlacement,
+        ),
+      );
+
+    return $elements;
+  }
+
+}
diff --git a/chessboard_images_formatter/src/Plugin/Field/FieldFormatter/ChessboardImagesFormatter.php b/chessboard_images_formatter/src/Plugin/Field/FieldFormatter/ChessboardImagesFormatter.php
index 277691d..5e03898 100644
--- a/chessboard_images_formatter/src/Plugin/Field/FieldFormatter/ChessboardImagesFormatter.php
+++ b/chessboard_images_formatter/src/Plugin/Field/FieldFormatter/ChessboardImagesFormatter.php
@@ -10,6 +10,7 @@ namespace Drupal\chessboard_images_formatter\Plugin\Field\FieldFormatter;
 use Drupal\Core\Field\FormatterBase;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\chessboard_images_formatter\PiecePlacementBuilder;
+use Drupal\chessboard_images\Diagram;
 
 /**
  * Plugin implementation of the 'chessboard_images_formatter_diagram' formatter.
@@ -32,18 +33,9 @@ class ChessboardImagesFormatter extends FormatterBase {
 
     $builder = new PiecePlacementBuilder();
     $builder->setFileMax(8);
+    $diagram = new Diagram();
     foreach ($items as $delta => $item) {
-      $elements[$delta] = array(
-        '#attached' => array(
-          'library' => array('chessboard_images/drupal.chessboard_images'),
-        ),
-        '#theme_wrappers' => array('container'),
-        '#attributes' => array('class' => array('chessboard')),
-        'chessboard' => array(
-          '#type' => 'chessboard_images_diagram',
-          '#piece_placement' => $builder->setTypedData($item->get('piece_placement'))->build(),
-        ),
-      );
+      $elements[$delta] = $diagram->setPiecePlacement($builder->setTypedData($item->get('piece_placement'))->build())->toRenderable();
     }
 
     return $elements;
