diff --git a/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.php b/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.php
new file mode 100644
index 0000000..fcb90ba
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains database additions to drupal-8-rc1.bare.standard.php.gz for testing
+ * the upgrade path of https://www.drupal.org/node/2649914.
+ */
+
+use Drupal\Component\Serialization\Yaml;
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+$views_config = Yaml::decode(file_get_contents(__DIR__ . '/drupal8.views-image-style-dependency-2649914.yml'));
+
+$connection->insert('config')
+  ->fields(['collection', 'name', 'data'])
+  ->values([
+    'collection' => '',
+    'name' => 'views.view.' . $views_config['id'],
+    'data' => serialize($views_config),
+  ])->execute();
diff --git a/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.yml b/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.yml
new file mode 100644
index 0000000..70d9caf
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.field_image
+  module:
+    - image
+    - node
+id: foo
+label: Foo
+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:
+      fields:
+        field_image:
+          id: field_image
+          table: node__field_image
+          field: field_image
+          type: image
+          settings:
+            image_style: thumbnail
+            image_link: ''
+          plugin_id: field
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index 1d18ee1..ac6b0ef 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -951,7 +951,7 @@ protected function getAllPlugins($only_overrides = FALSE) {
    * {@inheritdoc}
    */
   public function calculateDependencies() {
-    $this->addDependencies(parent::calculateDependencies());
+    $this->dependencies = parent::calculateDependencies();
     // Collect all the dependencies of handlers and plugins. Only calculate
     // their dependencies if they are configured by this display.
     $plugins = array_merge($this->getAllHandlers(TRUE), $this->getAllPlugins(TRUE));
diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php
index af3dad1..33675df 100644
--- a/core/modules/views/src/Plugin/views/field/Field.php
+++ b/core/modules/views/src/Plugin/views/field/Field.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\views\field;
 
+use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheableDependencyInterface;
@@ -18,6 +19,7 @@
 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;
@@ -40,7 +42,9 @@
  * @ViewsField("field")
  */
 class Field extends FieldPluginBase implements CacheableDependencyInterface, MultiItemsFieldHandlerInterface {
+
   use FieldAPIHandlerTrait;
+  use PluginDependencyTrait;
 
   /**
    * An array to store field renderable arrays for use by renderItems().
@@ -471,25 +475,9 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
       $form['field_api_classes']['#description'] .= ' ' . $this->t('Checking this option will cause the group Display Type and Separator values to be ignored.');
     }
 
-    // Get the currently selected formatter.
-    $format = $this->options['type'];
-
-    $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()) {
       $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 +937,48 @@ protected function addSelfTokens(&$tokens, $item) {
   }
 
   /**
+   * Returns the field formatter instance.
+   *
+   * @return \Drupal\Core\Field\FormatterInterface|null
+   *   The field formatter instance.
+   */
+  protected function getFormatterInstance() {
+    $settings = $this->options['settings'] + $this->formatterPluginManager->getDefaultSettings($this->options['type']);
+
+    $options = [
+      'field_definition' => $this->getFieldDefinition(),
+      'configuration' => [
+        'type' => $this->options['type'],
+        'settings' => $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()) && $formatter instanceof DependentPluginInterface) {
+        $this->calculatePluginDependencies($formatter);
+      }
     }
 
-    return $dependencies;
+    return $this->dependencies;
   }
 
   /**
diff --git a/core/modules/views/src/Tests/Update/ImageStyleDependencyUpdateTest.php b/core/modules/views/src/Tests/Update/ImageStyleDependencyUpdateTest.php
new file mode 100644
index 0000000..627b15b
--- /dev/null
+++ b/core/modules/views/src/Tests/Update/ImageStyleDependencyUpdateTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Update\ImageStyleDependencyUpdateTest.
+ */
+
+namespace Drupal\views\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+use Drupal\views\Entity\View;
+
+/**
+ * Tests Views image style dependencies update.
+ *
+ * @group views
+ */
+class ImageStyleDependencyUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8-rc1.bare.standard.php.gz',
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal8.views-image-style-dependency-2649914.php',
+    ];
+  }
+
+  /**
+   * Tests the updating of views dependencies to image styles.
+   */
+  public function testUpdateImageStyleDependencies() {
+    $config_dependencies = View::load('foo')->getDependencies()['config'];
+
+    // Checks that 'thumbnail' image style is not a dependency of view 'foo'.
+    $this->assertFalse(in_array('image.style.thumbnail', $config_dependencies));
+
+    // Run updates.
+    $this->runUpdates();
+
+    $config_dependencies = View::load('foo')->getDependencies()['config'];
+
+    // Checks that 'thumbnail' image style is a dependency of view 'foo'.
+    $this->assertTrue(in_array('image.style.thumbnail', $config_dependencies));
+  }
+
+}
diff --git a/core/modules/views/src/Tests/ViewKernelTestBase.php b/core/modules/views/src/Tests/ViewKernelTestBase.php
index fe794ea..a423e80 100644
--- a/core/modules/views/src/Tests/ViewKernelTestBase.php
+++ b/core/modules/views/src/Tests/ViewKernelTestBase.php
@@ -18,7 +18,10 @@
  * requires the full web test environment provided by WebTestBase, extend
  * ViewTestBase instead.
  *
