diff --git a/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php b/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php
index 2b095c1..47679a7 100644
--- a/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php
+++ b/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php
@@ -12,7 +12,7 @@
  *
  * @ingroup plugin_api
  */
-interface ConfigurablePluginInterface {
+interface ConfigurablePluginInterface extends DependentPluginInterface {
 
   /**
    * Returns this plugin's configuration.
@@ -38,28 +38,4 @@ public function setConfiguration(array $configuration);
    */
   public function defaultConfiguration();
 
-  /**
-   * Calculates dependencies for the configured plugin.
-   *
-   * Dependencies are saved in the plugin's configuration entity and are used to
-   * determine configuration synchronization order. For example, if the plugin
-   * integrates with specific user roles, this method should return an array of
-   * dependencies listing the specified roles.
-   *
-   * @return array
-   *   An array of dependencies grouped by type (module, theme, entity). For
-   *   example:
-   *   @code
-   *   array(
-   *     'entity' => array('user.role.anonymous', 'user.role.authenticated'),
-   *     'module' => array('node', 'user'),
-   *     'theme' => array('seven'),
-   *   );
-   *   @endcode
-   *
-   * @see \Drupal\Core\Config\Entity\ConfigDependencyManager
-   * @see \Drupal\Core\Config\Entity\ConfigEntityInterface::getConfigDependencyName()
-   */
-  public function calculateDependencies();
-
 }
diff --git a/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php b/core/lib/Drupal/Component/Plugin/DependentPluginInterface.php
similarity index 56%
copy from core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php
copy to core/lib/Drupal/Component/Plugin/DependentPluginInterface.php
index 2b095c1..736596a 100644
--- a/core/lib/Drupal/Component/Plugin/ConfigurablePluginInterface.php
+++ b/core/lib/Drupal/Component/Plugin/DependentPluginInterface.php
@@ -2,41 +2,17 @@
 
 /**
  * @file
- * Contains \Drupal\Component\Plugin\ConfigurablePluginInterface.
+ * Contains \Drupal\Component\Plugin\DependentPluginInterface.
  */
 
 namespace Drupal\Component\Plugin;
 
 /**
- * Provides an interface for a configurable plugin.
+ * Provides an interface for a plugin that has dependencies.
  *
  * @ingroup plugin_api
  */
-interface ConfigurablePluginInterface {
-
-  /**
-   * Returns this plugin's configuration.
-   *
-   * @return array
-   *   An array of this plugin's configuration.
-   */
-  public function getConfiguration();
-
-  /**
-   * Sets the configuration for this plugin instance.
-   *
-   * @param array $configuration
-   *   An associative array containing the plugin's configuration.
-   */
-  public function setConfiguration(array $configuration);
-
-  /**
-   * Returns default configuration for this plugin.
-   *
-   * @return array
-   *   An associative array with the default configuration.
-   */
-  public function defaultConfiguration();
+interface DependentPluginInterface {
 
   /**
    * Calculates dependencies for the configured plugin.
diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
index f512022..12194a3 100644
--- a/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
+++ b/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Entity\Entity;
 
+use Drupal\Core\Entity\EntityDisplayPluginCollection;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
 use Drupal\Core\Entity\EntityDisplayBase;
@@ -243,4 +244,23 @@ public function __wakeup() {
     $this->__construct($values, $this->entityTypeId);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getPluginCollections() {
+    $configurations = array();
+    foreach ($this->getComponents() as $field_name => $configuration) {
+      if (!empty($configuration['type']) && ($field_definition = $this->getFieldDefinition($field_name))) {
+        $configurations[$configuration['type']] = $configuration + array(
+          'field_definition' => $field_definition,
+          'form_mode' => $this->mode,
+        );
+      }
+    }
+
+    return array(
+      'widgets' => new EntityDisplayPluginCollection($this->pluginManager, $configurations)
+    );
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
index 9a73268..17d6b44 100644
--- a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
+++ b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityDisplayPluginCollection;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Entity\EntityDisplayBase;
 
@@ -252,4 +253,22 @@ public function buildMultiple(array $entities) {
     return $build_list;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getPluginCollections() {
+    $configurations = array();
+    foreach ($this->getComponents() as $field_name => $configuration) {
+      if (!empty($configuration['type']) && ($field_definition = $this->getFieldDefinition($field_name))) {
+        $configurations[$configuration['type']] = $configuration + array(
+          'field_definition' => $field_definition,
+          'view_mode' => $this->originalMode,
+        );
+      }
+    }
+
+    return array(
+      'formatters' => new EntityDisplayPluginCollection($this->pluginManager, $configurations)
+    );
+  }
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityDisplayBase.php b/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
index 251bb00..14005c5 100644
--- a/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
@@ -11,13 +11,14 @@
 use Drupal\Core\Config\Entity\ThirdPartySettingsTrait;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Entity\Display\EntityDisplayInterface;
+use Drupal\Core\Plugin\DefaultLazyPluginCollection;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\FieldConfigInterface;
 
 /**
  * Provides a common base class for entity view and form displays.
  */
-abstract class EntityDisplayBase extends ConfigEntityBase implements EntityDisplayInterface {
+abstract class EntityDisplayBase extends ConfigEntityBase implements EntityDisplayInterface, EntityWithPluginCollectionInterface {
 
   use ThirdPartySettingsTrait;
 
@@ -175,17 +176,6 @@ public function calculateDependencies() {
       if ($field) {
         $this->addDependency('entity', $field->getConfigDependencyName());
       }
-      // Create a dependency on the module that provides the formatter or
-      // widget.
-      if (isset($component['type']) && $definition = $this->pluginManager->getDefinition($component['type'], FALSE)) {
-        $this->addDependency('module', $definition['provider']);
-      }
-      // Create dependencies on any modules providing third party settings.
-      if (isset($component['third_party_settings'])) {
-        foreach($component['third_party_settings'] as $module => $settings) {
-          $this->addDependency('module', $module);
-        }
-      }
     }
     // Depend on configured modes.
     if ($this->mode != 'default') {
diff --git a/core/lib/Drupal/Core/Entity/EntityDisplayPluginCollection.php b/core/lib/Drupal/Core/Entity/EntityDisplayPluginCollection.php
new file mode 100644
index 0000000..d58e841
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityDisplayPluginCollection.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\filter\EntityDisplayPluginCollection.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Core\Plugin\DefaultLazyPluginCollection;
+
+/**
+ * A collection of formatters or widgets.
+ */
+class EntityDisplayPluginCollection extends DefaultLazyPluginCollection {
+
+  /**
+   * The key within the plugin configuration that contains the plugin ID.
+   *
+   * @var string
+   */
+  protected $pluginKey = 'type';
+
+}
diff --git a/core/lib/Drupal/Core/Field/PluginSettingsBase.php b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
index 37f69f3..9459dd1 100644
--- a/core/lib/Drupal/Core/Field/PluginSettingsBase.php
+++ b/core/lib/Drupal/Core/Field/PluginSettingsBase.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Field;
 
+use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
 
 /**
@@ -14,7 +15,7 @@
  *
  * This class handles lazy replacement of default settings values.
  */
-abstract class PluginSettingsBase extends PluginBase implements PluginSettingsInterface {
+abstract class PluginSettingsBase extends PluginBase implements PluginSettingsInterface, DependentPluginInterface {
 
   /**
    * The plugin settings.
@@ -108,4 +109,17 @@ public function setThirdPartySetting($module, $key, $value) {
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    if (!empty($this->thirdPartySettings)) {
+      // Create dependencies on any modules providing third party settings.
+      return array(
+        'module' => array_keys($this->thirdPartySettings)
+      );
+    }
+    return array();
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Plugin/PluginDependencyTrait.php b/core/lib/Drupal/Core/Plugin/PluginDependencyTrait.php
index 2114d38..434cd69 100644
--- a/core/lib/Drupal/Core/Plugin/PluginDependencyTrait.php
+++ b/core/lib/Drupal/Core/Plugin/PluginDependencyTrait.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Plugin;
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Core\Entity\DependencyTrait;
 
@@ -36,8 +37,8 @@ protected function calculatePluginDependencies(PluginInspectionInterface $instan
     if (isset($definition['config_dependencies'])) {
       $this->addDependencies($definition['config_dependencies']);
     }
-    // If a plugin is configurable, calculate its dependencies.
-    if ($instance instanceof ConfigurablePluginInterface && $plugin_dependencies = $instance->calculateDependencies()) {
+    // If a plugin is dependent, calculate its dependencies.
+    if ($instance instanceof DependentPluginInterface && $plugin_dependencies = $instance->calculateDependencies()) {
       $this->addDependencies($plugin_dependencies);
     }
   }
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
index b4cb26e..462448e 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
@@ -90,7 +90,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => -5,
       ))
       ->setDisplayOptions('form', array(
-        'type' => 'string',
+        'type' => 'string_textfield',
         'weight' => -5,
       ));
 
