diff --git a/core/modules/comment/src/Plugin/views/wizard/Comment.php b/core/modules/comment/src/Plugin/views/wizard/Comment.php
index c2c4ff4..6005842 100644
--- a/core/modules/comment/src/Plugin/views/wizard/Comment.php
+++ b/core/modules/comment/src/Plugin/views/wizard/Comment.php
@@ -149,6 +149,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']);
@@ -158,6 +159,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 fc5aadb..336086a 100644
--- a/core/modules/node/src/Plugin/views/wizard/Node.php
+++ b/core/modules/node/src/Plugin/views/wizard/Node.php
@@ -137,6 +137,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..2bbaa21 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']['timestamp']['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 1c34511..8cd6934 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_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 37c9a5c..20ec3eb 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';
     $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 93c446c..aff0c62 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -274,15 +274,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 f19520a..ccf9ea9 100644
--- a/core/modules/views/src/Plugin/views/PluginBase.php
+++ b/core/modules/views/src/Plugin/views/PluginBase.php
@@ -432,6 +432,9 @@ public static function preRenderFlattenData($form) {
    * Dependencies are a list of module names, which might depend on the
    * configuration.
    *
+   * @todo Update this docblock to reflect the dependencies structure for module,
+   *   entity etc..
+   *
    * @return array
    */
   public function getDependencies() {
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index a5e6e15..4870098 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -1985,7 +1985,8 @@ public function submitOptionsForm(&$form, &$form_state) {
             $plugin_options = array(
               'type' => $form_state['values'][$plugin_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()) {
@@ -2008,6 +2009,9 @@ public function submitOptionsForm(&$form, &$form_state) {
           $plugin_options = $this->getOption($plugin_type);
           $plugin->submitOptionsForm($form[$plugin_type . '_options'], $form_state);
           $plugin_options['options'] = $form_state['values'][$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;
@@ -2484,6 +2488,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);
     }
   }
@@ -2501,6 +2506,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 4e917c1..a621146 100644
--- a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
+++ b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
@@ -285,6 +285,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 a52d7dd..fac2a48 100644
--- a/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
+++ b/core/modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php
@@ -162,6 +162,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 093cfb9..a1475a6 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->randomName(), '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(
+    // Tests dependencies of fields.
+    $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 depedency 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 ad8e801..8d0ac0f 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -296,7 +296,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 1447c67..dddd5c3 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
@@ -139,4 +139,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 77a9607..ffd7b50 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
@@ -145,5 +145,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 e6edd02..03ec609 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
@@ -81,4 +81,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 02dd245..8726249 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
@@ -110,4 +110,13 @@ public function render() {
     return $output;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDependencies() {
+    return array(
+      'test_dependency' => array('style'),
+    );
+  }
+
 }
