diff --git a/jsonapi.services.yml b/jsonapi.services.yml
index c2a0a08..0add9ea 100644
--- a/jsonapi.services.yml
+++ b/jsonapi.services.yml
@@ -10,6 +10,10 @@ services:
     class: Drupal\jsonapi\Normalizer\FieldItemNormalizer
     tags:
       - { name: normalizer, priority: 21 }
+  serializer.normalizer.scalar.jsonapi:
+    class: Drupal\jsonapi\Normalizer\ScalarNormalizer
+    tags:
+      - { name: normalizer, priority: 5 }
   serializer.normalizer.field.jsonapi:
     class: Drupal\jsonapi\Normalizer\FieldNormalizer
     tags:
@@ -26,7 +30,12 @@ services:
     arguments: ['@entity.manager', '@http_client', '@rest.link_manager', '@module_handler']
   serializer.normalizer.entity.jsonapi:
     class: Drupal\jsonapi\Normalizer\ContentEntityNormalizer
-    arguments: ['@entity_type.manager', '@jsonapi.resource.manager', '@jsonapi.link_manager']
+    arguments: ['@jsonapi.resource.manager', '@jsonapi.link_manager']
+    tags:
+      - { name: normalizer, priority: 21 }
+  serializer.normalizer.config_entity.jsonapi:
+    class: Drupal\jsonapi\Normalizer\ConfigEntityNormalizer
+    arguments: ['@jsonapi.resource.manager', '@jsonapi.link_manager']
     tags:
       - { name: normalizer, priority: 21 }
   serializer.normalizer.document_root.jsonapi:
diff --git a/src/Normalizer/ConfigEntityNormalizer.php b/src/Normalizer/ConfigEntityNormalizer.php
new file mode 100644
index 0000000..6439bc5
--- /dev/null
+++ b/src/Normalizer/ConfigEntityNormalizer.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Drupal\jsonapi\Normalizer;
+
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+
+/**
+ * Class ConfigEntityNormalizer.
+ *
+ * Converts a configuration entity into the JSON API value rasterizable object.
+ *
+ * @package Drupal\jsonapi\Normalizer
+ */
+class ConfigEntityNormalizer extends ContentEntityNormalizer {
+
+  /**
+   * The interface or class that this Normalizer supports.
+   *
+   * @var string
+   */
+  protected $supportedInterfaceOrClass = ConfigEntityInterface::class;
+
+  /**
+   * Gets the field names for the given entity.
+   *
+   * @param mixed $entity
+   *   The entity.
+   *
+   * @return array
+   *   The fields.
+   */
+  protected function getFields($entity) {
+    /* @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */
+    return $entity->toArray();
+  }
+
+  /**
+   * Serializes a given field.
+   *
+   * @param mixed $field
+   *   The field to serialize.
+   * @param array $context
+   *   The normalization context.
+   * @param string $format
+   *   The serialization format.
+   *
+   * @return Value\FieldNormalizerValueInterface
+   *   The normalized value.
+   */
+  protected function serializeField($field, $context, $format) {
+    $output = $this->serializer->normalize($field, $format, $context);
+    $output->setPropertyType('attributes');
+    return $output;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function denormalize($data, $class, $format = NULL, array $context = array()) {
+    throw new \Exception('Denormalization not implemented for JSON API');
+  }
+
+}
diff --git a/src/Normalizer/ConfigEntityNormalizerInterface.php b/src/Normalizer/ConfigEntityNormalizerInterface.php
new file mode 100644
index 0000000..d90ace6
--- /dev/null
+++ b/src/Normalizer/ConfigEntityNormalizerInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Drupal\jsonapi\Normalizer;
+
+/**
+ * Class ConfigEntityNormalizerInterface.
+ *
+ * @package Drupal\jsonapi\Normalizer
+ */
+interface ConfigEntityNormalizerInterface {}
diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php
index 0d49c66..b1010c9 100644
--- a/src/Normalizer/ContentEntityNormalizer.php
+++ b/src/Normalizer/ContentEntityNormalizer.php
@@ -3,8 +3,7 @@
 namespace Drupal\jsonapi\Normalizer;
 
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Entity\ContentEntityTypeInterface;
-use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Field\EntityReferenceFieldItemList;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\jsonapi\Configuration\ResourceManagerInterface;
@@ -37,13 +36,6 @@ class ContentEntityNormalizer extends NormalizerBase implements ContentEntityNor
   protected $linkManager;
 
   /**
-   * The entity type manager.
-   *
-   * @var EntityTypeManagerInterface
-   */
-  protected $entityTypeManager;
-
-  /**
    * The resource manager.
    *
    * @var \Drupal\jsonapi\Configuration\ResourceManagerInterface
@@ -53,13 +45,12 @@ class ContentEntityNormalizer extends NormalizerBase implements ContentEntityNor
   /**
    * Constructs an ContentEntityNormalizer object.
    *
-   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
-   *   The entity type manager.
    * @param \Drupal\jsonapi\Configuration\ResourceManagerInterface $resource_manager
    *   The config resource manager.
+   * @param \Drupal\jsonapi\LinkManager\LinkManagerInterface $link_manager
+   *   The link manager.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, ResourceManagerInterface $resource_manager, LinkManagerInterface $link_manager) {
-    $this->entityTypeManager = $entity_type_manager;
+  public function __construct(ResourceManagerInterface $resource_manager, LinkManagerInterface $link_manager) {
     $this->resourceManager = $resource_manager;
     $this->linkManager = $link_manager;
   }
@@ -71,33 +62,23 @@ class ContentEntityNormalizer extends NormalizerBase implements ContentEntityNor
     // If the fields to use were specified, only output those field values.
     $resource_type = $context['resource_config']->getTypeName();
     if (!empty($context['sparse_fieldset'][$resource_type])) {
-      $fields_names = $context['sparse_fieldset'][$resource_type];
+      $field_names = $context['sparse_fieldset'][$resource_type];
     }
     else {
-      $fields_names = array_map(function ($field) {
-        /* @var \Drupal\Core\Field\FieldItemListInterface $field */
-        return $field->getName();
-      }, $entity->getFields());
+      $field_names = $this->getFieldNames($entity);
     }
     /* @var Value\FieldNormalizerValueInterface[] $normalizer_values */
     $normalizer_values = [];
