diff --git a/core/modules/field/tests/src/Unit/Plugin/migrate/process/ProcessFieldTest.php b/core/modules/field/tests/src/Unit/Plugin/migrate/process/ProcessFieldTest.php
index db9709e2e7..c5a08c9f6d 100644
--- a/core/modules/field/tests/src/Unit/Plugin/migrate/process/ProcessFieldTest.php
+++ b/core/modules/field/tests/src/Unit/Plugin/migrate/process/ProcessFieldTest.php
@@ -60,7 +60,7 @@ public function testTransform($method, $value, $expected_value, $migrate_excepti
     if ($method) {
       $this->fieldPlugin->$method($this->row->reveal())->willReturn($expected_value);
     }
-    $this->plugin = new ProcessField(['method' => $method], $value, [], $this->cckFieldManager->reveal(), $this->fieldManager->reveal(), $this->migration->reveal());
+    $this->plugin = new ProcessField(['method' => $method], 'process_field', [], $this->cckFieldManager->reveal(), $this->fieldManager->reveal(), $this->migration->reveal());
 
     if ($migrate_exception) {
       $this->setExpectedException(MigrateException::class, $migrate_exception);
diff --git a/core/modules/migrate/src/Plugin/Migration.php b/core/modules/migrate/src/Plugin/Migration.php
index ee499b097d..9536ad4375 100644
--- a/core/modules/migrate/src/Plugin/Migration.php
+++ b/core/modules/migrate/src/Plugin/Migration.php
@@ -8,6 +8,8 @@
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\MigrateSkipRowException;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\migrate\Plugin\migrate\ConfigurablePluginTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -17,7 +19,9 @@
  * container for the information about a single migration such as the source,
  * process and destination plugins.
  */
-class Migration extends PluginBase implements MigrationInterface, RequirementsInterface, ContainerFactoryPluginInterface {
+class Migration extends PluginBase implements MigrationInterface, RequirementsInterface, ContainerFactoryPluginInterface, ConfigurablePluginInterface {
+
+  use ConfigurablePluginTrait;
 
   /**
    * The migration ID (machine name).
@@ -271,6 +275,7 @@ class Migration extends PluginBase implements MigrationInterface, RequirementsIn
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManagerInterface $source_plugin_manager, MigratePluginManagerInterface $process_plugin_manager, MigrateDestinationPluginManager $destination_plugin_manager, MigratePluginManagerInterface $idmap_plugin_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
     $this->migrationPluginManager = $migration_plugin_manager;
     $this->sourcePluginManager = $source_plugin_manager;
     $this->processPluginManager = $process_plugin_manager;
diff --git a/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginTrait.php b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginTrait.php
new file mode 100644
index 0000000000..9b370abafe
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginTrait.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate;
+
+use Drupal\Component\Utility\NestedArray;
+
+/**
+ * Provides a re-usable implementation of ConfigurablePluginInterface.
+ *
+ * @see \Drupal\migrate\Plugin\migrate\ConfigurablePluginInterface
+ */
+trait ConfigurablePluginTrait {
+
+  /**
+   * Gets this plugin's configuration.
+   *
+   * @return array
+   *   An array of this plugin's configuration.
+   *
+   * @see \Drupal\Component\Plugin\ConfigurablePluginInterface::getConfiguration()
+   */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * Sets the configuration for this plugin instance.
+   *
+   * @param array $configuration
+   *   An associative array containing the plugin's configuration.
+   *
+   * @see \Drupal\Component\Plugin\ConfigurablePluginInterface::setConfiguration()
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = NestedArray::mergeDeepArray([$this->defaultConfiguration(), $configuration], TRUE);
+  }
+
+  /**
+   * Gets default configuration for this plugin.
+   *
+   * @return array
+   *   An associative array with the default configuration.
+   *
+   * @see \Drupal\Component\Plugin\ConfigurablePluginInterface::defaultConfiguration()
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+  /**
+   * Calculates configuration dependencies for the plugin.
+   *
+   * Migration plugins are not configuration, so they have no dependencies.
+   */
+  final public function calculateDependencies() {
+    return [];
+  }
+
+}
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Config.php b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
index 18d78a325e..0b3227319e 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/Config.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
-use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Entity\DependencyTrait;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\Plugin\MigrationInterface;
@@ -69,9 +67,7 @@
  *   id = "config"
  * )
  */
-class Config extends DestinationBase implements ContainerFactoryPluginInterface, DependentPluginInterface {
-
-  use DependencyTrait;
+class Config extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
    * The config object.
@@ -165,15 +161,6 @@ public function getIds() {
     return $ids;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    $provider = explode('.', $this->config->getName(), 2)[0];
-    $this->addDependency('module', $provider);
-    return $this->dependencies;
-  }
-
   /**
    * Get whether this destination is for translations.
    *
@@ -213,7 +200,7 @@ public function getDestinationModule() {
       return 'config_translation';
     }
     // Get the module handling this configuration object from the config_name,
-    // which is of the form <module_name>.<configuration object name>
+    // which is of the form <module_name>.<configuration object name>.
     return !empty($this->configuration['config_name']) ? explode('.', $this->configuration['config_name'], 2)[0] : NULL;
   }
 
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php b/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
index 8383e587e5..f52c4b9c36 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
@@ -3,6 +3,8 @@
 namespace Drupal\migrate\Plugin\migrate\destination;
 
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\migrate\Plugin\migrate\ConfigurablePluginTrait;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\Plugin\MigrateDestinationInterface;
@@ -24,7 +26,9 @@
  *
  * @ingroup migration
  */
-abstract class DestinationBase extends PluginBase implements MigrateDestinationInterface, RequirementsInterface {
+abstract class DestinationBase extends PluginBase implements MigrateDestinationInterface, RequirementsInterface, ConfigurablePluginInterface {
+
+  use ConfigurablePluginTrait;
 
   /**
    * Indicates whether the destination can be rolled back.
@@ -61,6 +65,7 @@
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
     $this->migration = $migration;
   }
 
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
index 0cebbd07c8..5febcfb4ce 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\migrate\Plugin\migrate\destination;
 
-use Drupal\Component\Plugin\DependentPluginInterface;
-use Drupal\Core\Entity\DependencyTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\Plugin\MigrationInterface;
@@ -59,9 +57,7 @@
  *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntity"
  * )
  */
-abstract class Entity extends DestinationBase implements ContainerFactoryPluginInterface, DependentPluginInterface {
-
-  use DependencyTrait;
+abstract class Entity extends DestinationBase implements ContainerFactoryPluginInterface {
 
   /**
    * The entity storage.
@@ -227,12 +223,4 @@ public function rollback(array $destination_identifier) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    $this->addDependency('module', $this->storage->getEntityType()->getProvider());
-    return $this->dependencies;
-  }
-
 }
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
index 3dd7144b8f..9bd74ade3b 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
@@ -5,6 +5,8 @@
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\migrate\Event\MigrateRollbackEvent;
 use Drupal\migrate\Event\RollbackAwareInterface;
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\migrate\Plugin\migrate\ConfigurablePluginTrait;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\MigrateSkipRowException;
@@ -64,7 +66,9 @@
  *
  * @ingroup migration
  */
-abstract class SourcePluginBase extends PluginBase implements MigrateSourceInterface, RollbackAwareInterface {
+abstract class SourcePluginBase extends PluginBase implements MigrateSourceInterface, RollbackAwareInterface, ConfigurablePluginInterface {
+
+  use ConfigurablePluginTrait;
 
   /**
    * The module handler service.
@@ -190,6 +194,7 @@
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
     $this->migration = $migration;
 
     // Set up some defaults based on the source configuration.
diff --git a/core/modules/migrate/src/ProcessPluginBase.php b/core/modules/migrate/src/ProcessPluginBase.php
index b6a0f5aaf8..d3c980ce7e 100644
--- a/core/modules/migrate/src/ProcessPluginBase.php
+++ b/core/modules/migrate/src/ProcessPluginBase.php
@@ -3,6 +3,8 @@
 namespace Drupal\migrate;
 
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+use Drupal\migrate\Plugin\migrate\ConfigurablePluginTrait;
 use Drupal\migrate\Plugin\MigrateProcessInterface;
 
 /**
@@ -20,7 +22,17 @@
  *
  * @ingroup migration
  */
-abstract class ProcessPluginBase extends PluginBase implements MigrateProcessInterface {
+abstract class ProcessPluginBase extends PluginBase implements MigrateProcessInterface, ConfigurablePluginInterface {
+
+  use ConfigurablePluginTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
+  }
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/migrate/tests/src/Kernel/SqlBaseTest.php b/core/modules/migrate/tests/src/Kernel/SqlBaseTest.php
index 8837d5f38d..062dc35339 100644
--- a/core/modules/migrate/tests/src/Kernel/SqlBaseTest.php
+++ b/core/modules/migrate/tests/src/Kernel/SqlBaseTest.php
@@ -212,16 +212,6 @@ public function getDatabase() {
     return parent::getDatabase();
   }
 
-  /**
-   * Allows us to set the configuration from a test.
-   *
-   * @param array $config
-   *   The config array.
-   */
-  public function setConfiguration($config) {
-    $this->configuration = $config;
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/migrate/tests/src/Unit/SqlBaseTest.php b/core/modules/migrate/tests/src/Unit/SqlBaseTest.php
index b8097a3b46..3ef0a99753 100644
--- a/core/modules/migrate/tests/src/Unit/SqlBaseTest.php
+++ b/core/modules/migrate/tests/src/Unit/SqlBaseTest.php
@@ -227,11 +227,4 @@ public function fields() {}
    */
   public function query() {}
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    return [];
-  }
-
 }
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
index c8b44f894e..b2d01cdd5c 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
@@ -170,18 +170,4 @@ protected function variableGet($name, $default) {
     return $result !== FALSE ? unserialize($result) : $default;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    // Generic handling for Drupal source plugin constants.
-    if (isset($this->configuration['constants']['entity_type'])) {
-      $this->addDependency('module', $this->entityManager->getDefinition($this->configuration['constants']['entity_type'])->getProvider());
-    }
-    if (isset($this->configuration['constants']['module'])) {
-      $this->addDependency('module', $this->configuration['constants']['module']);
-    }
-    return $this->dependencies;
-  }
-
 }
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/EmptySource.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/EmptySource.php
index 0c49d048cd..644c1f9f00 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/EmptySource.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/EmptySource.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\migrate_drupal\Plugin\migrate\source;
 
-use Drupal\Component\Plugin\DependentPluginInterface;
-use Drupal\Core\Entity\DependencyTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Plugin\migrate\source\EmptySource as BaseEmptySource;
@@ -18,9 +16,7 @@
  *   source_module = "system",
  * )
  */
-class EmptySource extends BaseEmptySource implements ContainerFactoryPluginInterface, DependentPluginInterface {
-
-  use DependencyTrait;
+class EmptySource extends BaseEmptySource implements ContainerFactoryPluginInterface {
 
   /**
    * The entity manager.
@@ -50,15 +46,4 @@ public static function create(ContainerInterface $container, array $configuratio
     );
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    // The empty source plugin supports the entity_type constant.
-    if (isset($this->configuration['constants']['entity_type'])) {
-      $this->addDependency('module', $this->entityManager->getDefinition($this->configuration['constants']['entity_type'])->getProvider());
-    }
-    return $this->dependencies;
-  }
-
 }
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/ViewMode.php b/core/modules/node/src/Plugin/migrate/source/d6/ViewMode.php
index 434007a0a2..ef4e2d0160 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/ViewMode.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/ViewMode.php
@@ -65,15 +65,4 @@ public function getIds() {
     return $ids;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    $this->dependencies = parent::calculateDependencies();
-    if (isset($this->configuration['constants']['targetEntityType'])) {
-      $this->addDependency('module', $this->entityManager->getDefinition($this->configuration['constants']['targetEntityType'])->getProvider());
-    }
-    return $this->dependencies;
-  }
-
 }
