diff --git a/core/modules/comment/src/Plugin/views/wizard/Comment.php b/core/modules/comment/src/Plugin/views/wizard/Comment.php
index f88e43f..54ddd7f 100644
--- a/core/modules/comment/src/Plugin/views/wizard/Comment.php
+++ b/core/modules/comment/src/Plugin/views/wizard/Comment.php
@@ -150,6 +150,7 @@ protected function defaultDisplayOptions() {
     $display_options['relationships']['node']['required'] = 1;
     $display_options['relationships']['node']['plugin_id'] = 'standard';
     $display_options['relationships']['node']['provider'] = 'views';
+    $display_options['relationships']['node']['dependencies'] = [];
 
     // Remove the default fields, since we are customizing them here.
     unset($display_options['fields']);
@@ -159,6 +160,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['subject']['table'] = 'comment_field_data';
     $display_options['fields']['subject']['field'] = 'subject';
     $display_options['fields']['subject']['provider'] = 'comment';
+    $display_options['fields']['subject']['dependencies'] = [];
     $display_options['fields']['subject']['label'] = '';
     $display_options['fields']['subject']['alter']['alter_text'] = 0;
     $display_options['fields']['subject']['alter']['make_link'] = 0;
diff --git a/core/modules/field/src/Plugin/views/field/Field.php b/core/modules/field/src/Plugin/views/field/Field.php
index c05f6ed..75f362c 100644
--- a/core/modules/field/src/Plugin/views/field/Field.php
+++ b/core/modules/field/src/Plugin/views/field/Field.php
@@ -942,9 +942,11 @@ function field_langcode(EntityInterface $entity) {
   /**
    * {@inheritdoc}
    */
-  public function getDependencies() {
+  public function calculateDependencies() {
     // Add the module providing the configured field storage as a dependency.
-    return array('config' => array($this->getFieldStorageConfig()->getConfigDependencyName()));
+    return [
+      'config' => [$this->getFieldStorageConfig()->getConfigDependencyName()]
+    ];
   }
 
   /**
diff --git a/core/modules/field/src/Tests/Views/FieldUITest.php b/core/modules/field/src/Tests/Views/FieldUITest.php
index 8e94404..884f82d 100644
--- a/core/modules/field/src/Tests/Views/FieldUITest.php
+++ b/core/modules/field/src/Tests/Views/FieldUITest.php
@@ -83,6 +83,10 @@ public function testHandlerUI() {
     $view->initHandlers();
     $this->assertEqual($view->field['field_name_0']->options['type'], 'text_trimmed');
     $this->assertEqual($view->field['field_name_0']->options['settings']['trim_length'], $random_number);
+
+    // Ensure that the view depends on the field storage.
+    $dependencies = \Drupal::service('config.manager')->findConfigEntityDependents('config', [$this->fieldStorages[0]->getConfigDependencyName()]);
+    $this->assertTrue(isset($dependencies['views.view.test_view_fieldapi']), 'The view is dependent on the field storage.');
   }
 
   /**
diff --git a/core/modules/file/src/Plugin/views/wizard/File.php b/core/modules/file/src/Plugin/views/wizard/File.php
index 94529a0..3f8094e 100644
--- a/core/modules/file/src/Plugin/views/wizard/File.php
+++ b/core/modules/file/src/Plugin/views/wizard/File.php
@@ -54,6 +54,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['filename']['table'] = 'file_managed';
     $display_options['fields']['filename']['field'] = 'filename';
     $display_options['fields']['filename']['provider'] = 'file';
+    $display_options['fields']['filename']['dependencies'] = [];
     $display_options['fields']['filename']['label'] = '';
     $display_options['fields']['filename']['alter']['alter_text'] = 0;
     $display_options['fields']['filename']['alter']['make_link'] = 0;
diff --git a/core/modules/node/src/Plugin/views/wizard/Node.php b/core/modules/node/src/Plugin/views/wizard/Node.php
index 05ba0d1..686ea72 100644
--- a/core/modules/node/src/Plugin/views/wizard/Node.php
+++ b/core/modules/node/src/Plugin/views/wizard/Node.php
@@ -138,6 +138,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['title']['table'] = 'node_field_data';
     $display_options['fields']['title']['field'] = 'title';
     $display_options['fields']['title']['provider'] = 'node';
+    $display_options['fields']['title']['dependencies'] = [];
     $display_options['fields']['title']['label'] = '';
     $display_options['fields']['title']['alter']['alter_text'] = 0;
     $display_options['fields']['title']['alter']['make_link'] = 0;
diff --git a/core/modules/node/src/Plugin/views/wizard/NodeRevision.php b/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
index 3eb7d2e..bd28f8d 100644
--- a/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
+++ b/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
@@ -99,6 +99,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['changed']['table'] = 'node_field_revision';
     $display_options['fields']['changed']['field'] = 'changed';
     $display_options['fields']['changed']['provider'] = 'node';
+    $display_options['fields']['changed']['dependencies'] = [];
     $display_options['fields']['changed']['alter']['alter_text'] = FALSE;
     $display_options['fields']['changed']['alter']['make_link'] = FALSE;
     $display_options['fields']['changed']['alter']['absolute'] = FALSE;
@@ -115,6 +116,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['title']['table'] = 'node_field_revision';
     $display_options['fields']['title']['field'] = 'title';
     $display_options['fields']['title']['provider'] = 'node';
+    $display_options['fields']['title']['dependencies'] = [];
     $display_options['fields']['title']['label'] = '';
     $display_options['fields']['title']['alter']['alter_text'] = 0;
     $display_options['fields']['title']['alter']['make_link'] = 0;
diff --git a/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php b/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
index 480dc26..bd16b39 100644
--- a/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
+++ b/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
@@ -52,6 +52,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['name']['table'] = 'taxonomy_term_field_data';
     $display_options['fields']['name']['field'] = 'name';
     $display_options['fields']['name']['provider'] = 'taxonomy';
+    $display_options['fields']['name']['dependencies'] = [];
     $display_options['fields']['name']['label'] = '';
     $display_options['fields']['name']['alter']['alter_text'] = 0;
     $display_options['fields']['name']['alter']['make_link'] = 0;
diff --git a/core/modules/user/src/Plugin/views/wizard/Users.php b/core/modules/user/src/Plugin/views/wizard/Users.php
index 127b84b..24b71df 100644
--- a/core/modules/user/src/Plugin/views/wizard/Users.php
+++ b/core/modules/user/src/Plugin/views/wizard/Users.php
@@ -75,6 +75,7 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['name']['table'] = 'users_field_data';
     $display_options['fields']['name']['field'] = 'name';
     $display_options['fields']['name']['provider'] = 'user';
+    $display_options['fields']['name']['dependencies'] = [];
     $display_options['fields']['name']['label'] = '';
     $display_options['fields']['name']['alter']['alter_text'] = 0;
     $display_options['fields']['name']['alter']['make_link'] = 0;
diff --git a/core/modules/views/src/Entity/View.php b/core/modules/views/src/Entity/View.php
index 19d13c1..ed13be4 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -100,6 +100,13 @@ class View extends ConfigEntityBase implements ViewStorageInterface {
   protected $executable;
 
   /**
+   * The views data.
+   *
+   * @var \Drupal\views\ViewsData
+   */
+  protected $viewsData;
+
+  /**
    * The module implementing this view.
    *
    * @var string
@@ -248,46 +255,49 @@ public function calculateDependencies() {
 
     // Ensure that the view is dependant on the module that implements the view.
     $this->addDependency('module', $this->module);
-    // Ensure that the view is dependent on the module that provides the schema
-    // for the base table.
-    $schema = $this->drupalGetSchema($this->base_table);
-    // @todo Entity base tables are no longer registered in hook_schema(). Once
-    //   we automate the views data for entity types add the entity type
-    //   type provider as a dependency. See https://drupal.org/node/1740492.
-    if ($schema && $this->module != $schema['module']) {
-      $this->addDependency('module', $schema['module']);
-    }
 
-    $handler_types = array();
-    foreach (Views::getHandlerTypes() as $type) {
-      $handler_types[] = $type['plural'];
-    }
-    foreach ($this->get('display') as $display) {
+    $executable = $this->getExecutable();
+    $executable->initDisplay();
+    $handler_types = array_keys(Views::getHandlerTypes());
+
+    foreach ($executable->displayHandlers as $display) {
       // Add dependency for the display itself.
-      if (isset($display['provider'])) {
-        $this->addDependency('module', $display['provider']);
-      }
+      /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase $display */
+      $this->addDependency('module', $display->getProvider());
 
       // Collect all dependencies of all handlers.
       foreach ($handler_types as $handler_type) {
-        if (!empty($display['display_options'][$handler_type])) {
-          foreach ($display['display_options'][$handler_type] as $handler) {
-            // Add the provider as dependency.
-            if (isset($handler['provider'])) {
-              $this->addDependency('module', $handler['provider']);
-            }
-            // Add the additional dependencies from the handler configuration.
-            if (!empty($handler['dependencies'])) {
-              $this->addDependencies($handler['dependencies']);
+        foreach ($display->getHandlers($handler_type) as $handler) {
+          $definition = $handler->getPluginDefinition();
+          $this->addDependency('module', $definition['provider']);
+          // Plugins can declare additional dependencies in their definition.
+          if (isset($definition['config_dependencies'])) {
+            $this->addDependencies($definition['config_dependencies']);
+          }
+          // Add any dependencies as the handler is saved. Put it here so
+          // it does not need to be declared in defineOptions().
+          if ($dependencies = $handler->calculateDependencies()) {
+            $this->addDependencies($dependencies);
           }
         }
       }
-    }
+
+      // @todo This totally does not work for argument validator/default
+      //   plugins.
 
       // Collect all dependencies of plugins.
       foreach (Views::getPluginTypes('plugin') as $plugin_type) {
-        if (!empty($display['display_options'][$plugin_type]['options']['dependencies'])) {
-          $this->addDependencies($display['display_options'][$plugin_type]['options']['dependencies']);
+        // Check if a plugin is returned. See above todo.
+        if (!$plugin = $display->getPlugin($plugin_type)) {
+          continue;
+        }
+
+        // Add the provider as a dependency.
+        $this->addDependency('module', $plugin->getProvider());
+
+        // Add the plugin dependencies.
+        if ($dependencies = $plugin->calculateDependencies()) {
+          $this->addDependencies($dependencies);
         }
       }
     }
@@ -447,11 +457,4 @@ public function mergeDefaultDisplaysOptions() {
     $this->set('display', $displays);
   }
 
-  /**
-   * Wraps drupal_get_schema().
-   */
-  protected function drupalGetSchema($table = NULL, $rebuild = FALSE) {
-    return drupal_get_schema($table, $rebuild);
-  }
-
 }
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 88a0577..4bb38fe 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -129,6 +129,7 @@ public function getViewsData() {
     // Setup base information of the views data.
     $data[$base_table]['table']['entity type'] = $this->entityType->id();
     $data[$base_table]['table']['group'] = $this->entityType->getLabel();
+    $data[$base_table]['table']['provider'] = $this->entityType->getProvider();
     $data[$base_table]['table']['base'] = [
       'field' => $base_field,
       'title' => $this->entityType->getLabel(),
@@ -157,10 +158,12 @@ public function getViewsData() {
       ];
       $data[$data_table]['table']['entity type'] = $this->entityType->id();
       $data[$data_table]['table']['group'] = $this->entityType->getLabel();
+      $data[$data_table]['table']['provider'] = $this->entityType->getProvider();
     }
     if ($revision_table) {
       $data[$revision_table]['table']['entity type'] = $this->entityType->id();
       $data[$revision_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
+      $data[$revision_table]['table']['provider'] = $this->entityType->getProvider();
       $data[$revision_table]['table']['base'] = array(
         'field' => $revision_field,
         'title' => $this->t('@entity_type revisions', array('@entity_type' => $this->entityType->getLabel())),
diff --git a/core/modules/views/src/Plugin/views/BrokenHandlerTrait.php b/core/modules/views/src/Plugin/views/BrokenHandlerTrait.php
index 4bd9948..b157dab 100644
--- a/core/modules/views/src/Plugin/views/BrokenHandlerTrait.php
+++ b/core/modules/views/src/Plugin/views/BrokenHandlerTrait.php
@@ -97,4 +97,15 @@ public function broken() {
     return TRUE;
   }
 
+  /**
+   * Gets dependencies for a broken handler.
+   *
+   * @return array
+   *
+   * @see \Drupal\views\Plugin\views\PluginBase::calculateDependencies().
+   */
+  public function calculateDependencies() {
+    return array();
+  }
+
 }
diff --git a/core/modules/views/src/Plugin/views/HandlerBase.php b/core/modules/views/src/Plugin/views/HandlerBase.php
index c307178..e9bcb06 100644
--- a/core/modules/views/src/Plugin/views/HandlerBase.php
+++ b/core/modules/views/src/Plugin/views/HandlerBase.php
@@ -165,7 +165,6 @@ protected function defineOptions() {
     $options['relationship'] = array('default' => 'none');
     $options['group_type'] = array('default' => 'group');
     $options['admin_label'] = array('default' => '');
-    $options['dependencies'] = array('default' => array());
 
     return $options;
   }
diff --git a/core/modules/views/src/Plugin/views/PluginBase.php b/core/modules/views/src/Plugin/views/PluginBase.php
index ccb86e3..6d722ff 100644
--- a/core/modules/views/src/Plugin/views/PluginBase.php
+++ b/core/modules/views/src/Plugin/views/PluginBase.php
@@ -386,8 +386,16 @@ public static function preRenderFlattenData($form) {
   /**
    * {@inheritdoc}
    */
-  public function getDependencies() {
-    return array();
+  public function calculateDependencies() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getProvider() {
+    $definition = $this->getPluginDefinition();
+    return $definition['provider'];
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/ViewsPluginInterface.php b/core/modules/views/src/Plugin/views/ViewsPluginInterface.php
index df5de7a..1805156 100644
--- a/core/modules/views/src/Plugin/views/ViewsPluginInterface.php
+++ b/core/modules/views/src/Plugin/views/ViewsPluginInterface.php
@@ -20,14 +20,21 @@
 interface ViewsPluginInterface extends PluginInspectionInterface, DerivativeInspectionInterface {
 
   /**
-   * Returns an array of module dependencies for this plugin.
+   * Returns an array of dependencies for this plugin.
    *
-   * Dependencies are a list of module names, which might depend on the
-   * configuration.
+   * Dependencies are keyed by the type of dependency. 'module', 'entity' and
+   * 'config' are common dependency types for it.
    *
    * @return array
    */
-  public function getDependencies();
+  public function calculateDependencies();
+
+  /**
+   * Returns the plugin provider.
+   *
+   * @return string
+   */
+  public function getProvider();
 
   /**
    * Return the human readable name of the display.
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index d8ff7ae..27f5ffd 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -908,7 +908,7 @@ public function getHandlers($type) {
       $types = ViewExecutable::getHandlerTypes();
       $plural = $types[$type]['plural'];
 
-      foreach ($this->getOption($plural) as $id => $info) {
+      foreach ((array) $this->getOption($plural) as $id => $info) {
         // If this is during form submission and there are temporary options
         // which can only appear if the view is in the edit cache, use those
         // options instead. This is used for AJAX multi-step stuff.
@@ -1988,7 +1988,7 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
             $plugin_options = array(
               'type' => $type,
               'options' => $plugin->options,
-              'provider' => $plugin->definition['provider']
+              'provider' => $plugin->definition['provider'],
             );
             $this->setOption($plugin_type, $plugin_options);
             if ($plugin->usesOptions()) {
diff --git a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
index 2db89fd..98e7e50 100644
--- a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
+++ b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
@@ -118,6 +118,21 @@ public function summaryTitle() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    $dependencies = [];
+
+    foreach ($this->getEntityTableInfo() as $entity_type => $info) {
+      if (!empty($info['provider'])) {
+        $dependencies['module'][] = $info['provider'];
+      }
+    }
+
+    return $dependencies;
+  }
+
+  /**
    * Set a LIMIT on the query, specifying a maximum number of results.
    */
   public function setLimit($limit) {
@@ -260,9 +275,15 @@ public function getEntityTableInfo() {
         'entity_type' => $base_table_data['table']['entity type'],
         'revision' => FALSE,
       );
+
+      // Include the entity provider.
+      if (!empty($table_data['table']['provider'])) {
+        $entity_tables[$table_data['table']['entity type']]['provider'] = $table_data['table']['provider'];
+      }
     }
+
     // Include all relationships.
-    foreach ($this->view->relationship as $relationship_id => $relationship) {
+    foreach ((array) $this->view->relationship as $relationship_id => $relationship) {
       $table_data = $views_data->get($relationship->definition['base']);
       if (isset($table_data['table']['entity type'])) {
         $entity_tables[$table_data['table']['entity type']] = array(
@@ -272,6 +293,11 @@ public function getEntityTableInfo() {
           'entity_type' => $table_data['table']['entity type'],
           'revision' => FALSE,
         );
+
+        // Include the entity provider.
+        if (!empty($table_data['table']['provider'])) {
+          $entity_tables[$table_data['table']['entity type']]['provider'] = $table_data['table']['provider'];
+        }
       }
     }
 
diff --git a/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php b/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
index 8a39ae9..6123d67 100644
--- a/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
+++ b/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
@@ -164,6 +164,18 @@ public function query() {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    // Figure out what base table this relationship brings to the party and add
+    // a dependency on its provider.
+    $table_data = $this->getViewsData()->get($this->definition['base']);
+    return [
+      'module' => [$table_data['table']['provider']],
+    ];
+  }
+
 }
 
 /**
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index b6fa496..9fdd707 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -844,7 +844,6 @@ protected function defaultDisplayOptions() {
     foreach ($display_options as &$options) {
       $options['options'] = array();
       $options['provider'] = 'views';
-      $options['dependencies'] = array();
     }
 
     // Add a least one field so the view validates and the user has a preview.
diff --git a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
index e111fe2..42e952d 100644
--- a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
+++ b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
@@ -7,7 +7,8 @@
 
 namespace Drupal\views\Tests\Entity;
 
-use Drupal\views\Tests\ViewTestBase;
+use Drupal\Component\Utility\Unicode;
+use Drupal\views\Tests\ViewUnitTestBase;
 use Drupal\views\Views;
 
 /**
@@ -15,56 +16,93 @@
  *
  * @group views
  */
-class ViewEntityDependenciesTest extends ViewTestBase {
+class ViewEntityDependenciesTest extends ViewUnitTestBase {
 
   /**
    * Views used by this test.
    *
    * @var array
    */
-  public static $testViews = array('test_field_get_entity');
+  public static $testViews = ['test_field_get_entity', 'test_relationship_dependency', 'test_plugin_dependencies'];
 
   /**
    * Modules to enable.
    *
    * @var array
    */
-  public static $modules = array('node', 'comment');
+  public static $modules = ['node', 'comment', 'user', 'field', 'text'];
 
   /**
    * Tests the calculateDependencies method.
    */
   public function testCalculateDependencies() {
-    // The view is a view of comments, their nodes and their authors, so there
-    // are three layers of entities.
-    $account = entity_create('user', array('name' => $this->randomMachineName(), 'bundle' => 'user'));
-    $account->save();
-    $this->drupalCreateContentType(array('type' => 'page'));
-    $this->container->get('comment.manager')->addDefaultField('node', 'page');
-    // Force a flush of the in-memory storage.
-    $this->container->get('views.views_data')->clear();
 
-    $node = entity_create('node', array('uid' => $account->id(), 'type' => 'page'));
-    $node->save();
-    $comment = entity_create('comment', array(
-      'uid' => $account->id(),
-      'entity_id' => $node->id(),
+    $comment_type = entity_create('comment_type', array(
+      'id' => 'comment',
+      'label' => 'Comment settings',
+      'description' => 'Comment settings',
+      'target_entity_type_id' => 'node',
+    ));
+    $comment_type->save();
+    $content_type = entity_create('node_type', array(
+      'type' => $this->randomMachineName(),
+      'name' => $this->randomString(),
+    ));
+    $content_type->save();
+    $field_storage = entity_create('field_storage_config', array(
+      'field_name' => Unicode::strtolower($this->randomMachineName()),
       'entity_type' => 'node',
-      'field_name' => 'comment'
+      'type' => 'comment',
     ));
-    $comment->save();
-
-    $view = Views::getView('test_field_get_entity');
+    $field_storage->save();
+    entity_create('field_config', array(
+      'field_storage' => $field_storage,
+      'bundle' => $content_type->id(),
+      'label' => $this->randomMachineName() . '_label',
+      'description' => $this->randomMachineName() . '_description',
+      'settings' => array(
+        'comment_type' => $comment_type->id(),
+      ),
+    ))->save();
+    // Force a flush of the in-memory storage.
+    $this->container->get('views.views_data')->clear();
 
-    $expected_dependencies = array(
-      'module' => array(
+    $expected = [];
+    $expected['test_field_get_entity'] = [
+      'module' => [
+        'comment',
+        'node',
+        'user',
+      ]
+    ];
+    // Tests dependencies of relationships.
+    $expected['test_relationship_dependency'] = [
+      'module' => [
         'comment',
         'node',
         'user',
-      )
-    );
-    $dependencies = $view->calculateDependencies();
-    $this->assertEqual($expected_dependencies, $dependencies);
+      ]
+    ];
+    $expected['test_plugin_dependencies'] = [
+      'module' => [
+        'comment',
+        // The argument handler has an explicit dependency on views_test_data.
+        'views_test_data',
+      ],
+      'test_dependency' => [
+        'access',
+        'row',
+        'style',
+      ]
+    ];
+    foreach ($this::$testViews as $view_id) {
+      $view = Views::getView($view_id);
+
+      $dependencies = $view->calculateDependencies();
+      $this->assertEqual($expected[$view_id], $dependencies);
+      $config = \Drupal::config('views.view.' . $view_id);
+      \Drupal::service('config.storage.staging')->write($view_id, $config->get());
+    }
   }
 
 }
diff --git a/core/modules/views/src/ViewsData.php b/core/modules/views/src/ViewsData.php
index 9578994..796e94b 100644
--- a/core/modules/views/src/ViewsData.php
+++ b/core/modules/views/src/ViewsData.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views;
 
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
@@ -230,7 +231,18 @@ protected function getData() {
       return $data->data;
     }
     else {
-      $data = $this->moduleHandler->invokeAll('views_data');
+      $modules = $this->moduleHandler->getImplementations('views_data');
+      $data = [];
+      foreach ($modules as $module) {
+        $views_data = $this->moduleHandler->invoke($module, 'views_data');
+        // Set the provider key for each base table.
+        foreach ($views_data as &$table) {
+          if (isset($table['table']) && !isset($table['table']['provider'])) {
+            $table['table']['provider'] = $module;
+          }
+        }
+        $data = NestedArray::mergeDeep($data, $views_data);
+      }
       $this->moduleHandler->alter('views_data', $data);
 
       $this->processEntityTypes($data);
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_plugin_dependencies.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_plugin_dependencies.yml
new file mode 100644
index 0000000..b029dd4
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_plugin_dependencies.yml
@@ -0,0 +1,61 @@
+base_table: comment
+core: 8.0-dev
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      access:
+        type: test_static
+        dependencies:
+          test_dependency:
+            - style
+      arguments:
+        'null':
+          default_action: default
+          default_argument_type: fixed
+          id: 'null'
+          must_not_be: '0'
+          style_plugin: default_summary
+          table: views
+          field: null
+          plugin_id: 'null'
+          provider: views_test_data
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        cid:
+          field: cid
+          id: cid
+          table: comment
+          plugin_id: comment
+          provider: comment
+      filter_groups:
+        groups: {  }
+        operator: AND
+      filters: {  }
+      pager:
+        type: full
+      query:
+        type: views_query
+      relationships:
+      sorts: {  }
+      style:
+        type: test_style
+        dependencies:
+          test_dependency:
+            - style
+      row:
+        type: test_row
+        dependencies:
+          test_dependency:
+            - row
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
+label: test_plugin_dependencies
+id: test_plugin_dependencies
+tag: default
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_relationship_dependency.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_relationship_dependency.yml
new file mode 100644
index 0000000..b2b1b08
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_relationship_dependency.yml
@@ -0,0 +1,47 @@
+base_table: comment
+core: 8.0-dev
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        cid:
+          field: cid
+          id: cid
+          table: comment
+          plugin_id: comment
+          provider: comment
+      filter_groups:
+        groups: {  }
+        operator: AND
+      filters: {  }
+      pager:
+        type: full
+      query:
+        type: views_query
+      relationships:
+        node:
+          field: node
+          id: node
+          table: comment_field_data
+          required: true
+          plugin_id: standard
+      sorts: {  }
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
+label: test_relationship_dependency
+id: test_relationship_dependency
+tag: default
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
index e880b48..0f95a09 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/access/StaticTest.php
@@ -42,4 +42,13 @@ public function alterRouteDefinition(Route $route) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return [
+      'test_dependency' => ['access'],
+    ];
+  }
+
 }
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/argument_default/ArgumentDefaultTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/argument_default/ArgumentDefaultTest.php
index ece75e0..91f2a39 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/argument_default/ArgumentDefaultTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/argument_default/ArgumentDefaultTest.php
@@ -36,4 +36,13 @@ public function getArgument() {
     return $this->options['value'];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return [
+      'test_dependency' => ['argument_default'],
+    ];
+  }
+
 }
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display/DisplayTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display/DisplayTest.php
index 0fd5c1a..c466fa9 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display/DisplayTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display/DisplayTest.php
@@ -140,4 +140,13 @@ public function preview() {
     return $this->execute();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return parent::calculateDependencies() + [
+      'test_dependency' => ['display'],
+    ];
+  }
+
 }
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/query/QueryTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/query/QueryTest.php
index 546a635..f81c500 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/query/QueryTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/query/QueryTest.php
@@ -146,5 +146,13 @@ public function match($element, $condition) {
     return FALSE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return parent::calculateDependencies() + [
+      'test_dependency' => ['query'],
+    ];
+  }
 
 }
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/row/RowTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/row/RowTest.php
index 1a7dbdc..f4489e1 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/row/RowTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/row/RowTest.php
@@ -82,4 +82,13 @@ public function render($row) {
     return $this->getOutput();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return [
+      'test_dependency' => ['row'],
+    ];
+  }
+
 }
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/style/StyleTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/style/StyleTest.php
index 3cf8779..1f891cc 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/style/StyleTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/style/StyleTest.php
@@ -111,4 +111,13 @@ public function render() {
     return $output;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return [
+      'test_dependency' => ['style'],
+    ];
+  }
+
 }
diff --git a/core/modules/views/tests/modules/views_test_data/views_test_data.views.inc b/core/modules/views/tests/modules/views_test_data/views_test_data.views.inc
index 4fe1fe4..ceaa8e9 100644
--- a/core/modules/views/tests/modules/views_test_data/views_test_data.views.inc
+++ b/core/modules/views/tests/modules/views_test_data/views_test_data.views.inc
@@ -23,7 +23,7 @@ function views_test_data_views_data() {
   $count++;
   $state->set('views_test_data_views_data_count', $count);
 
-  return $state->get('views_test_data_views_data');
+  return $state->get('views_test_data_views_data', []);
 }
 
 /**
diff --git a/core/modules/views/tests/src/Unit/Entity/ViewTest.php b/core/modules/views/tests/src/Unit/Entity/ViewTest.php
deleted file mode 100644
index 8af4e6d..0000000
--- a/core/modules/views/tests/src/Unit/Entity/ViewTest.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\views\Unit\Entity\ViewTest.
- */
-
-namespace Drupal\Tests\views\Unit\Entity {
-
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\Entity\EntityType;
-use Drupal\Tests\UnitTestCase;
-use Drupal\views\Entity\View;
-
-/**
- * @coversDefaultClass \Drupal\views\Entity\View
- * @group views
- */
-class ViewTest extends UnitTestCase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-
-    // Setup the entity manager.
-    $entity_definition = new EntityType(array('id' => 'view'));
-    $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
-    $entity_manager->expects($this->any())
-      ->method('getDefinition')
-      ->will($this->returnValue($entity_definition));
-    $container_builder = new ContainerBuilder();
-    $container_builder->set('entity.manager', $entity_manager);
-
-    // Setup the string translation.
-    $string_translation = $this->getStringTranslationStub();
-    $container_builder->set('string_translation', $string_translation);
-    \Drupal::setContainer($container_builder);
-  }
-
-  /**
-   * Tests calculating dependencies.
-   *
-   * @covers ::calculateDependencies
-   * @dataProvider calculateDependenciesProvider
-   */
-  public function testCalculateDependencies($values, $deps) {
-    $view = new TestView($values, 'view');
-    $this->assertEquals(array('module' => $deps), $view->calculateDependencies());
-  }
-
-  public function calculateDependenciesProvider(){
-    $handler['display']['default']['provider'] = 'block';
-    $handler['display']['default']['display_options']['fields']['example']['dependencies'] = array();
-    $handler['display']['default']['display_options']['fields']['example2']['dependencies']['module'] = array('views', 'field');
-    $handler['display']['default']['display_options']['fields']['example3']['dependencies']['module'] = array('views', 'image');
-
-    $plugin['display']['default']['display_options']['access']['options']['dependencies'] = array();
-    $plugin['display']['default']['display_options']['row']['options']['dependencies']['module'] = array('views', 'field');
-    $plugin['display']['default']['display_options']['style']['options']['dependencies']['module'] = array('views', 'image');
-
-    return array(
-      array(array(), array('node', 'views')),
-      array($handler, array('block', 'field', 'image', 'node', 'views')),
-      array($plugin, array('field', 'image', 'node', 'views')),
-    );
-  }
-}
-
-class TestView extends View {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function drupalGetSchema($table = NULL, $rebuild = FALSE) {
-    $result = array();
-    if ($table == 'node') {
-      $result['module'] = 'node';
-    }
-    return $result;
-  }
-
-}
-
-}
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index 3199a51..476a199 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -35,7 +35,7 @@ class EntityViewsDataTest extends UnitTestCase {
   /**
    * Entity info to use in this test.
    *
-   * @var \Drupal\Core\Entity\EntityTypeInterface
+   * @var \Drupal\Core\Entity\EntityTypeInterface|\Drupal\views\Tests\TestEntityType
    */
   protected $baseEntityType;
 
@@ -88,6 +88,7 @@ protected function setUp() {
       'id' => 'entity_test',
       'label' => 'Entity test',
       'entity_keys' => ['id' => 'id'],
+      'provider' => 'entity_test',
     ]);
 
     $this->translationManager = $this->getStringTranslationStub();
@@ -160,6 +161,7 @@ public function testBaseTables() {
 
     $this->assertEquals('entity_test', $data['entity_test']['table']['entity type']);
     $this->assertEquals('Entity test', $data['entity_test']['table']['group']);
+    $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
 
     $this->assertEquals('id', $data['entity_test']['table']['base']['field']);
     $this->assertEquals('Entity test', $data['entity_test']['table']['base']['title']);
@@ -188,6 +190,7 @@ public function testDataTable() {
 
     $this->assertEquals('entity_test_mul', $data['entity_test_mul_property_data']['table']['entity type']);
     $this->assertEquals('Entity test', $data['entity_test_mul_property_data']['table']['group']);
+    $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
     $this->assertEquals(['field' => 'label', 'table' => 'entity_test_mul_property_data'], $data['entity_test']['table']['base']['defaults']);
 
     // Ensure the join information is set up properly.
@@ -214,6 +217,7 @@ public function testRevisionTable() {
     $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_revision']['table']['entity type']);
     $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_property_revision']['table']['entity type']);
     $this->assertEquals('Entity test revision', $data['entity_test_mulrev_revision']['table']['group']);
+    $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
 
     // Ensure the join information is set up properly.
     // Tests the join definition between the base and the revision table.
diff --git a/core/modules/views/tests/src/Unit/ViewsDataTest.php b/core/modules/views/tests/src/Unit/ViewsDataTest.php
index 43528c3..0476ffd 100644
--- a/core/modules/views/tests/src/Unit/ViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/ViewsDataTest.php
@@ -109,20 +109,51 @@ protected function viewsData() {
   }
 
   /**
-   * Tests the fetchBaseTables() method.
+   * Returns the views data definition with the provider key.
+   *
+   * @return array
+   *
+   * @see static::viewsData()
    */
-  public function testFetchBaseTables() {
-    $views_data = $this->viewsData();
+  protected function viewsDataWithProvider() {
+    $views_data = static::viewsData();
+    foreach (array_keys($views_data) as $table) {
+      $views_data[$table]['table']['provider'] = 'views_test_data';
+    }
+    return $views_data;
+  }
 
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
+  /**
+   * Mocks the basic module handler used for the test.
+   *
+   * @return \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected function setupMockedModuleHandler() {
+    $views_data = $this->viewsData();
+    $this->moduleHandler->expects($this->at(0))
+      ->method('getImplementations')
       ->with('views_data')
-      ->will($this->returnValue($views_data));
+      ->willReturn(array('views_test_data'));
+    $this->moduleHandler->expects($this->at(1))
+      ->method('invoke')
+      ->with('views_test_data', 'views_data')
+      ->willReturn($views_data);
+  }
 
+  /**
+   * Tests the fetchBaseTables() method.
+   */
+  public function testFetchBaseTables() {
+    $this->setupMockedModuleHandler();
     $data = $this->viewsData->get();
 
     $base_tables = $this->viewsData->fetchBaseTables();
 
+    // Ensure that 'provider' is set for each base table.
+    foreach (array_keys($base_tables) as $base_table) {
+      $this->assertEquals('views_test_data', $data[$base_table]['table']['provider']);
+    }
+
     // Test the number of tables returned and their order.
     $this->assertCount(6, $base_tables, 'The correct amount of base tables were returned.');
     $base_tables_keys = array_keys($base_tables);
@@ -151,24 +182,19 @@ public function testFetchBaseTables() {
    * Tests fetching all the views data without a static cache.
    */
   public function testGetOnFirstCall() {
-    $views_data = $this->viewsData();
-
     // Ensure that the hooks are just invoked once.
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->with('views_data')
-      ->will($this->returnValue($views_data));
+    $this->setupMockedModuleHandler();
 
-    $this->moduleHandler->expects($this->once())
+    $this->moduleHandler->expects($this->at(2))
       ->method('alter')
-      ->with('views_data', $views_data);
+      ->with('views_data', $this->viewsDataWithProvider());
 
     $this->cacheBackend->expects($this->once())
       ->method('get')
       ->with("views_data:en")
       ->will($this->returnValue(FALSE));
 
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $views_data = $this->viewsData->get();
     $this->assertSame($expected_views_data, $views_data);
   }
@@ -177,21 +203,37 @@ public function testGetOnFirstCall() {
    * Tests the cache of the full and single table data.
    */
   public function testFullAndTableGetCache() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $table_name = 'views_test_data';
     $table_name_2 = 'views_test_data_2';
     $random_table_name = $this->randomMachineName();
 
     // Views data should be invoked twice due to the clear call.
-    $this->moduleHandler->expects($this->exactly(2))
-      ->method('invokeAll')
+    $this->moduleHandler->expects($this->at(0))
+      ->method('getImplementations')
       ->with('views_data')
-      ->will($this->returnValue($expected_views_data));
+      ->willReturn(array('views_test_data'));
+    $this->moduleHandler->expects($this->at(1))
+      ->method('invoke')
+      ->with('views_test_data', 'views_data')
+      ->willReturn($this->viewsData());
+    $this->moduleHandler->expects($this->at(2))
+      ->method('alter')
+      ->with('views_data', $expected_views_data);
 
-    $this->moduleHandler->expects($this->exactly(2))
+    $this->moduleHandler->expects($this->at(3))
+      ->method('getImplementations')
+      ->with('views_data')
+      ->willReturn(array('views_test_data'));
+    $this->moduleHandler->expects($this->at(4))
+      ->method('invoke')
+      ->with('views_test_data', 'views_data')
+      ->willReturn($this->viewsData());
+    $this->moduleHandler->expects($this->at(5))
       ->method('alter')
       ->with('views_data', $expected_views_data);
 
+
     // The cache should only be called once (before the clear() call) as get
     // will get all table data in the first get().
     $this->cacheBackend->expects($this->at(0))
@@ -252,13 +294,10 @@ public function testFullAndTableGetCache() {
    * Tests the caching of the full views data.
    */
   public function testFullGetCache() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
 
     // Views data should be invoked once.
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->with('views_data')
-      ->will($this->returnValue($expected_views_data));
+    $this->setupMockedModuleHandler();
 
     $this->moduleHandler->expects($this->once())
       ->method('alter')
@@ -281,17 +320,14 @@ public function testFullGetCache() {
    */
   public function testSingleTableGetCache() {
     $table_name = 'views_test_data';
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
 
     // Views data should be invoked once.
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->with('views_data')
-      ->will($this->returnValue($expected_views_data));
+    $this->setupMockedModuleHandler();
 
     $this->moduleHandler->expects($this->once())
       ->method('alter')
-      ->with('views_data', $expected_views_data);
+      ->with('views_data', $this->viewsDataWithProvider());
 
     $this->cacheBackend->expects($this->at(0))
       ->method('get')
@@ -320,17 +356,13 @@ public function testSingleTableGetCache() {
    */
   public function testNonExistingTableGetCache() {
     $random_table_name = $this->randomMachineName();
-    $expected_views_data = $this->viewsData();
 
     // Views data should be invoked once.
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->with('views_data')
-      ->will($this->returnValue($expected_views_data));
+    $this->setupMockedModuleHandler();
 
     $this->moduleHandler->expects($this->once())
       ->method('alter')
-      ->with('views_data', $expected_views_data);
+      ->with('views_data', $this->viewsDataWithProvider());
 
     $this->cacheBackend->expects($this->at(0))
       ->method('get')
@@ -354,12 +386,9 @@ public function testNonExistingTableGetCache() {
    * Tests the cache backend behavior with requesting the same table multiple
    */
   public function testCacheCallsWithSameTableMultipleTimes() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
 
-    $this->moduleHandler->expects($this->any())
-      ->method('invokeAll')
-      ->with('views_data')
-      ->will($this->returnValue($expected_views_data));
+    $this->setupMockedModuleHandler();
 
     $this->cacheBackend->expects($this->at(0))
       ->method('get')
@@ -392,9 +421,9 @@ public function testCacheCallsWithSameTableMultipleTimes() {
    *   - views_test_data
    */
   public function testCacheCallsWithSameTableMultipleTimesAndWarmCache() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $this->moduleHandler->expects($this->never())
-      ->method('invokeAll');
+      ->method('getImplementations');
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->once())
@@ -422,9 +451,9 @@ public function testCacheCallsWithSameTableMultipleTimesAndWarmCache() {
    *   - views_test_data_2
    */
   public function testCacheCallsWithWarmCacheAndDifferentTable() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $this->moduleHandler->expects($this->never())
-      ->method('invokeAll');
+      ->method('getImplementations');
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->at(0))
@@ -457,10 +486,10 @@ public function testCacheCallsWithWarmCacheAndDifferentTable() {
    *   - $non_existing_table
    */
   public function testCacheCallsWithWarmCacheAndInvalidTable() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $non_existing_table = $this->randomMachineName();
     $this->moduleHandler->expects($this->never())
-      ->method('invokeAll');
+      ->method('getImplementations');
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->at(0))
@@ -496,7 +525,7 @@ public function testCacheCallsWithWarmCacheAndInvalidTable() {
   public function testCacheCallsWithWarmCacheForInvalidTable() {
     $non_existing_table = $this->randomMachineName();
     $this->moduleHandler->expects($this->never())
-      ->method('invokeAll');
+      ->method('getImplementations');
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->once())
@@ -521,10 +550,8 @@ public function testCacheCallsWithWarmCacheForInvalidTable() {
    * Tests the cache calls for all views data without a warm cache.
    */
   public function testCacheCallsWithoutWarmCacheAndGetAllTables() {
-    $expected_views_data = $this->viewsData();
-    $this->moduleHandler->expects($this->once())
-      ->method('invokeAll')
-      ->will($this->returnValue($expected_views_data));
+    $expected_views_data = $this->viewsDataWithProvider();
+    $this->setupMockedModuleHandler();
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->once())
@@ -549,9 +576,9 @@ public function testCacheCallsWithoutWarmCacheAndGetAllTables() {
    *   - all tables
    */
   public function testCacheCallsWithWarmCacheAndGetAllTables() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $this->moduleHandler->expects($this->never())
-      ->method('invokeAll');
+      ->method('getImplementations');
 
     // Setup a warm cache backend for a single table.
     $this->cacheBackend->expects($this->once())
@@ -575,7 +602,7 @@ public function testCacheCallsWithWarmCacheAndGetAllTables() {
    * @covers ::get
    */
   public function testCacheCallsWithoutWarmCacheAndGetMultipleTables() {
-    $expected_views_data = $this->viewsData();
+    $expected_views_data = $this->viewsDataWithProvider();
     $table_name = 'views_test_data';
     $table_name_2 = 'views_test_data_2';
 
diff --git a/core/modules/views_ui/src/Form/Ajax/ConfigHandler.php b/core/modules/views_ui/src/Form/Ajax/ConfigHandler.php
index 90de6d9..bdad87b 100644
--- a/core/modules/views_ui/src/Form/Ajax/ConfigHandler.php
+++ b/core/modules/views_ui/src/Form/Ajax/ConfigHandler.php
@@ -242,14 +242,6 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     // extra stuff on the form is not sent through.
     $handler->unpackOptions($handler->options, $options, NULL, FALSE);
 
-    // Add any dependencies as the handler is saved. Put it here so
-    // it does not need to be declared in defineOptions().
-    if ($dependencies = $handler->getDependencies()) {
-      $handler->options['dependencies'] = $dependencies;
-    }
-    // Add the module providing the handler as a dependency as well.
-    $handler->options['dependencies']['module'][] = $handler->definition['provider'];
-
     // Store the item back on the view
     $executable->setHandler($display_id, $type, $id, $handler->options);
 
