diff --git a/config_pages.services.yml b/config_pages.services.yml
index 9d24720..3a1c275 100644
--- a/config_pages.services.yml
+++ b/config_pages.services.yml
@@ -1,4 +1,10 @@
 services:
   plugin.manager.config_pages_context:
     class: Drupal\config_pages\ConfigPagesContextManager
-    arguments: ['@container.namespaces', '@cache.default', '@module_handler']
\ No newline at end of file
+    arguments: ['@container.namespaces', '@cache.default', '@module_handler']
+
+  config_pages.config_pages_normalizer:
+    class: Drupal\config_pages\ConfigPagesNormalizer
+    arguments: ['@rest.link_manager', '@entity.manager', '@module_handler']
+    tags:
+      - { name: normalizer, priority: 100 }
diff --git a/src/ConfigPagesNormalizer.php b/src/ConfigPagesNormalizer.php
new file mode 100644
index 0000000..e1748c8
--- /dev/null
+++ b/src/ConfigPagesNormalizer.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\config_pages;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\hal\Normalizer\ContentEntityNormalizer;
+
+/**
+ * Converts the Drupal config_pages object structure to a HAL array structure.
+ */
+class ConfigPagesNormalizer extends ContentEntityNormalizer {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $supportedInterfaceOrClass = 'Drupal\config_pages\ConfigPagesInterface';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityUri(EntityInterface $entity) {
+    $url = $entity->urlInfo('canonical', ['absolute' => TRUE]);
+    return $url->setOption('query', ['_format' => 'hal_json'])->toString();
+  }
+}