-    foreach ($entity->getFields() as $field) {
-      // Continue if the current user does not have access to view this field.
-      if (!$field->access('view', $context['account'])) {
-        continue;
-      }
-
+    foreach ($this->getFields($entity) as $field_name => $field) {
       // Relationships cannot be excluded by using sparse fieldsets.
       $is_relationship = $this->isRelationship($field);
-      $field_name = $field->getName();
-      if (!$is_relationship && !in_array($field_name, $fields_names)) {
+      if (!$is_relationship && !in_array($field_name, $field_names)) {
         continue;
       }
-      $normalizer_values[$field_name] = $this->serializer->normalize($field, $format, $context);
-
-      $property_type = $is_relationship ? 'relationships' : 'attributes';
-      $normalizer_values[$field_name]->setPropertyType($property_type);
+      $normalizer_values[$field_name] = $this->serializeField($field, $context, $format);
     }
+    // Clean all the NULL values coming from denied access.
+    $normalizer_values = array_filter($normalizer_values);
 
     $link_context = ['link_manager' => $this->linkManager];
     return new Value\ContentEntityNormalizerValue($normalizer_values, $context, $entity, $link_context);
@@ -106,19 +87,14 @@ class ContentEntityNormalizer extends NormalizerBase implements ContentEntityNor
   /**
    * Checks if the passed field is a relationship field.
    *
-   * @param \Drupal\Core\Field\FieldItemListInterface $field
+   * @param mixed $field
    *   The field.
    *
    * @return bool
    *   TRUE if it's a JSON API relationship.
    */
-  protected function isRelationship(FieldItemListInterface $field) {
-    if (!$field instanceof EntityReferenceFieldItemList) {
-      return FALSE;
-    }
-    $target_type_id = $field->getItemDefinition()->getSetting('target_type');
-    $entity_type = $this->entityTypeManager->getDefinition($target_type_id);
-    return $entity_type instanceof ContentEntityTypeInterface;
+  protected function isRelationship($field) {
+    return $field instanceof EntityReferenceFieldItemList;
   }
 
   /**
@@ -128,4 +104,59 @@ class ContentEntityNormalizer extends NormalizerBase implements ContentEntityNor
     throw new \Exception('Denormalization not implemented for JSON API');
   }
 
+  /**
+   * Gets the field names for the given entity.
+   *
+   * @param mixed $entity
+   *   The entity.
+   *
+   * @return string[]
+   *   The field names.
+   */
+  protected function getFieldNames($entity) {
+    /* @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    return array_keys($this->getFields($entity));
+  }
+
+  /**
+   * Gets the field names for the given entity.
+   *
+   * @param mixed $entity
+   *   The entity.
+   *
+   * @return array
+   *   The fields.
+   */
+  protected function getFields($entity) {
+    /* @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+    return $entity->getFields();
+  }
+
+
+  /**
+   * Serializes a given field.
+   *
+   * @param mixed $field
+   *   The field to serialize.
+   * @param array $context
+   *   The normalization context.
+   * @param string $format
+   *   The serialization format.
+   *
+   * @return Value\FieldNormalizerValueInterface
+   *   The normalized value.
+   */
+  protected function serializeField($field, $context, $format) {
+    /* @var \Drupal\Core\Field\FieldItemListInterface $field */
+    // Continue if the current user does not have access to view this field.
+    if (!$field->access('view', $context['account'])) {
+      return NULL;
+    }
+    $output = $this->serializer->normalize($field, $format, $context);
+    $is_relationship = $this->isRelationship($field);
+    $property_type = $is_relationship ? 'relationships' : 'attributes';
+    $output->setPropertyType($property_type);
+    return $output;
+  }
+
 }
diff --git a/src/Normalizer/ContentEntityNormalizerInterface.php b/src/Normalizer/ContentEntityNormalizerInterface.php
index ec3fe9d..d413652 100644
--- a/src/Normalizer/ContentEntityNormalizerInterface.php
+++ b/src/Normalizer/ContentEntityNormalizerInterface.php
@@ -2,7 +2,6 @@
 
 
 namespace Drupal\jsonapi\Normalizer;
-use Drupal\Core\Entity\EntityInterface;
 
 /**
  * Class ContentEntityNormalizerInterface.
diff --git a/src/Normalizer/EntityReferenceItemNormalizer.php b/src/Normalizer/EntityReferenceItemNormalizer.php
index 179f2f2..36cac3a 100644
--- a/src/Normalizer/EntityReferenceItemNormalizer.php
+++ b/src/Normalizer/EntityReferenceItemNormalizer.php
@@ -2,13 +2,9 @@
 
 namespace Drupal\jsonapi\Normalizer;
 
-use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\jsonapi\Configuration\ResourceManagerInterface;
-use Drupal\jsonapi\Resource\DocumentWrapper;
-use Drupal\rest\LinkManager\LinkManagerInterface;
-use Drupal\serialization\EntityResolver\EntityResolverInterface;
 use Drupal\serialization\EntityResolver\UuidReferenceInterface;
 use Symfony\Component\DependencyInjection\ContainerAwareTrait;
 
@@ -46,18 +42,6 @@ class EntityReferenceItemNormalizer extends FieldItemNormalizer implements UuidR
   /**
    * {@inheritdoc}
    */
-  public function supportsNormalization($data, $format = NULL) {
-    if (!parent::supportsNormalization($data, $format)) {
-      return FALSE;
-    }
-    $target_type = $data->getFieldDefinition()->getSetting('target_type');
-    return !is_subclass_of(\Drupal::entityTypeManager()
-      ->getDefinition($target_type), 'Drupal\Core\Config\Entity\ConfigEntityTypeInterface');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function normalize($field_item, $format = NULL, array $context = array()) {
     /* @var $field_item \Drupal\Core\Field\FieldItemInterface */
     $target_entity = $field_item->get('entity')->getValue();
@@ -73,11 +57,7 @@ class EntityReferenceItemNormalizer extends FieldItemNormalizer implements UuidR
         ->get($target_entity->getEntityTypeId(), $target_entity->bundle())
         ->getTypeName()
     );
-    // If this is not a content entity, let the parent implementation handle it,
-    // only content entities are supported as embedded resources.
-    if (!($target_entity instanceof ContentEntityInterface)) {
-      return $normalizer_value;
-    }
+
     // TODO Only include if the target entity type has the resource enabled.
     if (!empty($context['include']) && in_array($field_item->getParent()
         ->getName(), $context['include'])
diff --git a/src/Normalizer/ScalarNormalizer.php b/src/Normalizer/ScalarNormalizer.php
new file mode 100644
index 0000000..c156680
--- /dev/null
+++ b/src/Normalizer/ScalarNormalizer.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\jsonapi\Normalizer;
+
+/**
+ * Class ScalarNormalizer.
+ *
+ * @package Drupal\jsonapi\Normalizer
+ */
+class ScalarNormalizer extends NormalizerBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $formats = ['api_json'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function supportsNormalization($data, $format = NULL) {
+    return (!$data || is_scalar($data)) && in_array($format, $this->formats);
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function normalize($object, $format = NULL, array $context = array()) {
+    $value = new Value\FieldItemNormalizerValue(['value' => $object]);
+    return new Value\FieldNormalizerValue([$value], 1);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function denormalize($data, $class, $format = NULL, array $context = array()) {
+    throw new \Exception('Denormalization not implemented for JSON API');
+  }
+
+
+}
diff --git a/src/Routing/JsonApiParamEnhancer.php b/src/Routing/JsonApiParamEnhancer.php
index dfe31c7..55cf44b 100644
--- a/src/Routing/JsonApiParamEnhancer.php
+++ b/src/Routing/JsonApiParamEnhancer.php
@@ -1,6 +1,7 @@
 <?php
 
 namespace Drupal\jsonapi\Routing;
+
 use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Routing\Enhancer\RouteEnhancerInterface;
 use Drupal\jsonapi\Routing\Param\CursorPage;
@@ -9,7 +10,6 @@ use Drupal\jsonapi\Routing\Param\Sort;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Route;
 
-
 /**
  * Class JsonApiParamEnhancer.
  *
diff --git a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
index 222b0ea..618e1e5 100644
--- a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
+++ b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
@@ -86,6 +86,8 @@ class DocumentRootNormalizerTest extends KernelTestBase {
       ->getRequestLink(Argument::any())
       ->willReturn('dummy_document_link');
     $this->container->set('jsonapi.link_manager', $link_manager->reveal());
+
+    $this->nodeType = NodeType::load('article');
   }
 
 
@@ -126,7 +128,10 @@ class DocumentRootNormalizerTest extends KernelTestBase {
       ->normalize($document_wrapper->reveal(), 'api_json', ['request' => $request->reveal()]);
     $this->assertSame($normalized['data']['attributes']['title'], 'dummy_title');
     $this->assertEquals($normalized['data']['id'], 1);
-    $this->assertSame('article', $normalized['data']['attributes']['type']);
+    $this->assertSame([
+      'type' => 'node_type',
+      'id' => 'article',
+    ], $normalized['data']['relationships']['type']);
     $this->assertTrue(!isset($normalized['data']['attributes']['created']));
     $this->assertSame('article', $normalized['data']['type']);
     $this->assertEquals([
@@ -145,4 +150,27 @@ class DocumentRootNormalizerTest extends KernelTestBase {
     $this->assertTrue(!isset($normalized['included'][0]['data']['attributes']['created']));
   }
 
+  /**
+   * @covers ::normalize
+   */
+  public function testNormalizeConfig() {
+    $this->container->get('serializer');
+    $request = $this->prophesize(Request::class);
+    $query = $this->prophesize(ParameterBag::class);
+    $query->get(Argument::any())->willReturn(NULL);
+    $query->getIterator()->willReturn(new \ArrayIterator());
+    $request->query = $query->reveal();
+    $route = $this->prophesize(Route::class);
+    $route->getPath()->willReturn('/node_type/{node_type}');
+    $request->get('_route_object')->willReturn($route->reveal());
+    $document_wrapper = $this->prophesize(DocumentWrapper::class);
+    $document_wrapper->getData()->willReturn($this->nodeType);
+    $normalized = $this
+      ->container
+      ->get('serializer.normalizer.document_root.jsonapi')
+      ->normalize($document_wrapper->reveal(), 'api_json', ['request' => $request->reveal()]);
+    $this->assertSame($normalized['data']['attributes']['type'], 'article');
+    $this->assertSame($normalized['data']['attributes']['display_submitted'], TRUE);
+  }
+
 }
diff --git a/tests/src/Unit/Normalizer/Value/DocumentRootNormalizerValueTest.php b/tests/src/Unit/Normalizer/Value/DocumentRootNormalizerValueTest.php
index e599adc..687f0a4 100644
--- a/tests/src/Unit/Normalizer/Value/DocumentRootNormalizerValueTest.php
+++ b/tests/src/Unit/Normalizer/Value/DocumentRootNormalizerValueTest.php
@@ -19,6 +19,7 @@ use Prophecy\Argument;
  * @package Drupal\Tests\jsonapi\Unit\Normalizer\Value
  *
  * @coversDefaultClass \Drupal\jsonapi\Normalizer\Value\DocumentRootNormalizerValue
+ *
  * @group jsonapi
  */
 class DocumentRootNormalizerValueTest extends UnitTestCase{
