diff --git a/core/modules/comment/src/Plugin/views/wizard/Comment.php b/core/modules/comment/src/Plugin/views/wizard/Comment.php
index 0c18266..7b69be5 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'] = array();
 
     // 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'] = array();
     $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/file/src/Plugin/views/wizard/File.php b/core/modules/file/src/Plugin/views/wizard/File.php
index 94529a0..068a2c1 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'] = array();
     $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 93401db..de7ef79 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'] = array();
     $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..98de6c8 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'] = array();
     $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'] = array();
     $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..8b7f4ce 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'] = array();
     $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..fb71218 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'] = array();
     $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 1ad685a..88546ea 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -279,15 +279,22 @@ public function calculateDependencies() {
             // Add the additional dependencies from the handler configuration.
             if (!empty($handler['dependencies'])) {
               $this->addDependencies($handler['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']);
+        // Add the provider as a dependency.
+        if (!empty($display['display_options'][$plugin_type]['provider'])) {
+          $this->addDependency('module', $display['display_options'][$plugin_type]['provider']);
+        }
+        if (!empty($display['display_options'][$plugin_type]['dependencies'])) {
+          $this->addDependencies($display['display_options'][$plugin_type]['dependencies']);
         }
       }
     }
diff --git a/core/modules/views/src/Plugin/views/PluginBase.php b/core/modules/views/src/Plugin/views/PluginBase.php
index a92027d..d3bbd43 100644
--- a/core/modules/views/src/Plugin/views/PluginBase.php
+++ b/core/modules/views/src/Plugin/views/PluginBase.php
@@ -392,6 +392,9 @@ public function getDependencies() {
    *   - \Drupal\views\Plugin\views\PluginBase::INCLUDE_NEGOTIATED: Add
    *     negotiated language types.
    *
+   * @todo Update this docblock to reflect the dependencies structure for module,
+   *   entity etc..
+   *
    * @return array
    *   An array of language names, keyed by the language code. Negotiated and
    *   special languages have special codes that are substituted in queries by
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index 22e8d16..165c2ca 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -1986,7 +1986,8 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
             $plugin_options = array(
               'type' => $type,
               'options' => $plugin->options,
-              'provider' => $plugin->definition['provider']
+              'provider' => $plugin->definition['provider'],
+              'dependencies' => $plugin->getDependencies(),
             );
             $this->setOption($plugin_type, $plugin_options);
             if ($plugin->usesOptions()) {
@@ -2009,6 +2010,9 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
           $plugin_options = $this->getOption($plugin_type);
           $plugin->submitOptionsForm($form[$plugin_type . '_options'], $form_state);
           $plugin_options['options'] = $form_state->getValue($section);
+          // Dependencies could change if the plugin settings form has been
+          // re-configured.
+          $plugin_options['dependencies'] = $plugin->getDependencies();
           $this->setOption($plugin_type, $plugin_options);
         }
         break;
@@ -2557,6 +2561,7 @@ protected function mergePlugin($type) {
     if (($options = $this->getOption($type)) && isset($options['options'])) {
       $plugin = $this->getPlugin($type);
       $options['options'] = $options['options'] + $plugin->options;
+      $options['dependencies'] = $plugin->getDependencies();
       $this->setOption($type, $options);
     }
   }
@@ -2574,6 +2579,7 @@ protected function mergeHandler($type) {
     foreach ($this->getHandlers($type) as $id => $handler) {
       if (isset($options[$id])) {
         $options[$id] = $options[$id] + $handler->options;
+        $options[$id]['dependencies'] = $handler->getDependencies();
       }
     }
 
diff --git a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
index 4097efa..a6dcb95 100644
--- a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
+++ b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
@@ -286,6 +286,15 @@ public function getEntityTableInfo() {
     return $entity_tables;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDependencies() {
+    // Return an array of all entity types used in the query including
+    // relationships.
+    return array('entity' => array_keys($this->getEntityTableInfo()));
+  }
+
 }
 
 /**
diff --git a/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php b/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
index a75ffeb..38227a1 100644
--- a/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
+++ b/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
@@ -163,6 +163,22 @@ public function query() {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * @todo Just remove this and rely on query dependencies?
+   */
+  public function getDependencies() {
+    $dependencies = array();
+
+    if (($table_data = Views::viewsData()->get($this->definition['base'])) && isset($table_data['table']['entity type'])) {
+     $dependencies['entity'][] = $table_data['table']['entity type'];
+    }
+
+    return $dependencies;
+  }
+
+
 }
 
 /**
diff --git a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
index e111fe2..b317905 100644
--- a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
+++ b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\views\Tests\Entity;
 
 use Drupal\views\Tests\ViewTestBase;
+use Drupal\views\Tests\ViewUnitTestBase;
 use Drupal\views\Views;
 
 /**
@@ -15,56 +16,57 @@
  *
  * @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 = array('test_field_get_entity', 'test_relationship_dependency', 'test_plugin_dependencies');
 
   /**
    * Modules to enable.
    *
    * @var array
    */
-  public static $modules = array('node', 'comment');
+  public static $modules = array('node', 'comment', 'user', 'field');
 
   /**
    * 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(),
-      'entity_type' => 'node',
-      'field_name' => 'comment'
-    ));
-    $comment->save();
-
-    $view = Views::getView('test_field_get_entity');
-
-    $expected_dependencies = array(
+    $expected = array();
+    $expected['test_field_get_entity'] = array(
       'module' => array(
         'comment',
         'node',
         'user',
       )
     );
-    $dependencies = $view->calculateDependencies();
-    $this->assertEqual($expected_dependencies, $dependencies);
+    // Tests dependencies of relationships.
+    $expected['test_relationship_dependency'] = array(
+      'module' => array(
+        'comment',
+        'node',
+      )
+    );
+    $expected['test_plugin_dependencies'] = array(
+      'module' => array(
+        'comment',
+        // The argument handler has an explicit dependency on views_test_data.
+        'views_test_data',
+      ),
+      'test_dependency' => array(
+        'row', 'style',
+      )
+    );
+    foreach ($expected as $view_id => $expected_dependencies) {
+      $view = Views::getView($view_id);
+
+      $dependencies = $view->calculateDependencies();
+      $this->assertEqual($expected_dependencies, $dependencies);
+    }
   }
 
 }
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index 34f7500..c06afeb 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -297,7 +297,7 @@ class ViewExecutable {
    *
    * @var array
    */
-  public $relationship;
+  public $relationship = array();
 
   /**
    * Stores the area handlers for the header which are initialized on this view.
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..ceb2305
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_plugin_dependencies.yml
@@ -0,0 +1,60 @@
+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
+          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..c72e6ac
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_relationship_dependency.yml
@@ -0,0 +1,51 @@
+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
+          required: '1'
+          table: comment_field_data
+          plugin_id: standard
+          provider: views
+          dependencies:
+            module:
+              - node
+      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 c45d77e..325896a 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 getDependencies() {
+    return array(
+      'test_dependency' => array('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..36047bd 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 getDependencies() {
+    return array(
+      'test_dependency' => array('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 5eefaf1..ccdd243 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 getDependencies() {
+    return parent::getDependencies() + array(
+      'test_dependency' => array('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 5a1b61b..205ad50 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 getDependencies() {
+    return parent::getDependencies() + array(
+      'test_dependency' => array('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 cb759a3..cc9cf14 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 getDependencies() {
+    return array(
+      'test_dependency' => array('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 748dbd2..3c20521 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 getDependencies() {
+    return array(
+      'test_dependency' => array('style'),
+    );
+  }
+
 }
diff --git a/core/modules/views/tests/src/Unit/Entity/ViewTest.php b/core/modules/views/tests/src/Unit/Entity/ViewTest.php
index 8af4e6d..c2c71e9 100644
--- a/core/modules/views/tests/src/Unit/Entity/ViewTest.php
+++ b/core/modules/views/tests/src/Unit/Entity/ViewTest.php
@@ -55,9 +55,9 @@ public function calculateDependenciesProvider(){
     $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');
+    $plugin['display']['default']['display_options']['access']['dependencies'] = array();
+    $plugin['display']['default']['display_options']['row']['dependencies']['module'] = array('views', 'field');
+    $plugin['display']['default']['display_options']['style']['dependencies']['module'] = array('views', 'image');
 
     return array(
       array(array(), array('node', 'views')),
