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 cc8d804da5..8b554bbb32 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\migrate\Plugin\migrate\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/ConfigurablePluginInterface.php b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginInterface.php
new file mode 100644
index 0000000000..12c8594aea
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginInterface.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate;
+
+/**
+ * Provides an interface for a configurable migrate plugin.
+ *
+ * This is very similar to the plugin system's ConfigurablePluginInterface,
+ * except it does not require an implementation of calculateDependencies().
+ *
+ * @ingroup migrate
+ *
+ * @see \Drupal\Component\Plugin\ConfigurablePluginInterface
+ */
+interface ConfigurablePluginInterface {
+
+  /**
+   * Gets 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);
+
+  /**
+   * Gets default configuration for this plugin.
+   *
+   * @return array
+   *   An associative array with the default configuration.
+   */
+  public function defaultConfiguration();
+
+}
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..ca5f8686f1
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginTrait.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate;
+
+use Drupal\Component\Utility\NestedArray;
+
+/**
+ * Provides a re-usable implementation 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\migrate\Plugin\migrate\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\migrate\Plugin\migrate\ConfigurablePluginInterface::setConfiguration()
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
+  }
+
+  /**
+   * Gets default configuration for this plugin.
+   *
+   * @return array
+   *   An associative array with the default configuration.
+   *
+   * @see \Drupal\migrate\Plugin\migrate\ConfigurablePluginInterface::defaultConfiguration()
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+}
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php b/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
index 21a1869b1f..816ceba43f 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\migrate\Plugin\migrate\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/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
index 3dd7144b8f..13a3560717 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\migrate\Plugin\migrate\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..4476ba2e3c 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\migrate\Plugin\migrate\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}
    */
