diff --git a/core/modules/taxonomy/src/Tests/TokenReplaceTest.php b/core/modules/taxonomy/src/Tests/TokenReplaceTest.php
index f3c6c5d..74201f1 100644
--- a/core/modules/taxonomy/src/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/src/Tests/TokenReplaceTest.php
@@ -1,146 +1,162 @@
 <?php
 
-namespace Drupal\taxonomy\Tests;
+namespace Drupal\Tests\views\Kernel;
 
-use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Render\BubbleableMetadata;
+use Drupal\views\Views;
 
 /**
- * Generates text using placeholders for dummy content to check taxonomy token
- * replacement.
+ * Tests core view token replacement.
  *
- * @group taxonomy
+ * @group views
  */
-class TokenReplaceTest extends TaxonomyTestBase {
+class TokenReplaceTest extends ViewsKernelTestBase {
 
-  /**
-   * The vocabulary used for creating terms.
-   *
-   * @var \Drupal\taxonomy\VocabularyInterface
-   */
-  protected $vocabulary;
+  public static $modules = array('system');
 
   /**
-   * Name of the taxonomy term reference field.
+   * Views used by this test.
    *
-   * @var string
+   * @var array
    */
-  protected $fieldName;
+  public static $testViews = array('test_tokens', 'test_invalid_tokens');
 
-  protected function setUp() {
+  protected function setUp($import_test_views = TRUE) {
     parent::setUp();
-    $this->drupalLogin($this->drupalCreateUser(['administer taxonomy', 'bypass node access']));
-    $this->vocabulary = $this->createVocabulary();
-    $this->fieldName = 'taxonomy_' . $this->vocabulary->id();
-
-    $handler_settings = array(
-      'target_bundles' => array(
-        $this->vocabulary->id() => $this->vocabulary->id(),
-      ),
-      'auto_create' => TRUE,
-    );
-    $this->createEntityReferenceField('node', 'article', $this->fieldName, NULL, 'taxonomy_term', 'default', $handler_settings, FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
-
-    entity_get_form_display('node', 'article', 'default')
-      ->setComponent($this->fieldName, array(
-        'type' => 'options_select',
-      ))
-      ->save();
-    entity_get_display('node', 'article', 'default')
-      ->setComponent($this->fieldName, array(
-        'type' => 'entity_reference_label',
-      ))
-      ->save();
+    $this->container->get('router.builder')->rebuild();
   }
 
   /**
-   * Creates some terms and a node, then tests the tokens generated from them.
+   * Tests core token replacements generated from a view.
    */
-  function testTaxonomyTokenReplacement() {
-    $token_service = \Drupal::token();
-    $language_interface = \Drupal::languageManager()->getCurrentLanguage();
-
-    // Create two taxonomy terms.
-    $term1 = $this->createTerm($this->vocabulary);
-    $term2 = $this->createTerm($this->vocabulary);
-
-    // Edit $term2, setting $term1 as parent.
-    $edit = array();
-    $edit['name[0][value]'] = '<blink>Blinking Text</blink>';
-    $edit['parent[]'] = array($term1->id());
-    $this->drupalPostForm('taxonomy/term/' . $term2->id() . '/edit', $edit, t('Save'));
-
-    // Create node with term2.
-    $edit = array();
-    $node = $this->drupalCreateNode(array('type' => 'article'));
-    $edit[$this->fieldName . '[]'] = $term2->id();
-    $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save'));
-
-    // Generate and test sanitized tokens for term1.
-    $tests = array();
-    $tests['[term:tid]'] = $term1->id();
-    $tests['[term:name]'] = $term1->getName();
-    $tests['[term:description]'] = $term1->description->processed;
-    $tests['[term:url]'] = $term1->url('canonical', array('absolute' => TRUE));
-    $tests['[term:node-count]'] = 0;
-    $tests['[term:parent:name]'] = '[term:parent:name]';
-    $tests['[term:vocabulary:name]'] = $this->vocabulary->label();
-    $tests['[term:vocabulary]'] = $this->vocabulary->label();
-
-    $base_bubbleable_metadata = BubbleableMetadata::createFromObject($term1);
-
-    $metadata_tests = array();
-    $metadata_tests['[term:tid]'] = $base_bubbleable_metadata;
-    $metadata_tests['[term:name]'] = $base_bubbleable_metadata;
-    $metadata_tests['[term:description]'] = $base_bubbleable_metadata;
-    $metadata_tests['[term:url]'] = $base_bubbleable_metadata;
-    $metadata_tests['[term:node-count]'] = $base_bubbleable_metadata;
-    $metadata_tests['[term:parent:name]'] = $base_bubbleable_metadata;
-    $bubbleable_metadata = clone $base_bubbleable_metadata;
-    $metadata_tests['[term:vocabulary:name]'] = $bubbleable_metadata->addCacheTags($this->vocabulary->getCacheTags());
-    $metadata_tests['[term:vocabulary]'] = $bubbleable_metadata->addCacheTags($this->vocabulary->getCacheTags());
-
-    foreach ($tests as $input => $expected) {
+  function testTokenReplacement() {
+    $token_handler = \Drupal::token();
+    $view = Views::getView('test_tokens');
+    $view->setDisplay('page_1');
+    // Force the view to span more than one page to better test page_count.
+    $view->display_handler->getPlugin('pager')->setItemsPerPage(4);
+    $this->executeView($view);
+
+    $expected = array(
+      '[view:label]' => 'Test tokens',
+      '[view:description]' => 'Test view to token replacement tests.',
+      '[view:id]' => 'test_tokens',
+      '[view:title]' => 'Test token page',
+      '[view:url]' => $view->getUrl(NULL, 'page_1')->setAbsolute(TRUE)->toString(),
+      '[view:total-rows]' => 5,
+      '[view:base-table]' => 'views_test_data',
+      '[view:base-field]' => 'id',
+      '[view:items-per-page]' => '4',
+      '[view:current-page]' => '1',
+      '[view:page-count]' => '2',
+    );
+
+    $base_bubbleable_metadata = BubbleableMetadata::createFromObject($view->storage);
+    $metadata_tests = [];
+    $metadata_tests['[view:label]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:description]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:id]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:title]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:url]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:total-rows]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:base-table]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:base-field]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:items-per-page]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:current-page]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:page-count]'] = $base_bubbleable_metadata;
+
+    foreach ($expected as $token => $expected_output) {
       $bubbleable_metadata = new BubbleableMetadata();
-      $output = $token_service->replace($input, array('term' => $term1), array('langcode' => $language_interface->getId()), $bubbleable_metadata);
-      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
-      $this->assertEqual($bubbleable_metadata, $metadata_tests[$input]);
+      $output = $token_handler->replace($token, array('view' => $view), [], $bubbleable_metadata);
+      $this->assertIdentical($output, $expected_output, format_string('Token %token replaced correctly.', array('%token' => $token)));
+      $this->assertEqual($bubbleable_metadata, $metadata_tests[$token]);
     }
+  }
+
+  /**
+   * Tests core token replacements generated from a view.
+   */
+  function testTokenReplacementWithMiniPager() {
+    $token_handler = \Drupal::token();
+    $view = Views::getView('test_tokens');
+    $view->setDisplay('page_3');
+    // Force the view to span more than one page to better test page_count.
+    $view->display_handler->getPlugin('pager')->setItemsPerPage(4);
+    $this->executeView($view);
+
+    $expected = array(
+      '[view:label]' => 'Test tokens',
+      '[view:description]' => 'Test view to token replacement tests.',
+      '[view:id]' => 'test_tokens',
+      '[view:title]' => 'Test token page with minipager',
+      '[view:url]' => $view->getUrl(NULL, 'page_3')
+        ->setAbsolute(TRUE)
+        ->toString(),
+      '[view:total-rows]' => 5,
+      '[view:base-table]' => 'views_test_data',
+      '[view:base-field]' => 'id',
+      '[view:items-per-page]' => '4',
+      '[view:current-page]' => '1',
+      '[view:page-count]' => '2',
+    );
 
-    // Generate and test sanitized tokens for term2.
-    $tests = array();
-    $tests['[term:tid]'] = $term2->id();
-    $tests['[term:name]'] = $term2->getName();
-    $tests['[term:description]'] = $term2->description->processed;
-    $tests['[term:url]'] = $term2->url('canonical', array('absolute' => TRUE));
-    $tests['[term:node-count]'] = 1;
-    $tests['[term:parent:name]'] = $term1->getName();
-    $tests['[term:parent:url]'] = $term1->url('canonical', array('absolute' => TRUE));
-    $tests['[term:parent:parent:name]'] = '[term:parent:parent:name]';
-    $tests['[term:vocabulary:name]'] = $this->vocabulary->label();
-
-    // Test to make sure that we generated something for each token.
-    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
-
-    foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('term' => $term2), array('langcode' => $language_interface->getId()));
-      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
+    $base_bubbleable_metadata = BubbleableMetadata::createFromObject($view->storage);
+    $metadata_tests = [];
+    $metadata_tests['[view:label]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:description]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:id]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:title]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:url]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:total-rows]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:base-table]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:base-field]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:items-per-page]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:current-page]'] = $base_bubbleable_metadata;
+    $metadata_tests['[view:page-count]'] = $base_bubbleable_metadata;
+
+    foreach ($expected as $token => $expected_output) {
+      $bubbleable_metadata = new BubbleableMetadata();
+      $output = $token_handler->replace($token, array('view' => $view), [], $bubbleable_metadata);
+      $this->assertIdentical($output, $expected_output, format_string('Token %token replaced correctly.', array('%token' => $token)));
+      $this->assertEqual($bubbleable_metadata, $metadata_tests[$token]);
     }
+  }
 
-    // Generate and test sanitized tokens.
-    $tests = array();
-    $tests['[vocabulary:vid]'] = $this->vocabulary->id();
-    $tests['[vocabulary:name]'] = $this->vocabulary->label();
-    $tests['[vocabulary:description]'] = $this->vocabulary->getDescription();
-    $tests['[vocabulary:node-count]'] = 1;
-    $tests['[vocabulary:term-count]'] = 2;
+  /**
+   * Tests core token replacements generated from a view without results.
+   */
+  function testTokenReplacementNoResults() {
+    $token_handler = \Drupal::token();
+    $view = Views::getView('test_tokens');
+    $view->setDisplay('page_2');
+    $this->executeView($view);
+
+    $expected = array(
+      '[view:page-count]' => '1',
+    );
 
-    // Test to make sure that we generated something for each token.
-    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+    foreach ($expected as $token => $expected_output) {
+      $output = $token_handler->replace($token, array('view' => $view));
+      $this->assertIdentical($output, $expected_output, format_string('Token %token replaced correctly.', array('%token' => $token)));
+    }
+  }
+
+  /**
+   * Tests path token replacements generated from a view without a path.
+   */
+  function testTokenReplacementNoPath() {
+    $token_handler = \Drupal::token();
+    $view = Views::getView('test_invalid_tokens');
+    $view->setDisplay('block_1');
+    $this->executeView($view);
+
+    $expected = array(
+      '[view:url]' => '',
+    );
 
-    foreach ($tests as $input => $expected) {
-      $output = $token_service->replace($input, array('vocabulary' => $this->vocabulary), array('langcode' => $language_interface->getId()));
-      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy vocabulary token %token replaced.', array('%token' => $input)));
+    foreach ($expected as $token => $expected_output) {
+      $output = $token_handler->replace($token, array('view' => $view));
+      $this->assertIdentical($output, $expected_output, format_string('Token %token replaced correctly.', array('%token' => $token)));
     }
   }
 
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tokens.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tokens.yml
index 2bb8216..d882d43 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tokens.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_tokens.yml
@@ -77,3 +77,20 @@ display:
           operator: '='
           value: 'not an existing name'
       path: test_tokens_empty
+  page_3:
+    id: page_3
+    display_title: Page
+    display_plugin: page
+    position: 1
+    display_options:
+      defaults:
+        title: false
+      pager:
+        type: mini
+        options:
+          items_per_page: 10
+      title: 'Test token page with minipager'
+      query:
+        type: views_query
+        options: {  }
+      path: test_tokens_minipager
