diff --git a/jsonapi.services.yml b/jsonapi.services.yml
index 3327db1..0e066d3 100644
--- a/jsonapi.services.yml
+++ b/jsonapi.services.yml
@@ -131,7 +131,7 @@ services:
 
   jsonapi.entity.to_jsonapi:
     class: Drupal\jsonapi\EntityToJsonApi
-    arguments: ['@jsonapi.serializer_do_not_use_removal_imminent', '@jsonapi.resource_type.repository', '@current_user']
+    arguments: ['@jsonapi.serializer_do_not_use_removal_imminent', '@serializer.normalizer.jsonapi_document_toplevel.jsonapi', '@jsonapi.resource_type.repository', '@current_user']
 
   logger.channel.jsonapi:
     parent: logger.channel_base
diff --git a/src/EntityToJsonApi.php b/src/EntityToJsonApi.php
index 09f97be..e2e2c7c 100644
--- a/src/EntityToJsonApi.php
+++ b/src/EntityToJsonApi.php
@@ -8,6 +8,7 @@ use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\jsonapi\Resource\JsonApiDocumentTopLevel;
 use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface;
 use Drupal\jsonapi\Serializer\Serializer;
+use Drupal\jsonapi\Normalizer\JsonApiDocumentTopLevelNormalizer;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
@@ -31,6 +32,11 @@ class EntityToJsonApi {
    */
   protected $serializer;
 
+  /**
+   * Top-level document normalizer.
+   */
+  protected $topLevelNormalizer;
+
   /**
    * The JSON API resource type repository.
    *
@@ -48,9 +54,11 @@ class EntityToJsonApi {
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The currently logged in user.
    */
-  public function __construct(Serializer $serializer, ResourceTypeRepositoryInterface $resource_type_repository, AccountInterface $current_user) {
+  public function __construct(Serializer $serializer, JsonApiDocumentTopLevelNormalizer $top_level_normalizer, ResourceTypeRepositoryInterface $resource_type_repository, AccountInterface $current_user) {
     $this->serializer = $serializer;
     $this->resourceTypeRepository = $resource_type_repository;
+    $this->topLevelNormalizer = $top_level_normalizer;
+    $this->topLevelNormalizer->setSerializer($serializer);
     $this->currentUser = $current_user;
   }
 
@@ -67,7 +75,7 @@ class EntityToJsonApi {
     // TODO: Supporting includes requires adding the 'include' query string.
     return $this->serializer->serialize(new JsonApiDocumentTopLevel($entity),
       'api_json',
-      $this->calculateContext($entity)
+      $this->calculateContextFromEntity($entity)
     );
   }
 
@@ -83,7 +91,24 @@ class EntityToJsonApi {
   public function normalize(EntityInterface $entity) {
     return $this->serializer->normalize(new JsonApiDocumentTopLevel($entity),
       'api_json',
-      $this->calculateContext($entity)
+      $this->calculateContextFromEntity($entity)
+    );
+  }
+
+  /**
+   * Return the requested entity from a structured array.
+   *
+   * @param array $data
+   *   The JSON structure, as an array.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface $entity
+   *  The entity extracted from the JSON.
+   */
+  public function denormalize(array $data) {
+    return $this->topLevelNormalizer->denormalize($data,
+      JsonApiDocumentTopLevelNormalizer::class,
+      'api_json',
+      $this->calculateContextFromJSON($data)
     );
   }
 
@@ -96,7 +121,7 @@ class EntityToJsonApi {
    * @return array
    *   The context.
    */
-  protected function calculateContext(EntityInterface $entity) {
+  protected function calculateContextFromEntity(EntityInterface $entity) {
     // TODO: Supporting includes requires adding the 'include' query string.
     $path = sprintf('/jsonapi/%s/%s/%s', $entity->getEntityTypeId(), $entity->bundle(), $entity->uuid());
     $request = Request::create($path, 'GET');
@@ -111,4 +136,25 @@ class EntityToJsonApi {
     ];
   }
 
+  /**
+   * Calculate the context for the deserialize/denormalize operation.
+   *
+   * @param array $data
+   *   The serialized JSON of the entity.
+   *
+   * @return array
+   *   The context.
+   */
+  protected function calculateContextFromJSON(array $data) {
+    list($entity_type, $bundle) = explode('--', $data['data']['type']);
+    return [
+      'account' => $this->currentUser,
+      'cacheable_metadata' => new CacheableMetadata(),
+      'resource_type' => $this->resourceTypeRepository->get(
+        $entity_type,
+        $bundle
+      ),
+    ];
+  }
+
 }
diff --git a/tests/src/Kernel/EntityToJsonApiTest.php b/tests/src/Kernel/EntityToJsonApiTest.php
index 6bc0260..112abbc 100644
--- a/tests/src/Kernel/EntityToJsonApiTest.php
+++ b/tests/src/Kernel/EntityToJsonApiTest.php
@@ -182,6 +182,9 @@ class EntityToJsonApiTest extends JsonapiKernelTestBase {
         $output = $this->sut->normalize($entity);
         $this->assertInternalType('array', $output);
         $this->assertJsonApi($output);
+	$denormalized_entity = $this->sut->denormalize($output);
+	$this->assertInstanceOf('Drupal\Core\Entity\EntityInterface', $denormalized_entity);
+	$this->assertSame($entity->toArray(), $denormalized_entity->toArray());
       }
     );
   }
