diff --git a/core/core.services.yml b/core/core.services.yml
index 6127c8f..3bae441 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -568,7 +568,7 @@ services:
     class: Symfony\Component\HttpKernel\HttpKernel
     arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack']
   http_negotiation.format_negotiator:
-    class: Drupal\Core\ContentNegotiation
+    class: Drupal\Core\FormatMapping
     private: true
   http_middleware.negotiation:
     class: Drupal\Core\StackMiddleware\NegotiationMiddleware
diff --git a/core/lib/Drupal/Core/ContentNegotiation.php b/core/lib/Drupal/Core/FormatMapping.php
similarity index 88%
rename from core/lib/Drupal/Core/ContentNegotiation.php
rename to core/lib/Drupal/Core/FormatMapping.php
index 857f9d5..3b3166c 100644
--- a/core/lib/Drupal/Core/ContentNegotiation.php
+++ b/core/lib/Drupal/Core/FormatMapping.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\Core\ContentNegotiation.
+ * Definition of Drupal\Core\FormatMapping.
  */
 
 namespace Drupal\Core;
@@ -15,7 +15,7 @@
  * @todo Replace this class with a real content negotiation library based on
  *   mod_negotiation. Development of that is a work in progress.
  */
-class ContentNegotiation {
+class FormatMapping {
 
   /**
    * Gets the normalized type of a request.
@@ -36,12 +36,15 @@ public function getContentType(Request $request) {
       return 'iframeupload';
     }
 
+    if ($type = $request->query->get('dataType')) {
+      return 'drupal_' . $type;
+    }
+
     // Check all formats, if priority format is found return it.
     $first_found_format = FALSE;
-    $priority = array('html', 'drupal_ajax', 'drupal_modal', 'drupal_dialog');
     foreach ($request->getAcceptableContentTypes() as $mime_type) {
       $format = $request->getFormat($mime_type);
-      if (in_array($format, $priority, TRUE)) {
+      if ($format === 'html') {
         return $format;
       }
       if (!is_null($format) && !$first_found_format) {
diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php
index 0283333..ba47f97 100644
--- a/core/lib/Drupal/Core/Render/Element/RenderElement.php
+++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php
@@ -240,7 +240,6 @@ public static function preRenderAjaxForm($element) {
       $settings += array(
         'url' => isset($settings['callback']) ? Url::fromRoute('system.ajax') : NULL,
         'options' => array(),
-        'accepts' => 'application/vnd.drupal-ajax'
       );
 
       // @todo Legacy support. Remove in Drupal 8.
diff --git a/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php b/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php
index 295857d..8fa0173 100644
--- a/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php
+++ b/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\StackMiddleware;
 
-use Drupal\Core\ContentNegotiation;
+use Drupal\Core\FormatMapping;
 use Drupal\Core\ContentNegotiationInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\HttpKernelInterface;
@@ -29,7 +29,7 @@ class NegotiationMiddleware implements HttpKernelInterface {
   /**
    * The content negotiator.
    *
-   * @var \Drupal\Core\ContentNegotiation
+   * @var \Drupal\Core\FormatMapping
    */
   protected $negotiator;
 
@@ -45,10 +45,10 @@ class NegotiationMiddleware implements HttpKernelInterface {
    *
    * @param \Symfony\Component\HttpKernel\HttpKernelInterface $app
    *   The wrapper HTTP kernel
-   * @param \Drupal\Core\ContentNegotiation $negotiator
+   * @param \Drupal\Core\FormatMapping $negotiator
    *   The content negotiator.
    */
-  public function __construct(HttpKernelInterface $app, ContentNegotiation $negotiator) {
+  public function __construct(HttpKernelInterface $app, FormatMapping $negotiator) {
     $this->app = $app;
     $this->negotiator = $negotiator;
   }
diff --git a/core/misc/ajax.js b/core/misc/ajax.js
index 91e8e1c..c788c16 100644
--- a/core/misc/ajax.js
+++ b/core/misc/ajax.js
@@ -52,7 +52,7 @@
           element_settings.url = $(this).attr('href');
           element_settings.event = 'click';
         }
-        element_settings.accepts = $(this).data('accepts');
+        element_settings.dialogType = $(this).data('dialog-type');
         element_settings.dialog = $(this).data('dialog-options');
         var baseUseAjax = $(this).attr('id');
         Drupal.ajax[baseUseAjax] = new Drupal.ajax(baseUseAjax, this, element_settings);
@@ -248,15 +248,15 @@
         }
       },
       dataType: 'json',
-      accepts: {
-        json: element_settings.accepts || 'application/vnd.drupal-ajax'
-      },
       type: 'POST'
     };
 
     if (element_settings.dialog) {
       ajax.options.data.dialogOptions = element_settings.dialog;
     }
