 src/Configuration/ResourceConfig.php               | 76 ++++++----------------
 src/Configuration/ResourceConfigInterface.php      | 44 +------------
 src/Configuration/ResourceManager.php              | 12 ++--
 src/Normalizer/EntityNormalizer.php                |  4 +-
 .../JsonApiDocumentTopLevelNormalizerTest.php      |  2 -
 .../src/Unit/Configuration/ResourceConfigTest.php  | 55 ----------------
 tests/src/Unit/Context/CurrentContextTest.php      |  3 +-
 7 files changed, 34 insertions(+), 162 deletions(-)

diff --git a/src/Configuration/ResourceConfig.php b/src/Configuration/ResourceConfig.php
index 6e8b718..ec918bf 100644
--- a/src/Configuration/ResourceConfig.php
+++ b/src/Configuration/ResourceConfig.php
@@ -6,24 +6,16 @@ use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 
 /**
- * Class ResourceConfig.
+ * Value object containing all metadata for a JSON API resource type.
  *
- * This object contains all the information needed to generate all the routes
- * associated with a JSON API type. In the future this is going to be
- * constructed (maybe?) from a configuration entity.
+ * Used to generate routes (collection, individual, et cetera), generate
+ * relationship links, and so on.
  *
- * @package Drupal\jsonapi\Configuration
+ * @internal
  */
 class ResourceConfig implements ResourceConfigInterface {
 
   /**
-   * Holds the entity type manager.
-   *
-   * @var EntityTypeManagerInterface
-   */
-  protected $entityTypeManager;
-
-  /**
    * The entity type ID.
    *
    * @var string
@@ -68,16 +60,6 @@ class ResourceConfig implements ResourceConfigInterface {
   /**
    * {@inheritdoc}
    */
-  public function setEntityTypeId($entity_type_id) {
-    $this->entityTypeId = $entity_type_id;
-    $this->deserializationTargetClass = $this->entityTypeManager
-      ->getDefinition($entity_type_id)
-      ->getClass();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getTypeName() {
     return $this->typeName;
   }
@@ -85,13 +67,6 @@ class ResourceConfig implements ResourceConfigInterface {
   /**
    * {@inheritdoc}
    */
-  public function setTypeName($type_name) {
-    $this->typeName = $type_name;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getPath() {
     return $this->path;
   }
@@ -99,13 +74,6 @@ class ResourceConfig implements ResourceConfigInterface {
   /**
    * {@inheritdoc}
    */
-  public function setPath($path) {
-    $this->path = $path;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getBundleId() {
     return $this->bundleId;
   }
@@ -113,20 +81,6 @@ class ResourceConfig implements ResourceConfigInterface {
   /**
    * {@inheritdoc}
    */
-  public function setBundleId($bundle_id) {
-    $this->bundleId = $bundle_id;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getStorage() {
-    return $this->entityTypeManager->getStorage($this->entityTypeId);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getDeserializationTargetClass() {
     return $this->deserializationTargetClass;
   }
@@ -134,11 +88,23 @@ class ResourceConfig implements ResourceConfigInterface {
   /**
    * Instantiates a ResourceConfig object.
    *
-   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
-   *   The entity type manager.
-   */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
-    $this->entityTypeManager = $entity_type_manager;
+   * @param string $entity_type_id
+   *   An entity type ID.
+   * @param string $bundle_id
+   *   A bundle ID.
+   * @param string $path
+   *   The path at which this entity bundle will be made accessible.
+   * @param string $type_name
+   *   The JSON API type.
+   * @param string $deserialization_target_class
+   *   The deserialization target class.
+   */
+  public function __construct($entity_type_id, $bundle_id, $path, $type_name, $deserialization_target_class) {
+    $this->entityTypeId = $entity_type_id;
+    $this->bundleId = $bundle_id;
+    $this->path = $path;
+    $this->typeName = $type_name;
+    $this->deserializationTargetClass = $deserialization_target_class;
   }
 
 }
diff --git a/src/Configuration/ResourceConfigInterface.php b/src/Configuration/ResourceConfigInterface.php
index 3ddce5b..e2d816d 100644
--- a/src/Configuration/ResourceConfigInterface.php
+++ b/src/Configuration/ResourceConfigInterface.php
@@ -4,9 +4,7 @@
 namespace Drupal\jsonapi\Configuration;
 
 /**
- * Class ResourceConfigInterface.
- *
- * @package Drupal\jsonapi\Configuration
+ * @internal
  */
 interface ResourceConfigInterface {
 
@@ -19,14 +17,6 @@ interface ResourceConfigInterface {
   public function getEntityTypeId();
 
   /**
-   * Sets the entity type id.
-   *
-   * @param string $entity_type_id
-   *   The entityTypeId to set.
-   */
-  public function setEntityTypeId($entity_type_id);
-
-  /**
    * Gets the type name.
    *
    * @return string
@@ -35,14 +25,6 @@ interface ResourceConfigInterface {
   public function getTypeName();
 
   /**
-   * Sets the type name.
-   *
-   * @param string $type_name
-   *   The type name to set.
-   */
-  public function setTypeName($type_name);
-
-  /**
    * Gets the path.
    *
    * @return string
@@ -51,14 +33,6 @@ interface ResourceConfigInterface {
   public function getPath();
 
   /**
-   * Sets the path.
-   *
-   * @param string $path
-   *   The path to set.
-   */
-  public function setPath($path);
-
-  /**
    * Gets the bundle ID.
    *
    * @return string
@@ -67,22 +41,6 @@ interface ResourceConfigInterface {
   public function getBundleId();
 
   /**
-   * Sets the bundle ID.
-   *
-   * @param string $bundle_id
-   *   The bundleId to set.
-   */
-  public function setBundleId($bundle_id);
-
-  /**
-   * Gets the underlying entity storage for the resource.
-   *
-   * @return \Drupal\Core\Entity\EntityStorageInterface
-   *   The appropriate entity storage interface.
-   */
-  public function getStorage();
-
-  /**
    * Gets the deserialization target class.
    *
    * @return string
diff --git a/src/Configuration/ResourceManager.php b/src/Configuration/ResourceManager.php
index cb7e8e0..3e41cc0 100644
--- a/src/Configuration/ResourceManager.php
+++ b/src/Configuration/ResourceManager.php
@@ -58,11 +58,13 @@ class ResourceManager implements ResourceManagerInterface {
       foreach ($entity_type_ids as $entity_type_id) {
         // Add a ResourceConfig per bundle.
         $this->all = array_merge($this->all, array_map(function ($bundle) use ($entity_type_id) {
-          $resource_config = new ResourceConfig($this->entityTypeManager);
-          $resource_config->setEntityTypeId($entity_type_id);
-          $resource_config->setBundleId($bundle);
-          $resource_config->setPath(sprintf('/%s/%s', $entity_type_id, $bundle));
-          $resource_config->setTypeName(sprintf('%s--%s', $entity_type_id, $bundle));
+          $resource_config = new ResourceConfig(
+            $entity_type_id,
+            $bundle,
+            sprintf('/%s/%s', $entity_type_id, $bundle),
+            sprintf('%s--%s', $entity_type_id, $bundle),
+            $this->entityTypeManager->getDefinition($entity_type_id)->getClass()
+          );
           return $resource_config;
         }, array_keys($this->bundleManager->getBundleInfo($entity_type_id))));
       }
diff --git a/src/Normalizer/EntityNormalizer.php b/src/Normalizer/EntityNormalizer.php
index 63ba6b3..7af2971 100644
--- a/src/Normalizer/EntityNormalizer.php
+++ b/src/Normalizer/EntityNormalizer.php
@@ -142,7 +142,9 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface,
       $data[$bundle_key] = $bundle_id;
     }
 
-    return $resource_config->getStorage()->create($data);
+    return $this->currentContext->getResourceManager()
+      ->getEntityTypeManager()
+      ->getStorage($resource_config->getEntityTypeId())->create($data);
   }
 
   /**
diff --git a/tests/src/Kernel/Normalizer/JsonApiDocumentTopLevelNormalizerTest.php b/tests/src/Kernel/Normalizer/JsonApiDocumentTopLevelNormalizerTest.php
index 7ab362b..be89834 100644
--- a/tests/src/Kernel/Normalizer/JsonApiDocumentTopLevelNormalizerTest.php
+++ b/tests/src/Kernel/Normalizer/JsonApiDocumentTopLevelNormalizerTest.php
@@ -570,8 +570,6 @@ class JsonApiDocumentTopLevelNormalizerTest extends JsonapiKernelTestBase {
       ->getClass();
     $resource_config->getDeserializationTargetClass()
       ->willReturn($serialization_class);
-    $resource_config->getStorage()
-      ->willReturn($entity_type_manager->getStorage($entity_type_id));
     /* @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */
     $request_stack = $this->container->get('request_stack');
     $request_stack->push($request);
diff --git a/tests/src/Unit/Configuration/ResourceConfigTest.php b/tests/src/Unit/Configuration/ResourceConfigTest.php
deleted file mode 100644
index cdac160..0000000
--- a/tests/src/Unit/Configuration/ResourceConfigTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace Drupal\Tests\jsonapi\Unit\Configuration;
-
-use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Config\ImmutableConfig;
-use Drupal\Core\Entity\EntityTypeManagerInterface;
-use Drupal\jsonapi\Configuration\ResourceConfig;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * Class ResourceConfigTest.
- *
- * @package \Drupal\jsonapi\Test\Unit
- *
- * @coversDefaultClass \Drupal\jsonapi\Configuration\ResourceConfig
- *
- * @group jsonapi
- */
-class ResourceConfigTest extends UnitTestCase {
-
-  /**
-   * Test setters and getters.
-   *
-   * @covers ::setTypeName
-   * @covers ::getTypeName
-   * @covers ::setPath
-   * @covers ::getPath
-   * @covers ::setBundleId
-   * @covers ::getBundleId
-   *
-   * @dataProvider settersAndGettersProvider
-   */
-  public function testSettersAndGetters($mutator, $accessor, $value) {
-    $entity_type_manager = $this->prophesize(EntityTypeManagerInterface::class);
-    $resource_config = new ResourceConfig($entity_type_manager->reveal());
-    $resource_config->{$mutator}($value);
-    $this->assertEquals($value, $resource_config->{$accessor}());
-  }
-
-  /**
-   * Provider for the setters test.
-   *
-   * @return array
-   *   The data.
-   */
-  public function settersAndGettersProvider() {
-    return [
-      ['setTypeName', 'getTypeName', $this->getRandomGenerator()->name()],
-      ['setPath', 'getPath', $this->getRandomGenerator()->name()],
-      ['setBundleId', 'getBundleId', $this->getRandomGenerator()->name()],
-    ];
-  }
-
-}
diff --git a/tests/src/Unit/Context/CurrentContextTest.php b/tests/src/Unit/Context/CurrentContextTest.php
index cdb8173..14c2f60 100644
--- a/tests/src/Unit/Context/CurrentContextTest.php
+++ b/tests/src/Unit/Context/CurrentContextTest.php
@@ -14,6 +14,7 @@ use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\node\NodeInterface;
 use Drupal\Tests\UnitTestCase;
 
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@@ -81,7 +82,7 @@ class CurrentContextTest extends UnitTestCase {
 
     // Create a mock for the ResourceManager service.
     $resource_prophecy = $this->prophesize(ResourceManagerInterface::CLASS);
-    $resource_config = new ResourceConfig($this->prophesize(EntityTypeManagerInterface::CLASS)->reveal());
+    $resource_config = new ResourceConfig('node', 'article', '/node/article', 'node--article', NodeInterface::class);
     $resource_prophecy->get('node', 'article')->willReturn($resource_config);
     $this->resourceManager = $resource_prophecy->reveal();
 
