diff --git a/src/Configuration/ResourceManager.php b/src/Configuration/ResourceManager.php
index cc3fc9f..64fb6ed 100644
--- a/src/Configuration/ResourceManager.php
+++ b/src/Configuration/ResourceManager.php
@@ -66,6 +66,13 @@ class ResourceManager implements ResourceManagerInterface {
       return $this->all;
     }
     $entity_type_ids = array_keys($this->entityTypeManager->getDefinitions());
+    $this->all = array_map(function ($entity_type_id) {
+      $resource_config = new ResourceConfig($this->configFactory, $this->entityTypeManager);
+      $resource_config->setEntityTypeId($entity_type_id);
+      $resource_config->setPath(sprintf('/%s', $entity_type_id));
+      $resource_config->setTypeName(sprintf('%s', $entity_type_id));
+      return $resource_config;
+    }, $entity_type_ids);
     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) {
@@ -84,7 +91,7 @@ class ResourceManager implements ResourceManagerInterface {
    * {@inheritdoc}
    */
   public function get($entity_type_id, $bundle_id) {
-    if (!$entity_type_id || !$bundle_id) {
+    if (empty($entity_type_id)) {
       throw new PreconditionFailedHttpException('Server error. The current route is malformed.');
     }
     foreach ($this->all() as $resource) {
diff --git a/src/Context/CurrentContext.php b/src/Context/CurrentContext.php
index aada1a4..a1d7411 100644
--- a/src/Context/CurrentContext.php
+++ b/src/Context/CurrentContext.php
@@ -76,9 +76,6 @@ class CurrentContext implements CurrentContextInterface {
     if (!isset($this->resourceConfig)) {
       $entity_type_id = $this->getCurrentRoute()->getRequirement('_entity_type');
       $bundle_id = $this->getCurrentRoute()->getRequirement('_bundle');
-      if (empty($entity_type_id) ||empty($bundle_id)) {
-        throw new PreconditionRequiredHttpException('Entity type and bundle are required.');
-      }
       $this->resourceConfig = $this->resourceManager
         ->get($entity_type_id, $bundle_id);
     }
diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php
index 62384ac..1c0b7c1 100644
--- a/src/Normalizer/ContentEntityNormalizer.php
+++ b/src/Normalizer/ContentEntityNormalizer.php
@@ -4,6 +4,7 @@ namespace Drupal\jsonapi\Normalizer;
 
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Field\EntityReferenceFieldItemList;
+use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\jsonapi\Configuration\ResourceConfigInterface;
 use Drupal\jsonapi\Context\CurrentContextInterface;
 use Drupal\jsonapi\LinkManager\LinkManagerInterface;
@@ -120,7 +121,7 @@ class ContentEntityNormalizer extends NormalizerBase implements DenormalizerInte
       ->getEntityTypeManager()
       ->getDefinition($resource_config->getEntityTypeId())
       ->getKey('bundle');
-    if ($bundle_key) {
+    if ($bundle_key && $bundle_id) {
       $data[$bundle_key] = $bundle_id;
     }
 
@@ -152,7 +153,17 @@ class ContentEntityNormalizer extends NormalizerBase implements DenormalizerInte
    */
   protected function getFields($entity) {
     /* @var \Drupal\Core\Entity\ContentEntityInterface $entity */
-    return $entity->getFields();
+    $fields = $entity->getFields();
+    if (!$this->currentContext->getResourceConfig()->getBundleId()) {
+      // If this request if for the base entity, then strip all fields attached to a specific bundles. That way all the
+      // entity requests will look the same regardless of their bundle. If you need the information about the fields
+      // attached to the bundle, you can request the whole entity by using the bundle resource. As a shortcut, all
+      // entity resources contain a fake relationship to the bundle specific resource.
+      $fields = array_filter($fields, function (FieldItemListInterface $field) {
+        return (bool) !$field->getDataDefinition()->getTargetBundle();
+      });
+    }
+    return $fields;
   }
 
 
diff --git a/src/Resource/EntityResource.php b/src/Resource/EntityResource.php
index 4402ef7..9d72994 100644
--- a/src/Resource/EntityResource.php
+++ b/src/Resource/EntityResource.php
@@ -416,9 +416,10 @@ class EntityResource implements EntityResourceInterface {
     $query = $this->queryBuilder->newQuery($entity_type, $params);
 
     // Limit this query to the bundle type for this resource.
-    if ($bundle_key = $entity_type->getKey('bundle')) {
+    $bundle_id = $this->resourceConfig->getBundleId();
+    if ($bundle_id && ($bundle_key = $entity_type->getKey('bundle'))) {
       $query->condition(
-        $bundle_key, $this->resourceConfig->getBundleId()
+        $bundle_key, $bundle_id
       );
     }
 
diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php
index d3f27ac..3a844e6 100644
--- a/src/Routing/Routes.php
+++ b/src/Routing/Routes.php
@@ -81,6 +81,7 @@ class Routes implements ContainerInjectionInterface {
       $global_config = $resource->getGlobalConfig();
       $prefix = $global_config->get('prefix');
       $entity_type = $resource->getEntityTypeId();
+      // For the entity type resources the bundle is NULL.
       $bundle = $resource->getBundleId();
       $partial_path = '/' . $prefix . $resource->getPath();
       $route_key = sprintf('%s.dynamic.%s.', $prefix, $resource->getTypeName());
@@ -90,51 +91,63 @@ class Routes implements ContainerInjectionInterface {
       ];
 
       // Collection endpoint, like /api/photos.
-      $collection->add($route_key . 'collection', (new Route($partial_path))
+      $route_collection = (new Route($partial_path))
         ->addDefaults($defaults)
         ->setRequirement('_entity_type', $entity_type)
-        ->setRequirement('_bundle', $bundle)
         ->setRequirement('_permission', 'access content')
         ->setRequirement('_format', 'api_json')
         ->setOption('_auth', $this->authProviderList())
         ->setOption('serialization_class', DocumentWrapperInterface::class)
-        ->setMethods(['GET', 'POST']));
+        ->setMethods(['GET', 'POST']);
+      if ($bundle) {
+        $route_collection->setRequirement('_bundle', $bundle);
+      }
+      $collection->add($route_key . 'collection', $route_collection);
 
       // Individual endpoint, like /api/photos/123.
       $parameters = [$entity_type => ['type' => 'entity:' . $entity_type]];
-      $collection->add($route_key . 'individual', (new Route(sprintf('%s/{%s}', $partial_path, $entity_type)))
+      $route_individual = (new Route(sprintf('%s/{%s}', $partial_path, $entity_type)))
         ->addDefaults($defaults)
         ->setRequirement('_entity_type', $entity_type)
-        ->setRequirement('_bundle', $bundle)
         ->setRequirement('_permission', 'access content')
         ->setRequirement('_format', 'api_json')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
         ->setOption('serialization_class', DocumentWrapperInterface::class)
-        ->setMethods(['GET', 'PATCH', 'DELETE']));
-
-      // Related endpoint, like /api/photos/123/comments.
-      $collection->add($route_key . 'related', (new Route(sprintf('%s/{%s}/{related}', $partial_path, $entity_type)))
+        ->setMethods(['GET', 'PATCH', 'DELETE']);
+      if ($bundle) {
+        $route_individual->setRequirement('_bundle', $bundle);
+      }
+      $collection->add($route_key . 'individual', $route_individual);
+
+      // Related resource, like /api/photos/123/comments.
+      $route_related = (new Route(sprintf('%s/{%s}/{related}', $partial_path, $entity_type)))
         ->addDefaults($defaults)
         ->setRequirement('_entity_type', $entity_type)
-        ->setRequirement('_bundle', $bundle)
         ->setRequirement('_permission', 'access content')
         ->setRequirement('_format', 'api_json')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
-        ->setMethods(['GET']));
+        ->setMethods(['GET']);
+      if ($bundle) {
+        $route_related->setRequirement('_bundle', $bundle);
+      }
+      $collection->add($route_key . 'related', $route_related);
 
       // Related endpoint, like /api/photos/123/relationships/comments.
-      $collection->add($route_key . 'relationship', (new Route(sprintf('%s/{%s}/relationships/{related}', $partial_path, $entity_type)))
+      $route_relationship = (new Route(sprintf('%s/{%s}/relationships/{related}', $partial_path, $entity_type)))
         ->addDefaults($defaults + ['_on_relationship' => TRUE])
         ->setRequirement('_entity_type', $entity_type)
-        ->setRequirement('_bundle', $bundle)
         ->setRequirement('_permission', 'access content')
         ->setRequirement('_format', 'api_json')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
         ->setOption('serialization_class', EntityReferenceFieldItemList::class)
-        ->setMethods(['GET', 'POST', 'PATCH', 'DELETE']));
+        ->setMethods(['GET', 'POST', 'PATCH', 'DELETE']);
+      if ($bundle) {
+        $route_relationship->setRequirement('_bundle', $bundle);
+      }
+      $collection->add($route_key . 'relationship', $route_relationship);
     }
 
     return $collection;
diff --git a/tests/src/Kernel/Configuration/ResourceManagerTest.php b/tests/src/Kernel/Configuration/ResourceManagerTest.php
index 2fa8b99..433147e 100644
--- a/tests/src/Kernel/Configuration/ResourceManagerTest.php
+++ b/tests/src/Kernel/Configuration/ResourceManagerTest.php
@@ -66,14 +66,17 @@ class ResourceManagerTest extends KernelTestBase {
     // Make sure that there are resources being created.
     $all = $this->resourceManager->all();
     $this->assertNotEmpty($all);
-    // Get a random resource config.
-    $resource_config = $all[mt_rand(0, count($all) - 1)];
-    $this->assertNotEmpty($resource_config->getDeserializationTargetClass());
-    $this->assertNotEmpty($resource_config->getEntityTypeId());
-    $this->assertNotEmpty($resource_config->getBundleId());
-    $this->assertNotEmpty($resource_config->getGlobalConfig());
-    $this->assertNotEmpty($resource_config->getPath());
-    $this->assertNotEmpty($resource_config->getTypeName());
+    array_walk($all, function (ResourceConfigInterface $resource_config) {
+      $this->assertNotEmpty($resource_config->getDeserializationTargetClass());
+      $this->assertNotEmpty($resource_config->getEntityTypeId());
+      $this->assertNotEmpty($resource_config->getGlobalConfig());
+      $this->assertNotEmpty($resource_config->getTypeName());
+      $path = $resource_config->getPath();
+      if (!$resource_config->getBundleId()) {
+        $this->assertCount(1, explode('/', ltrim($path, '/')));
+      }
+      $this->assertNotEmpty($path);
+    });
   }
 
   /**
diff --git a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
index 6d7af6b..e614cd3 100644
--- a/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
+++ b/tests/src/Kernel/Normalizer/DocumentRootNormalizerTest.php
@@ -181,6 +181,62 @@ class DocumentRootNormalizerTest extends KernelTestBase {
   /**
    * @covers ::normalize
    */
+  public function testNormalizeNoBundle() {
+    $request = $this->prophesize(Request::class);
+    $query = $this->prophesize(ParameterBag::class);
+    $query->get('fields')->willReturn([]);
+    $query->get('include')->willReturn(NULL);
+    $query->getIterator()->willReturn(new \ArrayIterator());
+    $request->query = $query->reveal();
+    $route = $this->prophesize(Route::class);
+    $route->getPath()->willReturn('/node/{node}');
+    $route->getRequirement('_entity_type')->willReturn('node');
+    $route->getRequirement('_bundle')->willReturn(NULL);
+    $request->get(RouteObjectInterface::ROUTE_OBJECT)->willReturn($route->reveal());
+    $document_wrapper = $this->prophesize(DocumentWrapper::class);
+    $document_wrapper->getData()->willReturn($this->node);
+    $resource_config = $this->prophesize(ResourceConfigInterface::CLASS);
+    $resource_config->getTypeName()->willReturn('node');
+
+    // Make sure the route contains the entity type.
+    $current_context = $this->container->get('jsonapi.current_context');
+    $current_context->setCurrentRoute($route->reveal());
+
+    $this->container->set('jsonapi.current_context', $current_context);
+    $this->container->get('serializer');
+    $normalized = $this
+      ->container
+      ->get('serializer.normalizer.document_root.jsonapi')
+      ->normalize(
+        $document_wrapper->reveal(),
+        'api_json',
+        [
+          'request' => $request->reveal(),
+          'resource_config' => $resource_config->reveal(),
+        ]
+      );
+    $this->assertSame($normalized['data']['attributes']['title'], 'dummy_title');
+    $this->assertEquals($normalized['data']['id'], 1);
+    $this->assertSame([
+      'data' => [
+        'type' => 'node_type--node_type',
+        'id' => 'article',
+      ],
+      'links' => [
+        'self' => 'dummy_entity_link',
+        'related' => 'dummy_entity_link',
+      ],
+    ], $normalized['data']['relationships']['type']);
+    $this->assertTrue(isset($normalized['data']['attributes']['created']));
+    // The body field and field_tags are attached to the bundle, so they should not be present here.
+    $this->assertTrue(!isset($normalized['data']['attributes']['body']));
+    $this->assertTrue(!isset($normalized['data']['attributes']['field_tags']));
+    $this->assertSame('node', $normalized['data']['type']);
+  }
+
+  /**
+   * @covers ::normalize
+   */
   public function testNormalizeConfig() {
     $request = $this->prophesize(Request::class);
     $query = $this->prophesize(ParameterBag::class);
