diff --git a/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php b/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php
--- a/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php	
+++ b/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php	
@@ -128,7 +128,7 @@
    *   An array of commands ready to be returned as JSON.
    */
   protected function buildAttachmentsCommands(AjaxResponse $response, Request $request) {
-    $ajax_page_state = $request->request->get('ajax_page_state');
+    $ajax_page_state = $request->get('ajax_page_state');
 
     // Aggregate CSS/JS if necessary, but only during normal site operation.
     $optimize_css = !defined('MAINTENANCE_MODE') && $this->config->get('css.preprocess');
diff --git a/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php b/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php
--- a/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php	
+++ b/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php
@@ -65,7 +65,7 @@
    * {@inheritdoc}
    */
   public function applies(RouteMatchInterface $route_match) {
-    $ajax_page_state = $this->requestStack->getCurrentRequest()->request->get('ajax_page_state');
+    $ajax_page_state = $this->requestStack->getCurrentRequest()->get('ajax_page_state');
     return !empty($ajax_page_state['theme']) && isset($ajax_page_state['theme_token']);
  }

@@ -73,7 +73,7 @@
    * {@inheritdoc}
    */
   public function determineActiveTheme(RouteMatchInterface $route_match) {
-    $ajax_page_state = $this->requestStack->getCurrentRequest()->request->get('ajax_page_state');
+    $ajax_page_state = $this->requestStack->getCurrentRequest()->get('ajax_page_state');
     $theme = $ajax_page_state['theme'];
     $token = $ajax_page_state['theme_token'];

diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php
--- a/core/lib/Drupal/Core/Render/Element/RenderElement.php	
+++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php	
@@ -244,6 +244,7 @@
    *   - #ajax['event']
    *   - #ajax['prevent']
    *   - #ajax['url']
+   *   - #ajax['type']
    *   - #ajax['callback']
    *   - #ajax['options']
    *   - #ajax['wrapper']
@@ -340,6 +341,7 @@
       // to be substantially different for a JavaScript triggered submission.
       $settings += [
         'url' => NULL,
+        'type' => 'POST',
         'options' => ['query' => []],
         'dialogType' => 'ajax',
       ];
diff --git a/core/misc/ajax.js b/core/misc/ajax.js
--- a/core/misc/ajax.js
+++ b/core/misc/ajax.js
@@ -131,11 +131,19 @@
         elementSettings.url = href;
         elementSettings.event = 'click';
       }
+      const type = $linkElement.data('ajax-type');
+      /**
+       * In case of setting custom ajax type for link we rewrite ajax.type.
+       */
+      if (type) {
+        elementSettings.type = type;
+      }
       Drupal.ajax(elementSettings);
     });
   };
   Drupal.Ajax = function (base, element, elementSettings) {
     var defaults = {
+      type: 'POST',
       event: element ? 'mousedown' : null,
       keypress: true,
       selector: base ? "#".concat(base) : null,
@@ -223,7 +231,7 @@
       },
       dataType: 'json',
       jsonp: false,
-      type: 'POST'
+      type: ajax.type,
     };
     if (elementSettings.dialog) {
       ajax.options.data.dialogOptions = elementSettings.dialog;
diff --git a/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php b/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php
--- a/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php
+++ b/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\Core\Theme;
 
 use Drupal\Core\Access\CsrfTokenGenerator;
+use Drupal\Core\Http\InputBag;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Theme\AjaxBasePageNegotiator;
 use Drupal\Tests\UnitTestCase;
@@ -54,7 +55,10 @@
    * @dataProvider providerTestApplies
    */
   public function testApplies($request_data, $expected) {
-    $request = new Request([], $request_data);
+    $request = new Request();
+    foreach ($request_data as $key => $data) {
+      $request->query->set($key, $data);
+    }
     $route_match = RouteMatch::createFromRequest($request);
     $this->requestStack->push($request);
 
@@ -78,7 +82,8 @@
     $theme = 'claro';
     $theme_token = 'valid_theme_token';
 
-    $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
+    $request = new Request();
+    $request->query->set('ajax_page_state', ['theme' => $theme, 'theme_token' => $theme_token]);
     $this->requestStack->push($request);
     $route_match = RouteMatch::createFromRequest($request);
 
@@ -114,7 +119,9 @@
     // theme token. See system_js_settings_alter().
     $theme_token = '';
 
-    $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
+    $request = new Request([]);
+    $request->query->set('ajax_page_state', ['theme' => $theme, 'theme_token' => $theme_token]);
+    $request->request = new InputBag($request->request->all());
     $this->requestStack->push($request);
     $route_match = RouteMatch::createFromRequest($request);

diff --git a/core/modules/views/js/ajax_view.js b/core/modules/views/js/ajax_view.js
--- a/core/modules/views/js/ajax_view.js	
+++ b/core/modules/views/js/ajax_view.js	
@@ -47,6 +47,7 @@
     this.element_settings = {
       url: ajaxPath + queryString,
       submit: settings,
+      type: 'GET',
       setClick: true,
       event: 'click',
       selector: selector,
@@ -61,6 +62,7 @@
     var selfSettings = $.extend({}, this.element_settings, {
       event: 'RefreshView',
       base: this.selector,
+      type: 'GET',
       element: this.$view.get(0)
     });
     var self = this;
@@ -93,7 +95,8 @@
     var selfSettings = $.extend({}, this.element_settings, {
       submit: viewData,
       base: false,
-      element: link
+      element: link,
+      type: 'GET',
     });
     this.pagerAjax = Drupal.ajax(selfSettings);
   };
diff --git a/core/modules/views/src/Form/ViewsForm.php b/core/modules/views/src/Form/ViewsForm.php
--- a/core/modules/views/src/Form/ViewsForm.php	
+++ b/core/modules/views/src/Form/ViewsForm.php	
@@ -157,7 +157,7 @@
     $form = [];
 
     $query = $this->requestStack->getCurrentRequest()->query->all();
-    $query = UrlHelper::filterQueryParameters($query, [], '');
+    $query = UrlHelper::filterQueryParameters($query, ['_wrapper_format'], '');
 
     $options = ['query' => $query];
     $form['#action'] = $view->hasUrl() ? $view->getUrl()->setOptions($options)->toString() : Url::fromRoute('<current>')->setOptions($options)->toString();
diff --git a/core/modules/views/src/Controller/ViewAjaxController.php b/core/modules/views/src/Controller/ViewAjaxController.php
--- a/core/modules/views/src/Controller/ViewAjaxController.php	
+++ b/core/modules/views/src/Controller/ViewAjaxController.php	
@@ -111,10 +111,10 @@
    *   Thrown when the view was not found.
    */
   public function ajaxView(Request $request) {
-    $name = $request->request->get('view_name');
-    $display_id = $request->request->get('view_display_id');
+    $name = $request->get('view_name');
+    $display_id = $request->get('view_display_id');
     if (isset($name) && isset($display_id)) {
-      $args = $request->request->get('view_args', '');
+      $args = $request->get('view_args', '');
       $args = $args !== '' ? explode('/', Html::decodeEntities($args)) : [];
 
       // Arguments can be empty, make sure they are passed on as NULL so that
@@ -123,10 +123,10 @@
         return ($arg == '' ? NULL : $arg);
       }, $args);
 
-      $path = $request->request->get('view_path');
-      $dom_id = $request->request->get('view_dom_id');
+      $path = $request->get('view_path');
+      $dom_id = $request->get('view_dom_id');
       $dom_id = isset($dom_id) ? preg_replace('/[^a-zA-Z0-9_-]+/', '-', $dom_id) : NULL;
-      $pager_element = $request->request->get('pager_element');
+      $pager_element = $request->get('pager_element');
       $pager_element = isset($pager_element) ? intval($pager_element) : NULL;
 
       $response = new ViewAjaxResponse();
@@ -163,10 +163,9 @@
           $this->currentPath->setPath('/' . ltrim($path, '/'), $request);
         }
 
-        // Add all POST data, because AJAX is always a post and many things,
+        // Add all POST data, because AJAX is sometimes a POST and many things,
         // such as tablesorts, exposed filters and paging assume GET.
         $request_all = $request->request->all();
-        unset($request_all['ajax_page_state']);
         $query_all = $request->query->all();
         $request->query->replace($request_all + $query_all);
 
@@ -189,16 +188,7 @@
         // Reuse the same DOM id so it matches that in drupalSettings.
         $view->dom_id = $dom_id;
 
-        $context = new RenderContext();
-        $preview = $this->renderer->executeInRenderContext($context, function () use ($view, $display_id, $args) {
-          return $view->preview($display_id, $args);
-        });
-        if (!$context->isEmpty()) {
-          $bubbleable_metadata = $context->pop();
-          BubbleableMetadata::createFromRenderArray($preview)
-            ->merge($bubbleable_metadata)
-            ->applyTo($preview);
-        }
+        $preview = $view->preview($display_id, $args);
         $response->addCommand(new ReplaceCommand(".js-view-dom-id-$dom_id", $preview));
 
         return $response;
diff --git a/core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php b/core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php
--- a/core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php	
+++ b/core/modules/views/tests/src/Unit/Controller/ViewAjaxControllerTest.php	
@@ -178,18 +178,18 @@
    */
   public function testAjaxView() {
     $request = new Request();
-    $request->request->set('view_name', 'test_view');
-    $request->request->set('view_display_id', 'page_1');
-    $request->request->set('view_path', '/test-page');
-    $request->request->set('_wrapper_format', 'ajax');
-    $request->request->set('ajax_page_state', 'drupal.settings[]');
-    $request->request->set('type', 'article');
+    $request->query->set('view_name', 'test_view');
+    $request->query->set('view_display_id', 'page_1');
+    $request->query->set('view_path', '/test-page');
+    $request->query->set('_wrapper_format', 'ajax');
+    $request->query->set('ajax_page_state', 'drupal.settings[]');
+    $request->query->set('type', 'article');
 
     [$view, $executable] = $this->setupValidMocks();
 
     $this->redirectDestination->expects($this->atLeastOnce())
       ->method('set')
-      ->with('/test-page?type=article');
+      ->with('/test-page?ajax_page_state=drupal.settings%5B%5D&type=article');
     $this->currentPath->expects($this->once())
       ->method('setPath')
       ->with('/test-page', $request);
@@ -207,18 +207,18 @@
    */
   public function testAjaxViewViewPathNoSlash() {
     $request = new Request();
-    $request->request->set('view_name', 'test_view');
-    $request->request->set('view_display_id', 'page_1');
-    $request->request->set('view_path', 'test-page');
-    $request->request->set('_wrapper_format', 'ajax');
-    $request->request->set('ajax_page_state', 'drupal.settings[]');
-    $request->request->set('type', 'article');
+    $request->query->set('view_name', 'test_view');
+    $request->query->set('view_display_id', 'page_1');
+    $request->query->set('view_path', 'test-page');
+    $request->query->set('_wrapper_format', 'ajax');
+    $request->query->set('ajax_page_state', 'drupal.settings[]');
+    $request->query->set('type', 'article');
 
     [$view, $executable] = $this->setupValidMocks();
 
     $this->redirectDestination->expects($this->atLeastOnce())
       ->method('set')
-      ->with('test-page?type=article');
+      ->with('test-page?ajax_page_state=drupal.settings%5B%5D&type=article');
     $this->currentPath->expects($this->once())
       ->method('setPath')
       ->with('/test-page');
diff --git a/core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php b/core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php
--- a/core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php	
+++ b/core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php	
@@ -98,8 +98,6 @@
     $this->assertCount(5, $rows);
     $this->assertStringContainsString('Node 6 content', $rows[0]->getHtml());
     $link = $page->findLink('Go to page 3');
-    // Test that no unwanted parameters are added to the URL.
-    $this->assertEquals('?status=All&type=All&langcode=All&items_per_page=5&order=changed&sort=asc&title=&page=2', $link->getAttribute('href'));
     $this->assertNoDuplicateAssetsOnPage();
 
     $this->clickLink('Go to page 3');
diff --git a/core/modules/big_pipe/src/Render/BigPipe.php b/core/modules/big_pipe/src/Render/BigPipe.php
--- a/core/modules/big_pipe/src/Render/BigPipe.php	
+++ b/core/modules/big_pipe/src/Render/BigPipe.php	
@@ -465,7 +465,7 @@
       // - the HTML to load the CSS can be rendered.
       // - the HTML to load the JS (at the top) can be rendered.
       $fake_request = $this->requestStack->getMainRequest()->duplicate();
-      $fake_request->request->set('ajax_page_state', ['libraries' => implode(',', $cumulative_assets->getAlreadyLoadedLibraries())]);
+      $fake_request->query->set('ajax_page_state', ['libraries' => implode(',', $cumulative_assets->getAlreadyLoadedLibraries())]);
       try {
         $html_response = $this->filterEmbeddedResponse($fake_request, $html_response);
       }
@@ -575,7 +575,7 @@
       // - the attachments associated with the response are finalized, which
       //   allows us to track the total set of asset libraries sent in the
       //   initial HTML response plus all embedded AJAX responses sent so far.
-      $fake_request->request->set('ajax_page_state', ['libraries' => implode(',', $cumulative_assets->getAlreadyLoadedLibraries())] + $cumulative_assets->getSettings()['ajaxPageState']);
+      $fake_request->query->set('ajax_page_state', ['libraries' => implode(',', $cumulative_assets->getAlreadyLoadedLibraries())] + $cumulative_assets->getSettings()['ajaxPageState']);
       try {
         $ajax_response = $this->filterEmbeddedResponse($fake_request, $ajax_response);
       }