+    if (element_settings.dialogType) {
+      ajax.options.url += '?dataType=' + element_settings.dialogType;
+    }
 
     // Bind the ajaxSubmit function to the element event.
     $(ajax.element).on(element_settings.event, function (event) {
diff --git a/core/modules/block/src/BlockListBuilder.php b/core/modules/block/src/BlockListBuilder.php
index 6521287..913b718 100644
--- a/core/modules/block/src/BlockListBuilder.php
+++ b/core/modules/block/src/BlockListBuilder.php
@@ -362,7 +362,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
         ]),
         'attributes' => array(
           'class' => array('use-ajax', 'block-filter-text-source'),
-          'data-accepts' => 'application/vnd.drupal-modal',
+          'data-dialog-type' => 'modal',
           'data-dialog-options' => Json::encode(array(
             'width' => 700,
           )),
diff --git a/core/modules/ckeditor/js/ckeditor.js b/core/modules/ckeditor/js/ckeditor.js
index 1596808..5d9e969 100644
--- a/core/modules/ckeditor/js/ckeditor.js
+++ b/core/modules/ckeditor/js/ckeditor.js
@@ -161,7 +161,7 @@
       var $content = $('<div class="ckeditor-dialog-loading"><span style="top: -40px;" class="ckeditor-dialog-loading-link"><a>' + Drupal.t('Loading...') + '</a></span></div>');
       $content.appendTo($target);
       new Drupal.ajax('ckeditor-dialog', $content.find('a').get(0), {
-        accepts: 'application/vnd.drupal-modal',
+        dialogType: 'modal',
         dialog: dialogSettings,
         selector: '.ckeditor-dialog-loading-link',
         url: url,
diff --git a/core/modules/config/src/Form/ConfigSync.php b/core/modules/config/src/Form/ConfigSync.php
index b97218b..0a91758 100644
--- a/core/modules/config/src/Form/ConfigSync.php
+++ b/core/modules/config/src/Form/ConfigSync.php
@@ -281,7 +281,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
             'url' => Url::fromRoute($route_name, $route_options),
             'attributes' => array(
               'class' => array('use-ajax'),
-              'data-accepts' => 'application/vnd.drupal-modal',
+              'data-dialog-type' => 'modal',
               'data-dialog-options' => json_encode(array(
                 'width' => 700
               )),
diff --git a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
index b54b823..ba261cb 100644
--- a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
+++ b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
@@ -133,7 +133,7 @@ public function dialog() {
           'url' => Url::fromRoute('ajax_test.dialog_contents'),
           'attributes' => array(
             'class' => array('use-ajax'),
-            'data-accepts' => 'application/vnd.drupal-modal',
+            'data-dialog-type' => 'modal',
             'data-dialog-options' => json_encode(array(
               'width' => 400,
             ))
@@ -144,7 +144,7 @@ public function dialog() {
           'url' => Url::fromRoute('ajax_test.dialog_contents'),
           'attributes' => array(
             'class' => array('use-ajax'),
-            'data-accepts' => 'application/vnd.drupal-dialog',
+            'data-dialog-type' => 'dialog',
             'data-dialog-options' => json_encode(array(
               'target' => 'ajax-test-dialog-wrapper-1',
               'width' => 800,
@@ -163,7 +163,7 @@ public function dialog() {
           'url' => Url::fromRoute('ajax_test.dialog_form'),
           'attributes' => array(
             'class' => array('use-ajax'),
-            'data-accepts' => 'application/vnd.drupal-modal',
+            'data-dialog-type' => 'modal',
           ),
         ),
         'link6' => array(
@@ -171,7 +171,7 @@ public function dialog() {
           'url' => Url::fromRoute('contact.form_add'),
           'attributes' => array(
             'class' => array('use-ajax'),
-            'data-accepts' => 'application/vnd.drupal-modal',
+            'data-dialog-type' => 'modal',
             'data-dialog-options' => json_encode(array(
               'width' => 800,
               'height' => 500,
@@ -183,7 +183,7 @@ public function dialog() {
           'url' => Url::fromRoute('ajax_test.dialog_contents'),
           'attributes' => array(
             'class' => array('use-ajax'),
-            'data-accepts' => 'application/vnd.drupal-dialog',
+            'data-dialog-type' => 'dialog',
             'data-dialog-options' => json_encode(array(
               'width' => 800,
             ))
diff --git a/core/tests/Drupal/Tests/Core/ContentNegotiationTest.php b/core/tests/Drupal/Tests/Core/ContentNegotiationTest.php
index e411008..36921e8 100644
--- a/core/tests/Drupal/Tests/Core/ContentNegotiationTest.php
+++ b/core/tests/Drupal/Tests/Core/ContentNegotiationTest.php
@@ -7,18 +7,18 @@
 
 namespace Drupal\Tests\Core;
 
-use Drupal\Core\ContentNegotiation;
+use Drupal\Core\FormatMapping;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * @coversDefaultClass \Drupal\Core\ContentNegotiation
- * @group ContentNegotiation
+ * @coversDefaultClass \Drupal\Core\FormatMapping
+ * @group FormatMapping
  */
 class ContentNegotiationTest extends UnitTestCase {
 
   /**
-   * @var \Drupal\Core\ContentNegotiation
+   * @var \Drupal\Core\FormatMapping
    */
   protected $contentNegotiation;
 
@@ -28,7 +28,7 @@ class ContentNegotiationTest extends UnitTestCase {
   protected function setUp() {
     parent::setUp();
 
-    $this->contentNegotiation = new ContentNegotiation;
+    $this->contentNegotiation = new FormatMapping;
   }
 
   /**
