diff --git a/core/lib/Drupal/Core/Render/Element/Tableselect.php b/core/lib/Drupal/Core/Render/Element/Tableselect.php
index 9733ca9..0d1f969 100644
--- a/core/lib/Drupal/Core/Render/Element/Tableselect.php
+++ b/core/lib/Drupal/Core/Render/Element/Tableselect.php
@@ -259,7 +259,6 @@ public static function processTableselect(&$element, FormStateInterface $form_st
               '#return_value' => $key,
               '#default_value' => isset($value[$key]) ? $key : NULL,
               '#attributes' => $element['#attributes'],
-              '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
             );
           }
           else {
diff --git a/core/lib/Drupal/Core/Render/Element/VerticalTabs.php b/core/lib/Drupal/Core/Render/Element/VerticalTabs.php
index 0852209..447fc06 100644
--- a/core/lib/Drupal/Core/Render/Element/VerticalTabs.php
+++ b/core/lib/Drupal/Core/Render/Element/VerticalTabs.php
@@ -136,7 +136,7 @@ public static function processVerticalTabs(&$element, FormStateInterface $form_s
     $element[$name . '__active_tab'] = array(
       '#type' => 'hidden',
       '#default_value' => $element['#default_tab'],
-      '#attributes' => array('class' => array('vertical-tabs__active-tab')),
+      '#attributes' => array('class' => array('vertical-tabs-active-tab')),
     );
     // Clean up the active tab value so it's not accidentally stored in
     // settings forms.
diff --git a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
index 00cdfe2..995de59 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -11,14 +11,11 @@
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
-use Drupal\Core\StringTranslation\StringTranslationTrait;
-use Drupal\Core\StringTranslation\TranslationInterface;
 
 /**
  * Provides dynamic local tasks for content translation.
  */
 class ContentTranslationLocalTasks extends DeriverBase implements ContainerDeriverInterface {
-  use StringTranslationTrait;
 
   /**
    * The base plugin ID
@@ -41,13 +38,10 @@ class ContentTranslationLocalTasks extends DeriverBase implements ContainerDeriv
    *   The base plugin ID.
    * @param \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager
    *   The content translation manager.
-   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
-   *   The translation manager.
    */
-  public function __construct($base_plugin_id, ContentTranslationManagerInterface $content_translation_manager, TranslationInterface $string_translation) {
+  public function __construct($base_plugin_id, ContentTranslationManagerInterface $content_translation_manager) {
     $this->basePluginId = $base_plugin_id;
     $this->contentTranslationManager = $content_translation_manager;
-    $this->stringTranslation = $string_translation;
   }
 
   /**
@@ -56,8 +50,7 @@ public function __construct($base_plugin_id, ContentTranslationManagerInterface
   public static function create(ContainerInterface $container, $base_plugin_id) {
     return new static(
       $base_plugin_id,
-      $container->get('content_translation.manager'),
-      $container->get('string_translation')
+      $container->get('content_translation.manager')
     );
   }
 
@@ -73,7 +66,7 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       $base_route_name = "entity.$entity_type_id.canonical";
       $this->derivatives[$translation_route_name] = array(
         'entity_type' => $entity_type_id,
-        'title' => $this->t('Translate'),
+        'title' => 'Translate',
         'route_name' => $translation_route_name,
         'base_route' => $base_route_name,
       ) + $base_plugin_definition;
diff --git a/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php b/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
index 0b7fe85..f11f783 100644
--- a/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
+++ b/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
@@ -37,7 +37,6 @@ protected function setUp() {
         'node' => $entity_type,
       )));
     \Drupal::getContainer()->set('content_translation.manager', $content_translation_manager);
-    \Drupal::getContainer()->set('string_translation', $this->getStringTranslationStub());
   }
 
   /**
diff --git a/core/modules/rest/src/Tests/RESTTestBase.php b/core/modules/rest/src/Tests/RESTTestBase.php
index 185a7e8..ec91103 100644
--- a/core/modules/rest/src/Tests/RESTTestBase.php
+++ b/core/modules/rest/src/Tests/RESTTestBase.php
@@ -9,6 +9,7 @@
 
 use Drupal\node\NodeInterface;
 use Drupal\simpletest\WebTestBase;
+use GuzzleHttp\Client;
 
 /**
  * Test helper class that provides a REST client method to send HTTP requests.
@@ -58,6 +59,11 @@
    */
   public static $modules = array('rest', 'entity_test', 'node');
 
+  /**
+   * @var \Psr\Http\Message\ResponseInterface
+   */
+  protected $response;
+
   protected function setUp() {
     parent::setUp();
     $this->defaultFormat = 'hal_json';
@@ -65,6 +71,51 @@ protected function setUp() {
     $this->defaultAuth = array('cookie');
     // Create a test content type for node testing.
     $this->drupalCreateContentType(array('name' => 'resttest', 'type' => 'resttest'));
+
+    $this->cookieFile = $this->publicFilesDirectory . '/cookie.jar';
+  }
+
+  protected function cookieCurlOptions() {
+
+    $cookies = [];
+    foreach ($this->cookies as $key => $cookie) {
+      $cookies[] = $key . '=' . $cookie['value'];
+    }
+
+    $request = \Drupal::request();
+    $cookie_params = $request->cookies;
+    if ($cookie_params->has('XDEBUG_SESSION')) {
+      $cookies[] = 'XDEBUG_SESSION=' . $cookie_params->get('XDEBUG_SESSION');
+    }
+    // For CLI requests, the information is stored in $_SERVER.
+    $server = $request->server;
+    if ($server->has('XDEBUG_CONFIG')) {
+      // $_SERVER['XDEBUG_CONFIG'] has the form "key1=value1 key2=value2 ...".
+      $pairs = explode(' ', $server->get('XDEBUG_CONFIG'));
+      foreach ($pairs as $pair) {
+        list($key, $value) = explode('=', $pair);
+        // Account for key-value pairs being separated by multiple spaces.
+        if (trim($key, ' ') == 'idekey') {
+          $cookies[] = 'XDEBUG_SESSION=' . trim($value, ' ');
+        }
+      }
+    }
+
+    $curl_options = [];
+    // Merge additional cookies in.
+    if (!empty($cookies)) {
+      $curl_options += [
+        CURLOPT_COOKIE => '',
+      ];
+      // Ensure any existing cookie data string ends with the correct separator.
+      if (!empty($curl_options[CURLOPT_COOKIE])) {
+        $curl_options[CURLOPT_COOKIE] = rtrim($curl_options[CURLOPT_COOKIE], '; ') . '; ';
+      }
+      $curl_options[CURLOPT_COOKIE] .= implode('; ', $cookies) . ';';
+    }
+    debug($curl_options);
+
+    return $curl_options;
   }
 
   /**
@@ -86,105 +137,130 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
     if (!isset($mime_type)) {
       $mime_type = $this->defaultMimeType;
     }
+
     if (!in_array($method, array('GET', 'HEAD', 'OPTIONS', 'TRACE'))) {
       // GET the CSRF token first for writing requests.
       $token = $this->drupalGet('rest/session/token');
     }
 
+    $client = \Drupal::httpClient();
     $url = $this->buildUrl($url);
 
     $curl_options = array();
+    $options = [
+      'http_errors' => FALSE,
+      'curl' => $this->cookieCurlOptions() + [
+          CURLOPT_COOKIEJAR => $this->cookieFile,
+          CURLOPT_HEADERFUNCTION => [&$this, 'curlHeaderCallback'],
+        ],
+    ];
     switch ($method) {
       case 'GET':
-        // Set query if there are additional GET parameters.
-        $curl_options = array(
-          CURLOPT_HTTPGET => TRUE,
-          CURLOPT_CUSTOMREQUEST => 'GET',
-          CURLOPT_URL => $url,
-          CURLOPT_NOBODY => FALSE,
-          CURLOPT_HTTPHEADER => array('Accept: ' . $mime_type),
-        );
+        $options += [
+          'headers' => [
+            'Accept' => $mime_type,
+          ],
+        ];
+        $response = $client->get($url, $options);
         break;
 
-        case 'HEAD':
-          $curl_options = array(
-            CURLOPT_HTTPGET => FALSE,
-            CURLOPT_CUSTOMREQUEST => 'HEAD',
-            CURLOPT_URL => $url,
-            CURLOPT_NOBODY => TRUE,
-            CURLOPT_HTTPHEADER => array('Accept: ' . $mime_type),
-          );
-          break;
+      case 'HEAD':
+        $response = $client->head($url, $options);
+        break;
 
       case 'POST':
-        $curl_options = array(
-          CURLOPT_HTTPGET => FALSE,
-          CURLOPT_POST => TRUE,
-          CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
-          CURLOPT_NOBODY => FALSE,
-          CURLOPT_HTTPHEADER => array(
-            'Content-Type: ' . $mime_type,
-            'X-CSRF-Token: ' . $token,
-          ),
-        );
+        $options += [
+          'headers' => [
+            'Content-Type' => $mime_type,
+            'X-CSRF-Token' => $token
+          ],
+          'body' => $body,
+        ];
+        $response = $client->post($url, $options);
         break;
 
       case 'PUT':
-        $curl_options = array(
-          CURLOPT_HTTPGET => FALSE,
-          CURLOPT_CUSTOMREQUEST => 'PUT',
-          CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
-          CURLOPT_NOBODY => FALSE,
-          CURLOPT_HTTPHEADER => array(
-            'Content-Type: ' . $mime_type,
-            'X-CSRF-Token: ' . $token,
-          ),
-        );
+        $options += [
+          'headers' => [
+            'Content-Type' => $mime_type,
+            'X-CSRF-Token' => $token
+          ],
+          'body' => $body,
+        ];
+        $response = $client->put($url, $options);
         break;
 
       case 'PATCH':
-        $curl_options = array(
-          CURLOPT_HTTPGET => FALSE,
-          CURLOPT_CUSTOMREQUEST => 'PATCH',
-          CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
-          CURLOPT_NOBODY => FALSE,
-          CURLOPT_HTTPHEADER => array(
-            'Content-Type: ' . $mime_type,
-            'X-CSRF-Token: ' . $token,
-          ),
-        );
+        $options += [
+          'headers' => [
+            'Content-Type' => $mime_type,
+            'X-CSRF-Token' => $token
+          ],
+          'body' => $body,
+        ];
+        $response = $client->patch($url, $options);
         break;
 
       case 'DELETE':
-        $curl_options = array(
-          CURLOPT_HTTPGET => FALSE,
-          CURLOPT_CUSTOMREQUEST => 'DELETE',
-          CURLOPT_URL => $url,
-          CURLOPT_NOBODY => FALSE,
-          CURLOPT_HTTPHEADER => array('X-CSRF-Token: ' . $token),
-        );
+        $options += [
+          'headers' => [
+            'X-CSRF-Token' => $token
+          ],
+        ];
+        $response = $client->delete($url, $options);
         break;
     }
 
-    $this->responseBody = $this->curlExec($curl_options);
+    $this->response = $response;
+    $this->responseBody = (string) $response->getBody();
+    $this->setRawContent($this->responseBody);
 
     // Ensure that any changes to variables in the other thread are picked up.
     $this->refreshVariables();
 
-    $headers = $this->drupalGetHeaders();
-
     $this->verbose($method . ' request to: ' . $url .
-      '<hr />Code: ' . curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE) .
-      '<hr />Response headers: ' . nl2br(print_r($headers, TRUE)) .
+      '<hr />Code: ' . $this->response->getStatusCode() .
+      '<hr />Response headers: ' . nl2br(print_r($response->getHeaders(), TRUE)) .
       '<hr />Response body: ' . $this->responseBody);
 
     return $this->responseBody;
   }
 
   /**
+   * {@inheritdoc}
+   */
+  protected function assertResponse($code, $message = '', $group = 'Browser') {
+    if (!isset($this->response)) {
+      return parent::assertResponse($code, $message, $group);
+    }
+    return $this->assertEqual($code, $this->response->getStatusCode(), $message ? $message : "HTTP response expected $code, actual {$this->response->getStatusCode()}", $group);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function drupalGetHeaders($all_requests = FALSE) {
+    if (!isset($this->response)) {
+      return parent::drupalGetHeaders($all_requests);
+    }
+    return array_map(function (array $header) {
+      return implode(', ', $header);
+    }, $this->response->getHeaders());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function drupalGetHeader($name, $all_requests = FALSE) {
+    if (!isset($this->response)) {
+      return parent::drupalGetHeader($name, $all_requests);
+    }
+    if ($header = $this->response->getHeader($name)) {
+      return implode(', ', $header);
+    }
+  }
+
+  /**
    * Creates entity objects based on their types.
    *
    * @param string $entity_type
@@ -295,6 +371,8 @@ protected function rebuildCache() {
    * override it every time it is omitted.
    */
   protected function curlExec($curl_options, $redirect = FALSE) {
+    unset($this->response);
+
     if (!isset($curl_options[CURLOPT_CUSTOMREQUEST])) {
       if (!empty($curl_options[CURLOPT_HTTPGET])) {
         $curl_options[CURLOPT_CUSTOMREQUEST] = 'GET';
diff --git a/core/modules/rest/src/Tests/UpdateTest.php b/core/modules/rest/src/Tests/UpdateTest.php
index ef18a74..c72ba30 100644
--- a/core/modules/rest/src/Tests/UpdateTest.php
+++ b/core/modules/rest/src/Tests/UpdateTest.php
@@ -190,7 +190,7 @@ public function testUpdateUser() {
     $error = Json::decode($response);
     $this->assertEqual($error['error'], "Unprocessable Entity: validation failed.\nmail: Your current password is missing or incorrect; it's required to change the <em class=\"placeholder\">Email</em>.\n");
 
-    // Try and send the new email with a password.
+    // Try and send the new email with a wrong password.
     $normalized['pass'][0]['existing'] = 'wrong';
     $serialized = $serializer->serialize($normalized, $this->defaultFormat, $context);
     $response = $this->httpRequest($account->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
@@ -203,6 +203,7 @@ public function testUpdateUser() {
     $serialized = $serializer->serialize($normalized, $this->defaultFormat, $context);
     $this->httpRequest($account->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(204);
+    $this->curlCookies = $this->cookies;
 
     // Try to change the password without providing the current password.
     $new_password = $this->randomString();
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index a3bfd4c..429ff85 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -127,7 +127,6 @@
    */
   protected $rootUser;
 
-
   /**
    * The current cookie file used by cURL.
    *
@@ -503,7 +502,7 @@ protected function drupalLogout() {
     // Make a request to the logout page, and redirect to the user page, the
     // idea being if you were properly logged out you should be seeing a login
     // screen.
-    $this->drupalGet('user/logout', array('query' => array('destination' => 'user/login')));
+
     $this->assertResponse(200, 'User was logged out.');
     $pass = $this->assertField('name', 'Username field found.', 'Logout');
     $pass = $pass && $this->assertField('pass', 'Password field found.', 'Logout');
diff --git a/core/modules/system/src/Tests/Form/ElementsTableSelectTest.php b/core/modules/system/src/Tests/Form/ElementsTableSelectTest.php
index b400f3d..f9ce925 100644
--- a/core/modules/system/src/Tests/Form/ElementsTableSelectTest.php
+++ b/core/modules/system/src/Tests/Form/ElementsTableSelectTest.php
@@ -43,27 +43,6 @@ function testMultipleTrue() {
   }
 
   /**
-   * Test the presence of ajax functionality for all options.
-   */
-  function testAjax() {
-    $rows = array('row1', 'row2', 'row3');
-    // Test checkboxes (#multiple == TRUE).
-    foreach ($rows as $row) {
-      $element = 'tableselect[' . $row . ']';
-      $edit = array($element => TRUE);
-      $result = $this->drupalPostAjaxForm('form_test/tableselect/multiple-true', $edit, $element);
-      $this->assertFalse(empty($result), t('Ajax triggers on checkbox for @row.', array('@row' => $row)));
-    }
-    // Test radios (#multiple == FALSE).
-    $element = 'tableselect';
-    foreach ($rows as $row) {
-      $edit = array($element => $row);
-      $result = $this->drupalPostAjaxForm('form_test/tableselect/multiple-false', $edit, $element);
-      $this->assertFalse(empty($result), t('Ajax triggers on radio for @row.', array('@row' => $row)));
-    }
-  }
-
-  /**
    * Test the display of radios when #multiple is FALSE.
    */
   function testMultipleFalse() {
diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module
index 7114a29..ee4c137 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -104,10 +104,3 @@ function form_test_form_form_test_vertical_tabs_access_form_alter(&$form, &$form
   $form['fieldset1']['#access'] = FALSE;
   $form['container']['#access'] = FALSE;
 }
-
-/**
- * Ajax callback that returns the form element.
- */
-function form_test_tableselect_ajax_callback($form, FormStateInterface $form_state) {
-  return $form['tableselect'];
-}
diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestTableSelectFormBase.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestTableSelectFormBase.php
index 5c3b383..f618c92 100644
--- a/core/modules/system/tests/modules/form_test/src/Form/FormTestTableSelectFormBase.php
+++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestTableSelectFormBase.php
@@ -34,17 +34,11 @@ function tableselectFormBuilder($form, FormStateInterface $form_state, $element_
     $form['tableselect'] = $element_properties;
 
     $form['tableselect'] += array(
-      '#prefix' => '<div id="tableselect-wrapper">',
-      '#suffix' => '</div>',
       '#type' => 'tableselect',
       '#header' => $header,
       '#options' => $options,
       '#multiple' => FALSE,
       '#empty' => t('Empty text.'),
-      '#ajax' => array(
-        'callback' => 'form_test_tableselect_ajax_callback',
-        'wrapper' => 'tableselect-wrapper',
-      ),
     );
 
     $form['submit'] = array(
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.services.yml b/core/modules/system/tests/modules/theme_test/theme_test.services.yml
index 271fd4b..482c219 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.services.yml
+++ b/core/modules/system/tests/modules/theme_test/theme_test.services.yml
@@ -1,7 +1,7 @@
 services:
   theme_test.subscriber:
     class: Drupal\theme_test\EventSubscriber\ThemeTestSubscriber
-    arguments: ['@current_route_match', '@renderer']
+    arguments: [@current_route_match, @renderer]
     tags:
       - { name: event_subscriber }
 
diff --git a/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php b/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php
index cf585ce..cea8fba 100644
--- a/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php
+++ b/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php
@@ -20,7 +20,7 @@ class StyleSummaryTest extends ViewTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['entity_test', 'views_ui'];
+  public static $modules = ['entity_test'];
 
   /**
    * {@inheritdoc}
@@ -48,9 +48,6 @@ protected function setUp($import_test_views = TRUE) {
         $entity->save();
       }
     }
-
-    $views_user = $this->drupalCreateUser(['administer views']);
-    $this->drupalLogin($views_user);
   }
 
   /**
@@ -75,71 +72,6 @@ public function testSummaryView() {
     $this->clickLink('type1');
     $entries = $this->cssSelect('div.view-content div.views-row');
     $this->assertEqual(2, count($entries));
-
-    // Add a base path to the summary settings.
-    $edit = [
-      'options[summary][options][default_summary][base_path]' => 'test-summary',
-    ];
-    $this->drupalPostForm('admin/structure/views/nojs/handler/test_summary/page_1/argument/type', $edit, t('Apply'));
-    $this->drupalPostForm(NULL, [], t('Save'));
-
-    // Test that the links still work.
-    $this->drupalGet('test-summary');
-    $this->clickLink('type1');
-    $entries = $this->cssSelect('div.view-content div.views-row');
-    $this->assertEqual(2, count($entries));
-
-    // Change the summary display to an unformatted list displaying 3 items.
-    $edit = [
-      'options[summary][format]' => 'unformatted_summary',
-      'options[summary][options][unformatted_summary][override]' => '1',
-      'options[summary][options][unformatted_summary][items_per_page]' => '3',
-    ];
-    $this->drupalPostForm('admin/structure/views/nojs/handler/test_summary/page_1/argument/type', $edit, t('Apply'));
-    $this->drupalPostForm(NULL, [], t('Save'));
-
-    $this->drupalGet('admin/structure/views/nojs/handler/test_summary/page_1/argument/type');
-    $this->drupalGet('test-summary');
-
-    $summary_list = $this->cssSelect('.views-summary-unformatted');
-    $this->assertEqual(3, count($summary_list));
-
-    foreach ($summary_list as $summary_list_item) {
-      $this->assertEqual('(5)', trim((string) $summary_list_item));
-    }
-
-    $summary_links = $this->cssSelect('.views-summary-unformatted a');
-    $this->assertEqual(3, count($summary_links));
-    foreach ($summary_links as $index => $summary_link) {
-      $this->assertEqual('type' . $index, trim((string) $summary_link));
-    }
-
-    $this->clickLink('type1');
-    $entries = $this->cssSelect('div.view-content div.views-row');
-    $this->assertEqual(2, count($entries));
-
-    // Add a base path to the summary settings.
-    $edit = [
-      'options[summary][options][unformatted_summary][base_path]' => 'test-summary',
-    ];
-    $this->drupalPostForm('admin/structure/views/nojs/handler/test_summary/page_1/argument/type', $edit, t('Apply'));
-    $this->drupalPostForm(NULL, [], t('Save'));
-
-    // Test that the links still work.
-    $this->drupalGet('test-summary');
-    $this->clickLink('type1');
-    $entries = $this->cssSelect('div.view-content div.views-row');
-    $this->assertEqual(2, count($entries));
-
-    // Set base_path to an unknown path and test that the links lead to the
-    // front page.
-    $edit = [
-      'options[summary][options][unformatted_summary][base_path]' => 'unknown-path',
-    ];
-    $this->drupalPostForm('admin/structure/views/nojs/handler/test_summary/page_1/argument/type', $edit, t('Apply'));
-    $this->drupalPostForm(NULL, [], t('Save'));
-    $this->drupalGet('test-summary');
-    $this->assertLinkByHref('/');
   }
 
 }
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml
index 3784bd9..daf92fa 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml
@@ -75,7 +75,6 @@ display:
           specify_validation: true
           plugin_id: string
           entity_type: entity_test
-          admin_label: type
       fields:
         id:
           id: id
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index 94c519e..c14416f 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -277,29 +277,11 @@ function template_preprocess_views_view_summary(&$variables) {
 
     if (!empty($argument->options['summary_options']['base_path'])) {
       $base_path = $argument->options['summary_options']['base_path'];
-      $tokens = $view->getDisplay()->getArgumentsTokens();
-      $base_path = $argument->globalTokenReplace($base_path, $tokens);
+      $tokens = $this->getArgumentsTokens();
+      $base_path = $this->viewsTokenReplace($base_path, $tokens);
       // @todo Views should expect and store a leading /. See:
       //   https://www.drupal.org/node/2423913
       $url = Url::fromUserInput('/' . $base_path);
-      try {
-        /** @var \Symfony\Component\Routing\Route $route */
-        $route_name = $url->getRouteName();
-        $route = \Drupal::service('router.route_provider')->getRouteByName($route_name);
-
-        $route_variables = $route->compile()->getVariables();
-        $parameters = $url->getRouteParameters();
-
-        foreach ($route_variables as $variable_name) {
-          $parameters[$variable_name] = array_shift($args);
-        }
-
-        $url->setRouteParameters($parameters);
-      }
-      catch (Exception $e) {
-        // If the given route doesn't exist, default to <front>
-        $url = Url::fromRoute('<front>');
-      }
     }
     else {
       $url = $view->getUrl($args)->setOptions($url_options);
@@ -325,7 +307,6 @@ function template_preprocess_views_view_summary(&$variables) {
  *       visually distinct.
  */
 function template_preprocess_views_view_summary_unformatted(&$variables) {
-  /** @var \Drupal\views\ViewExecutable $view */
   $view = $variables['view'];
   $argument = $view->argument[$view->build_info['summary_level']];
 
@@ -365,27 +346,11 @@ function template_preprocess_views_view_summary_unformatted(&$variables) {
 
     if (!empty($argument->options['summary_options']['base_path'])) {
       $base_path = $argument->options['summary_options']['base_path'];
-      $tokens = $view->getDisplay()->getArgumentsTokens();
-      $base_path = $argument->globalTokenReplace($base_path, $tokens);
+      $tokens = $this->getArgumentsTokens();
+      $base_path = $this->viewsTokenReplace($base_path, $tokens);
       // @todo Views should expect and store a leading /. See:
       //   https://www.drupal.org/node/2423913
       $url = Url::fromUserInput('/' . $base_path);
-      try {
-        /** @var \Symfony\Component\Routing\Route $route */
-        $route = \Drupal::service('router.route_provider')->getRouteByName($url->getRouteName());
-        $route_variables = $route->compile()->getVariables();
-        $parameters = $url->getRouteParameters();
-
-        foreach ($route_variables as $variable_name) {
-          $parameters[$variable_name] = array_shift($args);
-        }
-
-        $url->setRouteParameters($parameters);
-      }
-      catch (Exception $e) {
-        // If the given route doesn't exist, default to <front>
-        $url = Url::fromRoute('<front>');
-      }
     }
     else {
       $url = $view->getUrl($args)->setOptions($url_options);
