diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php
index af3dad1..7077ed8 100644
--- a/core/modules/views/src/Plugin/views/field/Field.php
+++ b/core/modules/views/src/Plugin/views/field/Field.php
@@ -7,17 +7,21 @@
 
 namespace Drupal\views\Plugin\views\field;
 
+use Drupal\Component\Plugin\DependentPluginInterface;
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheableDependencyInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\Field\FormatterPluginManager;
 use Drupal\Core\Form\FormHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Plugin\PluginDependencyTrait;
 use Drupal\Core\Render\BubbleableMetadata;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\RendererInterface;
@@ -41,6 +45,7 @@
  */
 class Field extends FieldPluginBase implements CacheableDependencyInterface, MultiItemsFieldHandlerInterface {
   use FieldAPIHandlerTrait;
+  use PluginDependencyTrait;
 
   /**
    * An array to store field renderable arrays for use by renderItems().
@@ -476,20 +481,9 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
 
     $settings = $this->options['settings'] + $this->formatterPluginManager->getDefaultSettings($format);
 
-    $options = array(
-      'field_definition' => $field,
-      'configuration' => array(
-        'type' => $format,
-        'settings' => $settings,
-        'label' => '',
-        'weight' => 0,
-      ),
-      'view_mode' => '_custom',
-    );
-
     // Get the settings form.
     $settings_form = array('#value' => array());
-    if ($formatter = $this->formatterPluginManager->getInstance($options)) {
+    if ($formatter = $this->getFormatterInstance($field, $format, $settings)) {
       $settings_form = $formatter->settingsForm($form, $form_state);
       // Convert field UI selector states to work in the Views field form.
       FormHelper::rewriteStatesSelector($settings_form, "fields[{$field->getName()}][settings_edit_form]", 'options');
@@ -949,21 +943,52 @@ protected function addSelfTokens(&$tokens, $item) {
   }
 
   /**
+   * Returns the field formatter instance.
+   *
+   * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
+   *   The field definition
+   * @param string $formatter
+   *   The formatter type.
+   * @param array $formatter_settings
+   *   The formatter settings.
+   *
+   * @return \Drupal\Core\Field\FormatterInterface|null
+   */
+  protected function getFormatterInstance(FieldDefinitionInterface $field_definition, $formatter, array $formatter_settings) {
+    $options = array(
+      'field_definition' => $field_definition,
+      'configuration' => [
+        'type' => $formatter,
+        'settings' => $formatter_settings,
+        'label' => '',
+        'weight' => 0,
+      ],
+      'view_mode' => '_custom',
+    );
+
+    return $this->formatterPluginManager->getInstance($options);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function calculateDependencies() {
-    $dependencies = parent::calculateDependencies();
+    $this->dependencies = parent::calculateDependencies();
 
     // Add the module providing the configured field storage as a dependency.
     if (($field_storage_definition = $this->getFieldStorageDefinition()) && $field_storage_definition instanceof EntityInterface) {
-      $dependencies['config'][] = $field_storage_definition->getConfigDependencyName();
+      $this->dependencies['config'][] = $field_storage_definition->getConfigDependencyName();
     }
     // Add the module providing the formatter.
     if (!empty($this->options['type'])) {
-      $dependencies['module'][] = $this->formatterPluginManager->getDefinition($this->options['type'])['provider'];
+      $this->dependencies['module'][] = $this->formatterPluginManager->getDefinition($this->options['type'])['provider'];
+
+      if (($formatter = $this->getFormatterInstance($this->getFieldDefinition(), $this->options['type'], $this->options['settings'])) && $formatter instanceof DependentPluginInterface) {
+        $this->calculatePluginDependencies($formatter);
+      }
     }
 
-    return $dependencies;
+    return $this->dependencies;
   }
 
   /**
diff --git a/core/modules/views/src/Tests/DependenciesTest.php b/core/modules/views/src/Tests/DependenciesTest.php
new file mode 100644
index 0000000..4820086
--- /dev/null
+++ b/core/modules/views/src/Tests/DependenciesTest.php
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\DependenciesTest.
+ */
+
+namespace Drupal\views\Tests;
+
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\Core\Entity\Entity\EntityViewDisplay;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\node\Entity\Node;
+use Drupal\views\Entity\View;
+
+/**
+ * Tests general rendering of a view.
+ *
+ * @group views
+ */
+class DependenciesTest extends ViewTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $testViews = ['entity_test_fields_dependencies'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['views_test_config', 'entity_test', 'user', 'node', 'image', 'field_ui', 'image_module_test'];
+
+  /**
+   * An user with permissions to administer content types and image styles.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp(FALSE);
+
+    $this->enableViewsTestModule();
+
+    // Create Basic page and Article node types.
+    if ($this->profile != 'standard') {
+      $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
+      $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+    }
+
+    $this->adminUser = $this->drupalCreateUser(['access content', 'access administration pages', 'administer site configuration', 'administer content types', 'administer node fields', 'administer nodes', 'create article content', 'edit any article content', 'delete any article content', 'administer image styles', 'administer node display']);
+    $this->drupalLogin($this->adminUser);
+
+    // Create an image field that uses the new style.
+    $field_name = 'field_image';
+    $this->createImageField($field_name, 'article');
+
+    ViewTestData::createTestViews(get_class($this), ['views_test_config']);
+  }
+
+  /**
+   * Tests Image Style Dependency.
+   */
+  public function testImageStyleDependency() {
+    $this->drupalGet('admin/config/media/image-styles/manage/thumbnail/delete');
+
+    // A warning shows that the view will be deleted.
+    $this->assertRaw('Show Image Fields');
+
+    /** @var \Drupal\views\Entity\View $view */
+    $view = View::load('entity_test_fields_dependencies');
+    $expected = [
+      'module' => ['image', 'node', 'user'],
+      'config' => [
+        'field.storage.node.field_image',
+        'image.style.thumbnail',
+      ],
+    ];
+    $view->calculateDependencies();
+    $this->assertEqual($expected, $view->getDependencies());
+  }
+
+  /**
+   * Create a new image field.
+   *
+   * @param string $name
+   *   The name of the new field (all lowercase), exclude the "field_" prefix.
+   * @param string $type_name
+   *   The node type that this field will be added to.
+   * @param array $storage_settings
+   *   (optional) A list of field storage settings that will be added to the defaults.
+   * @param array $field_settings
+   *   (optional) A list of instance settings that will be added to the instance defaults.
+   * @param array $widget_settings
+   *   (optional) A list of widget settings that will be added to the widget defaults.
+   *
+   * @return \Drupal\field\FieldConfigInterface
+   *   The created field config.
+   */
+  function createImageField($name, $type_name, $storage_settings = [], $field_settings = [], $widget_settings = []) {
+    FieldStorageConfig::create([
+      'field_name' => $name,
+      'entity_type' => 'node',
+      'type' => 'image',
+      'settings' => $storage_settings,
+      'cardinality' => !empty($storage_settings['cardinality']) ? $storage_settings['cardinality'] : 1,
+    ])->save();
+
+    $field_config = FieldConfig::create([
+      'field_name' => $name,
+      'label' => $name,
+      'entity_type' => 'node',
+      'bundle' => $type_name,
+      'required' => !empty($field_settings['required']),
+      'settings' => $field_settings,
+    ]);
+    $field_config->save();
+
+    EntityFormDisplay::load("node.$type_name.default")
+      ->setComponent($name, [
+        'type' => 'image_image',
+        'settings' => $widget_settings,
+      ])
+      ->save();
+
+    EntityViewDisplay::load("node.$type_name.default")
+      ->setComponent($name)
+      ->save();
+
+    return $field_config;
+  }
+
+}
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields_dependencies.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields_dependencies.yml
new file mode 100644
index 0000000..3598a5a
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields_dependencies.yml
@@ -0,0 +1,179 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.field_image
+  module:
+    - image
+    - node
+    - user
+id: entity_test_fields_dependencies
+label: 'Show Image Fields'
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: full
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: '‹ Previous'
+            next: 'Next ›'
+            first: '« First'
+            last: 'Last »'
+          quantity: 9
+      style:
+        type: default
+      row:
+        type: fields
+      fields:
+        field_image:
+          id: field_image
+          table: node__field_image
+          field: field_image
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: target_id
+          type: image
+          settings:
+            image_style: thumbnail
+            image_link: ''
+          group_column: ''
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          plugin_id: field
+      filters: {  }
+      sorts: {  }
+      title: 'Show Image Fields'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+      filter_groups:
+        operator: AND
+        groups: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - 'user.node_grants:view'
+        - user.permissions
+      tags:
+        - 'config:field.storage.node.field_image'
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: show-image-fields
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - 'user.node_grants:view'
+        - user.permissions
+      tags:
+        - 'config:field.storage.node.field_image'
diff --git a/core/modules/views/tests/src/Kernel/ViewsIntegrationTest.php b/core/modules/views/tests/src/Kernel/ViewsIntegrationTest.php
new file mode 100644
index 0000000..0e341f6
--- /dev/null
+++ b/core/modules/views/tests/src/Kernel/ViewsIntegrationTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\views\Kernel\ViewsIntegrationTest.
+ */
+
+namespace Drupal\Tests\views\Kernel;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\image\Entity\ImageStyle;
+use Drupal\views\Entity\View;
+
+/**
+ * Tests integration of views with other modules.
+ *
+ * @group views
+ */
+class ViewsIntegrationTest extends ViewsKernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['field', 'file', 'image', 'entity_test'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $testViews = ['entity_test_fields'];
+
+  /**
+   * Tests integration with image module.
+   */
+  public function testImage() {
+    $style = ImageStyle::create(['name' => 'foo']);
+    $style->save();
+
+    // Create a new image field 'bar' to be used in 'entity_test_fields' view.
+    FieldStorageConfig::create([
+      'entity_type' => 'entity_test',
+      'field_name' => 'bar',
+      'type' => 'image',
+    ])->save();
+    FieldConfig::create([
+      'entity_type' => 'entity_test',
+      'bundle' => 'entity_test',
+      'field_name' => 'bar',
+    ])->save();
+
+    /** @var \Drupal\views\ViewEntityInterface $view */
+    $view = View::load('entity_test_fields');
+    $display =& $view->getDisplay('default');
+
+    // Add the 'bar' image field to 'entity_test_fields' view.
+    $display['display_options']['fields']['bar'] = [
+      'id' => 'bar',
+      'field' => 'bar',
+      'plugin_id' => 'field',
+      'table' => 'entity_test__bar',
+      'type' => 'image',
+      'settings' => ['image_style' => 'foo', 'image_link' => ''],
+    ];
+    $view->save();
+
+    $dependencies = $view->getDependencies() + ['config' => []];
+
+    // Checks that style 'foo' is a dependency of view 'entity_test_fields'.
+    $this->assertTrue(in_array('image.style.foo', $dependencies['config']));
+
+    // Delete the image style.
+    $style->delete();
+
+    // Checks that the view was not deleted too.
+    $view = View::load('entity_test_fields');
+    $this->assertNotNull($view);
+  }
+
+}
diff --git a/core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php b/core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php
new file mode 100644
index 0000000..1f6b419
--- /dev/null
+++ b/core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php
@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\views\Kernel\ViewsKernelTestBase.
+ */
+
+namespace Drupal\Tests\views\Kernel;
+
+use Drupal\Core\Database\Database;
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Tests\token\Kernel\KernelTestBase;
+use Drupal\views\Tests\ViewResultAssertionTrait;
+use Drupal\views\Tests\ViewTestData;
+
+/**
+ * Defines a base class for Views kernel testing.
+ */
+class ViewsKernelTestBase extends KernelTestBase {
+
+  use ViewResultAssertionTrait;
+
+  /**
+   * Views to be enabled.
+   *
+   * Test classes should override this property and provide the list of testing
+   * views.
+   *
+   * @var array
+   */
+  public static $testViews = [];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system', 'views', 'views_test_config', 'views_test_data', 'user'];
+
+  /**
+   * {@inheritdoc}
+   *
+   * @param bool $import_test_views
+   *   Should the views specified on the test class be imported. If you need
+   *   to setup some additional stuff, like fields, you need to call false and
+   *   then call createTestViews for your own.
+   */
+  protected function setUp($import_test_views = TRUE) {
+    parent::setUp();
+
+    $this->installSchema('system', ['sequences', 'key_value_expire']);
+    $this->setUpFixtures();
+
+    if ($import_test_views) {
+      ViewTestData::createTestViews(get_class($this), ['views_test_config']);
+    }
+  }
+  /**
+   * Sets up the configuration and schema of views and views_test_data modules.
+   *
+   * Because the schema of views_test_data.module is dependent on the test
+   * using it, it cannot be enabled normally.
+   */
+  protected function setUpFixtures() {
+    // First install the system module. Many Views have Page displays have menu
+    // links, and for those to work, the system menus must already be present.
+    $this->installConfig(['system']);
+
+    /** @var \Drupal\Core\State\StateInterface $state */
+    $state = $this->container->get('state');
+    // Define the schema and views data variable before enabling the test module.
+    $state->set('views_test_data_schema', $this->schemaDefinition());
+    $state->set('views_test_data_views_data', $this->viewsData());
+
+    $this->installConfig(['views', 'views_test_config', 'views_test_data']);
+    foreach ($this->schemaDefinition() as $table => $schema) {
+      $this->installSchema('views_test_data', $table);
+    }
+
+    $this->container->get('router.builder')->rebuild();
+
+    // Load the test dataset.
+    $data_set = $this->dataSet();
+    $query = Database::getConnection()->insert('views_test_data')
+      ->fields(array_keys($data_set[0]));
+    foreach ($data_set as $record) {
+      $query->values($record);
+    }
+    $query->execute();
+  }
+
+  /**
+   * Orders a nested array containing a result set based on a given column.
+   *
+   * @param array $result_set
+   *   An array of rows from a result set, with each row as an associative
+   *   array keyed by column name.
+   * @param string $column
+   *   The column name by which to sort the result set.
+   * @param bool $reverse
+   *   (optional) Boolean indicating whether to sort the result set in reverse
+   *   order. Defaults to FALSE.
+   *
+   * @return array
+   *   The sorted result set.
+   */
+  protected function orderResultSet($result_set, $column, $reverse = FALSE) {
+    $order = $reverse ? -1 : 1;
+    usort($result_set, function ($a, $b) use ($column, $order) {
+      if ($a[$column] == $b[$column]) {
+        return 0;
+      }
+      return $order * (($a[$column] < $b[$column]) ? -1 : 1);
+    });
+    return $result_set;
+  }
+
+  /**
+   * Executes a view with debugging.
+   *
+   * @param \Drupal\views\ViewExecutable $view
+   *   The view object.
+   * @param array $args
+   *   (optional) An array of the view arguments to use for the view.
+   */
+  protected function executeView($view, array $args = []) {
+    $view->setDisplay();
+    $view->preExecute($args);
+    $view->execute();
+    $verbose_message = '<pre>Executed view: ' . ((string) $view->build_info['query']). '</pre>';
+    if ($view->build_info['query'] instanceof SelectInterface) {
+      $verbose_message .= '<pre>Arguments: ' . print_r($view->build_info['query']->getArguments(), TRUE) . '</pre>';
+    }
+    $this->verbose($verbose_message);
+  }
+
+  /**
+   * Returns the schema definition.
+   */
+  protected function schemaDefinition() {
+    return ViewTestData::schemaDefinition();
+  }
+
+  /**
+   * Returns the views data definition.
+   */
+  protected function viewsData() {
+    return ViewTestData::viewsData();
+  }
+
+  /**
+   * Returns a very simple test dataset.
+   */
+  protected function dataSet() {
+    return ViewTestData::dataSet();
+  }
+
+}