- * @see \Drupal\views\Tests\ViewTestBase
+ * @deprecated in Drupal 8.0.x, will be removed in Drupal 8.2.x. Use
+ *   \Drupal\Tests\views\Kernel\ViewsKernelTestBase instead.
+ *
+ * @see \Drupal\Tests\views\Kernel\ViewsKernelTestBase
  */
 abstract class ViewKernelTestBase extends KernelTestBase {
 
diff --git a/core/modules/views/tests/src/Kernel/ViewsConfigDependenciesIntegrationTest.php b/core/modules/views/tests/src/Kernel/ViewsConfigDependenciesIntegrationTest.php
new file mode 100644
index 0000000..25db7d9
--- /dev/null
+++ b/core/modules/views/tests/src/Kernel/ViewsConfigDependenciesIntegrationTest.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\views\Kernel\ViewsConfigDependenciesIntegrationTest.
+ */
+
+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 ViewsConfigDependenciesIntegrationTest 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() {
+    /** @var \Drupal\image\ImageStyleInterface $style */
+    $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',
+      'entity_type' => 'entity_test',
+      'entity_field' => '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 'foo' image style.
+    $style->delete();
+
+    // Checks that the view has been deleted too.
+    $this->assertNull(View::load('entity_test_fields'));
+  }
+
+}
diff --git a/core/modules/views/src/Tests/ViewKernelTestBase.php b/core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php
similarity index 69%
copy from core/modules/views/src/Tests/ViewKernelTestBase.php
copy to core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php
index fe794ea..9d6e47a 100644
--- a/core/modules/views/src/Tests/ViewKernelTestBase.php
+++ b/core/modules/views/tests/src/Kernel/ViewsKernelTestBase.php
@@ -2,54 +2,57 @@
 
 /**
  * @file
- * Contains \Drupal\views\Tests\ViewKernelTestBase.
+ * Contains \Drupal\Tests\views\Kernel\ViewsKernelTestBase.
  */
 
-namespace Drupal\views\Tests;
+namespace Drupal\Tests\views\Kernel;
 
+use Drupal\Core\Database\Database;
 use Drupal\Core\Database\Query\SelectInterface;
-use Drupal\views\ViewsBundle;
-use Drupal\simpletest\KernelTestBase;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\views\Tests\ViewResultAssertionTrait;
+use Drupal\views\Tests\ViewTestData;
 
 /**
- * Defines a base class for Views unit testing.
- *
- * Use this test class for unit tests of Views functionality. If a test
- * requires the full web test environment provided by WebTestBase, extend
- * ViewTestBase instead.
- *
- * @see \Drupal\views\Tests\ViewTestBase
+ * Defines a base class for Views kernel testing.
  */
-abstract class ViewKernelTestBase extends KernelTestBase {
+class ViewsKernelTestBase extends KernelTestBase {
 
   use ViewResultAssertionTrait;
 
   /**
-   * Modules to enable.
+   * Views to be enabled.
+   *
+   * Test classes should override this property and provide the list of testing
+   * views.
    *
    * @var array
    */
-  public static $modules = array('system', 'views', 'views_test_config', 'views_test_data', 'user');
+  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 specififed on the test class be imported. If you need
+   *   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', array('router', 'sequences'));
+    $this->installSchema('system', ['router', 'sequences', 'key_value_expire']);
     $this->setUpFixtures();
 
     if ($import_test_views) {
-      ViewTestData::createTestViews(get_class($this), array('views_test_config'));
+      ViewTestData::createTestViews(get_class($this), ['views_test_config']);
     }
   }
-
   /**
    * Sets up the configuration and schema of views and views_test_data modules.
    *
@@ -59,22 +62,24 @@ protected function setUp($import_test_views = TRUE) {
   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(array('system'));
+    $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.
-    \Drupal::state()->set('views_test_data_schema', $this->schemaDefinition());
-    \Drupal::state()->set('views_test_data_views_data', $this->viewsData());
+    $state->set('views_test_data_schema', $this->schemaDefinition());
+    $state->set('views_test_data_views_data', $this->viewsData());
 
-    $this->installConfig(array('views', 'views_test_config', 'views_test_data'));
+    $this->installConfig(['views', 'views_test_config', 'views_test_data']);
     foreach ($this->schemaDefinition() as $table => $schema) {
       $this->installSchema('views_test_data', $table);
     }
 
-    \Drupal::service('router.builder')->rebuild();
+    $this->container->get('router.builder')->rebuild();
 
     // Load the test dataset.
     $data_set = $this->dataSet();
-    $query = db_insert('views_test_data')
+    $query = Database::getConnection()->insert('views_test_data')
       ->fields(array_keys($data_set[0]));
     foreach ($data_set as $record) {
       $query->values($record);
@@ -116,7 +121,7 @@ protected function orderResultSet($result_set, $column, $reverse = FALSE) {
    * @param array $args
    *   (optional) An array of the view arguments to use for the view.
    */
-  protected function executeView($view, array $args = array()) {
+  protected function executeView($view, array $args = []) {
     $view->setDisplay();
     $view->preExecute($args);
     $view->execute();
diff --git a/core/modules/views/views.post_update.php b/core/modules/views/views.post_update.php
index ecbf851..6dc52eb 100644
--- a/core/modules/views/views.post_update.php
+++ b/core/modules/views/views.post_update.php
@@ -6,9 +6,29 @@
  */
 
 use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\views\Entity\View;
 use Drupal\views\Views;
 
 /**
+ * @addtogroup updates-8.0.x
+ * @{
+ */
+
+/**
+ * Update dependencies to image style.
+ */
+function views_post_update_image_style_dependencies() {
+  $views = View::loadMultiple();
+  array_walk($views, function(View $view) {
+    $view->save();
+  });
+}
+
+/**
+ * @} End of "addtogroup updates-8.0.x".
+ */
+
+/**
  * @addtogroup updates-8.0.0-beta
  * @{
  */
