diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewsDataTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewsDataTest.php
index ada38c0..10803b0 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ViewsDataTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewsDataTest.php
@@ -53,6 +53,29 @@ public function testViewsFetchData() {
     $data = $this->viewsDataCache->get();
     $this->assertTrue(isset($data[$table_name]), 'Make sure the views_test_data info appears in the total views data.');
     $this->assertEqual($data[$table_name], $expected_data[$table_name], 'Make sure the views_test_data has the expected values.');
+
+    // Verify that views_test_data_views_data() has only been called once.
+    $state = state();
+    $this->assertEqual(2, $state->get('views_test_data_views_data_count'));
+
+    // Selectivly clear the views data cache.
+    $this->viewsDataCache->delete($table_name);
+    // Get the data again.
+    $this->viewsDataCache->get($table_name);
+    // Verify that view_test_data_views_data() has run again.
+    $this->assertEqual(3, $state->get('views_test_data_views_data_count'));
+
+    // Same again, clearing the entire cache.
+    $this->viewsDataCache->delete();
+    // Get the data again.
+    $this->viewsDataCache->get($table_name);
+    // Verify that view_test_data_views_data() has run again.
+    $this->assertEqual(4, $state->get('views_test_data_views_data_count'));
+
+    // Get the data again.
+    $this->viewsDataCache->get($table_name);
+    // Verify that view_test_data_views_data() has not run again.
+    $this->assertEqual(4, $state->get('views_test_data_views_data_count'));
   }
 
   /**
diff --git a/core/modules/views/lib/Drupal/views/ViewsDataCache.php b/core/modules/views/lib/Drupal/views/ViewsDataCache.php
index 15e338c..0b6e865 100644
--- a/core/modules/views/lib/Drupal/views/ViewsDataCache.php
+++ b/core/modules/views/lib/Drupal/views/ViewsDataCache.php
@@ -256,4 +256,20 @@ public function destruct() {
     }
   }
 
+  /**
+   * Allows an entry in the storage to be removed.
+   *
+   * @param string $key
+   *   (Optional) The key to clear in the storage. Defaults to NULL.
+   */
+  public function delete($key = NULL) {
+    if ($key) {
+      unset($this->storage[$key]);
+      $this->cacheBackend->delete($this->baseCid . ':' . $key);
+    }
+    else {
+      $this->storage = array();
+      $this->cacheBackend->deleteAll();
+    }
+  }
 }
diff --git a/core/modules/views/tests/views_test_data/views_test_data.views.inc b/core/modules/views/tests/views_test_data/views_test_data.views.inc
index ff940f7..199401d 100644
--- a/core/modules/views/tests/views_test_data/views_test_data.views.inc
+++ b/core/modules/views/tests/views_test_data/views_test_data.views.inc
@@ -25,7 +25,13 @@ function views_test_data_views_analyze(ViewExecutable $view) {
  * Implements hook_views_data().
  */
 function views_test_data_views_data() {
-  return state()->get('views_test_data_views_data');
+  $state = state();
+  if (!($count = $state->get('views_test_data_views_data_count'))) {
+    $count = 0;
+  }
+  $count++;
+  $state->set('views_test_data_views_data_count', $count);
+  return $state->get('views_test_data_views_data');
 }
 
 /**
