diff --git a/README.md b/README.md
index ab01a11..9cce82f 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ Unlike the core REST module JSON API doesn't really require any kind of configur
 The jsonapi module exposes both config and content entity resources. On top of that it exposes one resource per bundle per entity. The default format appears like: `/jsonapi/{entity_type}/{bundle}/{uuid}?_format=api_json`
 
 The list of endpoints then looks like the following:
-* `/jsonapi/node/article?_format=api_json`: Exposes a collection of article content
-* `/jsonapi/node/article/{UUID}?_format=api_json`: Exposes an individual article
-* `/jsonapi/block?_format=api_json`: Exposes a collection of blocks
-* `/jsonapi/block/{block}?_format=api_json`: Exposes an individual block
+* `/jsonapi/node/article`: Exposes a collection of article content
+* `/jsonapi/node/article/{UUID}`: Exposes an individual article
+* `/jsonapi/block`: Exposes a collection of blocks
+* `/jsonapi/block/{block}`: Exposes an individual block
diff --git a/src/Controller/EntryPoint.php b/src/Controller/EntryPoint.php
index 9233ef4..c5a322f 100644
--- a/src/Controller/EntryPoint.php
+++ b/src/Controller/EntryPoint.php
@@ -65,8 +65,7 @@ class EntryPoint extends ControllerBase {
     /** @var \Drupal\Core\Cache\CacheableResponseInterface $response */
     $do_build_urls = function () {
       $self = Url::fromRoute('jsonapi.resource_list')
-        ->setOption('absolute', TRUE)
-        ->setOption('query', ['_format' => 'api_json']);
+        ->setOption('absolute', TRUE);
 
       return array_reduce($this->resourceTypeRepository->all(), function (array $carry, ResourceType $resource_type) {
         // TODO: Learn how to invalidate the cache for this page when a new entity
@@ -74,7 +73,6 @@ class EntryPoint extends ControllerBase {
         // $this->response->addCacheableDependency($definition);
         $url = Url::fromRoute(sprintf('jsonapi.%s.collection', $resource_type->getTypeName()));
         $url->setOption('absolute', TRUE);
-        $url->setOption('query', ['_format' => 'api_json']);
         $carry[$resource_type->getTypeName()] = $url->toString();
 
         return $carry;
diff --git a/src/Controller/RequestHandler.php b/src/Controller/RequestHandler.php
index 4c4fb5a..488ef06 100644
--- a/src/Controller/RequestHandler.php
+++ b/src/Controller/RequestHandler.php
@@ -15,6 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerAwareTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\HttpException;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\Serializer\Exception\UnexpectedValueException;
 use Symfony\Component\Serializer\SerializerInterface;
@@ -58,7 +59,12 @@ class RequestHandler implements ContainerAwareInterface, ContainerInjectionInter
     /* @var \Drupal\jsonapi\Context\CurrentContext $current_context */
     $current_context = $this->container->get('jsonapi.current_context');
     $unserialized = $this->deserializeBody($request, $serializer, $route->getOption('serialization_class'), $current_context);
+
+    // Only the api_json format is supported.
     $format = $request->getRequestFormat();
+    if ($format != 'html' && $format !== 'api_json') {
+      throw new HttpException(415, 'JSON API routes only support the api_json format.');
+    }
     if ($unserialized instanceof Response && !$unserialized->isSuccessful()) {
       return $unserialized;
     }
@@ -102,7 +108,7 @@ class RequestHandler implements ContainerAwareInterface, ContainerInjectionInter
     }
     $error_handler->restore();
 
-    return $this->renderJsonApiResponse($request, $response, $serializer, $format, $error_handler);
+    return $this->renderJsonApiResponse($request, $response, $serializer, 'api_json', $error_handler);
   }
 
   /**
diff --git a/src/EventSubscriber/DefaultExceptionSubscriber.php b/src/EventSubscriber/DefaultExceptionSubscriber.php
index 1d2f71a..afd504b 100644
--- a/src/EventSubscriber/DefaultExceptionSubscriber.php
+++ b/src/EventSubscriber/DefaultExceptionSubscriber.php
@@ -4,6 +4,7 @@ namespace Drupal\jsonapi\EventSubscriber;
 
 use Drupal\jsonapi\Exception\SerializableHttpException;
 use Drupal\serialization\EventSubscriber\DefaultExceptionSubscriber as SerializationDefaultExceptionSubscriber;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\Exception\HttpException;
@@ -33,8 +34,8 @@ class DefaultExceptionSubscriber extends SerializationDefaultExceptionSubscriber
   public function onException(GetResponseForExceptionEvent $event) {
     /** @var \Symfony\Component\HttpKernel\Exception\HttpException $exception */
     $exception = $event->getException();
-    $format = $event->getRequest()->getRequestFormat();
-    if ($format !== 'api_json') {
+    $route = $event->getRequest()->get(RouteObjectInterface::ROUTE_OBJECT);
+    if (!$route || !$route->getOption('_is_jsonapi')) {
       return;
     }
     if (!$exception instanceof HttpException) {
@@ -51,12 +52,13 @@ class DefaultExceptionSubscriber extends SerializationDefaultExceptionSubscriber
   protected function setEventResponse(GetResponseForExceptionEvent $event, $status) {
     /** @var \Symfony\Component\HttpKernel\Exception\HttpException $exception */
     $exception = $event->getException();
-    $format = $event->getRequest()->getRequestFormat();
-    if ($format !== 'api_json') {
+    $route = $event->getRequest()->get(RouteObjectInterface::ROUTE_OBJECT);
+    if (!$route || !$route->getOption('_is_jsonapi')) {
       return;
     }
-    $encoded_content = $this->serializer->serialize($exception, $format, ['data_wrapper' => 'errors']);
+    $encoded_content = $this->serializer->serialize($exception, 'api_json', ['data_wrapper' => 'errors']);
     $response = new Response($encoded_content, $status);
+    $response->headers->set('content-type', 'application/vnd.api+json');
     $event->setResponse($response);
   }
 
diff --git a/src/LinkManager/LinkManager.php b/src/LinkManager/LinkManager.php
index b3f6d03..35f95ae 100644
--- a/src/LinkManager/LinkManager.php
+++ b/src/LinkManager/LinkManager.php
@@ -57,7 +57,6 @@ class LinkManager {
   public function getEntityLink($entity_id, ResourceType $resource_type, array $route_parameters, $key) {
     $route_parameters += [
       $resource_type->getEntityTypeId() => $entity_id,
-      '_format' => 'api_json',
     ];
     $route_key = sprintf('jsonapi.%s.%s', $resource_type->getTypeName(), $key);
     return $this->urlGenerator->generateFromRoute($route_key, $route_parameters, ['absolute' => TRUE]);
diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php
index aaeb28e..00b49b7 100644
--- a/src/Routing/Routes.php
+++ b/src/Routing/Routes.php
@@ -84,7 +84,6 @@ class Routes implements ContainerInjectionInterface {
       RouteObjectInterface::CONTROLLER_NAME => '\Drupal\jsonapi\Controller\EntryPoint::index',
     ]))
       ->setRequirement('_permission', 'access jsonapi resource list')
-      ->setRequirement('_format', 'api_json')
       ->setMethods(['GET']);
     $route_collection->addOptions([
       '_auth' => $this->authProviderList(),
@@ -120,7 +119,6 @@ class Routes implements ContainerInjectionInterface {
         ->setRequirement('_entity_type', $resource_type->getEntityTypeId())
         ->setRequirement('_bundle', $resource_type->getBundle())
         ->setRequirement('_permission', 'access content')
-        ->setRequirement('_format', 'api_json')
         ->setRequirement('_jsonapi_custom_query_parameter_names', 'TRUE')
         ->setOption('serialization_class', JsonApiDocumentTopLevel::class)
         ->setMethods(['GET', 'POST']);
@@ -134,7 +132,6 @@ class Routes implements ContainerInjectionInterface {
         ->setRequirement('_entity_type', $resource_type->getEntityTypeId())
         ->setRequirement('_bundle', $resource_type->getBundle())
         ->setRequirement('_permission', 'access content')
-        ->setRequirement('_format', 'api_json')
         ->setRequirement('_jsonapi_custom_query_parameter_names', 'TRUE')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
@@ -148,7 +145,6 @@ class Routes implements ContainerInjectionInterface {
         ->setRequirement('_entity_type', $resource_type->getEntityTypeId())
         ->setRequirement('_bundle', $resource_type->getBundle())
         ->setRequirement('_permission', 'access content')
-        ->setRequirement('_format', 'api_json')
         ->setRequirement('_jsonapi_custom_query_parameter_names', 'TRUE')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
@@ -161,7 +157,6 @@ class Routes implements ContainerInjectionInterface {
         ->setRequirement('_entity_type', $resource_type->getEntityTypeId())
         ->setRequirement('_bundle', $resource_type->getBundle())
         ->setRequirement('_permission', 'access content')
-        ->setRequirement('_format', 'api_json')
         ->setRequirement('_jsonapi_custom_query_parameter_names', 'TRUE')
         ->setOption('parameters', $parameters)
         ->setOption('_auth', $this->authProviderList())
diff --git a/tests/src/Functional/JsonApiFunctionalTestBase.php b/tests/src/Functional/JsonApiFunctionalTestBase.php
index 18a0acd..1a648f3 100644
--- a/tests/src/Functional/JsonApiFunctionalTestBase.php
+++ b/tests/src/Functional/JsonApiFunctionalTestBase.php
@@ -150,17 +150,6 @@ abstract class JsonApiFunctionalTestBase extends BrowserTestBase {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  protected function drupalGet($path, array $options = array(), array $headers = array()) {
-    // Make sure we don't forget the format parameter.
-    $options += ['query' => []];
-    $options['query'] += ['_format' => 'api_json'];
-
-    return parent::drupalGet($path, $options, $headers);
-  }
-
-  /**
    * Performs a HTTP request. Wraps the Guzzle HTTP client.
    *
    * Why wrap the Guzzle HTTP client? Because any error response is returned via
@@ -178,7 +167,6 @@ abstract class JsonApiFunctionalTestBase extends BrowserTestBase {
    * @return \Psr\Http\Message\ResponseInterface
    */
   protected function request($method, Url $url, array $request_options) {
-    $url->setOption('query', ['_format' => 'api_json']);
     try {
       $response = $this->httpClient->request($method, $url->toString(), $request_options);
     }
diff --git a/tests/src/Functional/RestJsonApiFormatUnsupported.php b/tests/src/Functional/RestJsonApiFormatUnsupported.php
deleted file mode 100644
index 1c7d783..0000000
--- a/tests/src/Functional/RestJsonApiFormatUnsupported.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-namespace Drupal\Tests\jsonapi\Functional;
-
-use Drupal\Component\Serialization\Json;
-use Drupal\Core\Url;
-use Drupal\node\Entity\Node;
-use Drupal\node\Entity\NodeType;
-use Drupal\Tests\rest\Functional\AnonResourceTestTrait;
-use Drupal\Tests\rest\Functional\ResourceTestBase;
-
-/**
- * @group jsonapi
- */
-class RestJsonApiFormatUnsupported extends ResourceTestBase {
-
-  use AnonResourceTestTrait;
-
-  /**
-   * {@inheritdoc}
-   */
-  public static $modules = ['jsonapi', 'node'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $format = 'api_json';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $mimeType = 'application/vnd.api+json';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpAuthorization($method) {
-    $this->grantPermissionsToTestedRole(['access content']);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    parent::setUp();
-
-    // Set up a HTTP client that accepts relative URLs.
-    $this->httpClient = $this->container->get('http_client_factory')
-      ->fromOptions(['base_uri' => $this->baseUrl]);
-
-    // Create a "Camelids" node type.
-    NodeType::create([
-      'name' => 'Camelids',
-      'type' => 'camelids',
-    ])->save();
-
-    // Create a "Llama" node.
-    $node = Node::create(['type' => 'camelids']);
-    $node->setTitle('Llama')
-      ->setOwnerId(0)
-      ->setPublished(TRUE)
-      ->save();
-  }
-
-  /**
-   * Tests that JSON API is not supported
-   */
-  public function testJsonApiFormatNotSupportedInRest() {
-    // First, verify that 'api_json' does not appear in the 'serializer.foramts'
-    // container parameter, which is what the REST module uses to determine
-    // which formats it supports.
-    $this->assertSame(['json', 'xml'], $this->container->getParameter('serializer.formats'));
-
-    // Second, verify that provisioning a REST resource that lists 'api_json' as
-    // one of its formats
-    $this->provisionResource('entity.node', ['api_json'], []);
-    $this->setUpAuthorization('GET');
-    $url = Node::load(1)->toUrl()->setOption('query', ['_format' => 'api_json']);
-    $response = $this->request('GET', $url, []);
-    $expected_body = Json::encode([
-      'errors' => [
-        [
-          'title' => 'Not Acceptable',
-          'status' => 406,
-          'detail' => 'Not acceptable format: api_json',
-          'links' => [
-            'info' => 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7',
-          ],
-          'code' => 0,
-        ],
-      ],
-    ]);
-    $this->assertResourceResponse(406, $expected_body, $response);
-  }
-
-  protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {}
-  protected function getExpectedUnauthorizedAccessMessage($method) {}
-  protected function getExpectedBcUnauthorizedAccessMessage($method) {}
-
-}
diff --git a/tests/src/Functional/RestJsonApiUnsupported.php b/tests/src/Functional/RestJsonApiUnsupported.php
index 18e0878..84ec1d8 100644
--- a/tests/src/Functional/RestJsonApiUnsupported.php
+++ b/tests/src/Functional/RestJsonApiUnsupported.php
@@ -82,20 +82,7 @@ class RestJsonApiUnsupported extends ResourceTestBase {
     $request_options = [];
 
     $response = $this->request('GET', $url, $request_options);
-    $expected_body = Json::encode([
-      'errors' => [
-        [
-          'title' => 'Not Acceptable',
-          'status' => 406,
-          'detail' => 'Not acceptable format: api_json',
-          'links' => [
-            'info' => 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7',
-          ],
-          'code' => 0,
-        ],
-      ],
-    ]);
-    $this->assertResourceResponse(406, $expected_body, $response);
+    $this->assertResourceErrorResponse(406, FALSE, $response);
   }
 
   protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {}
