diff --git a/core/modules/migrate/src/Plugin/Migration.php b/core/modules/migrate/src/Plugin/Migration.php
index cc8d804..8b554bb 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 0000000..12c8594
--- /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 0000000..ca5f868
--- /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 21a1869..816ceba 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 3dd7144..13a3560 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 b6a0f5a..30a8f0d 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, string $plugin_id,  $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
+  }
 
   /**
    * {@inheritdoc}
