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..33f7114fe5
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/ConfigurablePluginTrait.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate;
+
+use Drupal\Component\Utility\NestedArray;
+
+/**
+ * Provides a re-usable implementation of ConfigurablePluginInterface.
+ *
+ * @internal
+ * This trait may be replaced with a core plugin solution in the future. While
+ * the methods it provides can be relied upon in the migrate plugin base classes
+ * which implement it, the trait itself should not be relied upon, and may be
+ * removed in a future minor version.
+ *
+ * @see https://www.drupal.org/project/drupal/issues/2852463
+ * @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) {
+    // For migrate configurations it is important to preserve integer keys
+    // so we use mergeDeepArray here.
+    $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.
+   *
+   * @todo Remove this method when ConfigurablePluginInterface and
+   * DependantPluginInterface are decoupled.
+   * @see https://www.drupal.org/project/drupal/issues/2946122
+   */
+  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..791ab13db6 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.
    *
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..06edeed243 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.
@@ -143,7 +139,7 @@ protected static function getEntityTypeId($plugin_id) {
    *   The bundle for this row.
    */
   public function getBundle(Row $row) {
-    $default_bundle = isset($this->configuration['default_bundle']) ? $this->configuration['default_bundle'] : '';
+    $default_bundle = $this->configuration['default_bundle'];
     $bundle_key = $this->getKey('bundle');
     return $row->getDestinationProperty($bundle_key) ?: $default_bundle;
   }
@@ -230,9 +226,10 @@ public function rollback(array $destination_identifier) {
   /**
    * {@inheritdoc}
    */
-  public function calculateDependencies() {
-    $this->addDependency('module', $this->storage->getEntityType()->getProvider());
-    return $this->dependencies;
+  public function defaultConfiguration() {
+    return [
+      'default_bundle' => '',
+    ] + parent::defaultConfiguration();
   }
 
 }
diff --git a/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php b/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
index c809ff3b81..6c428510bf 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/StaticMap.php
@@ -135,12 +135,12 @@ public function transform($value, MigrateExecutableInterface $migrate_executable
     $new_value = NestedArray::getValue($this->configuration['map'], $new_value, $key_exists);
     if (!$key_exists) {
       if (array_key_exists('default_value', $this->configuration)) {
-        if (!empty($this->configuration['bypass'])) {
+        if ($this->configuration['bypass']) {
           throw new MigrateException('Setting both default_value and bypass is invalid.');
         }
         return $this->configuration['default_value'];
       }
-      if (empty($this->configuration['bypass'])) {
+      if (!$this->configuration['bypass']) {
         throw new MigrateSkipRowException(sprintf("No static mapping found for '%s' and no default value provided for destination '%s'.", Variable::export($value), $destination_property));
       }
       else {
@@ -150,4 +150,14 @@ public function transform($value, MigrateExecutableInterface $migrate_executable
     return $new_value;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'map' => [],
+      'bypass' => FALSE,
+    ] + parent::defaultConfiguration();
+  }
+
 }
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
index 3dd7144b8f..ab652be0ef 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,17 +194,15 @@
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->migration = $migration;
+    $this->setConfiguration($configuration);
 
-    // Set up some defaults based on the source configuration.
-    foreach (['cacheCounts' => 'cache_counts', 'skipCount' => 'skip_count', 'trackChanges' => 'track_changes'] as $property => $config_key) {
-      if (isset($configuration[$config_key])) {
-        $this->$property = (bool) $configuration[$config_key];
-      }
-    }
-    $this->cacheKey = !empty($configuration['cache_key']) ? $configuration['cache_key'] : NULL;
+    $this->migration = $migration;
+    $this->cacheCounts = $this->configuration['cache_counts'];
+    $this->skipCount = $this->configuration['skip_count'];
+    $this->trackChanges = $this->configuration['track_changes'];
+    $this->cacheKey = $this->configuration['cache_key'];
     $this->idMap = $this->migration->getIdMap();
-    $this->highWaterProperty = !empty($configuration['high_water_property']) ? $configuration['high_water_property'] : FALSE;
+    $this->highWaterProperty = $this->configuration['high_water_property'];
 
     // Pull out the current highwater mark if we have a highwater property.
     if ($this->highWaterProperty) {
@@ -599,4 +601,18 @@ public function getSourceModule() {
     return NULL;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'cache_counts' => FALSE,
+      'cache_key' => NULL,
+      'high_water_property' => FALSE,
+      'skip_count' => FALSE,
+      'source_module' => FALSE,
+      'track_changes' => FALSE,
+    ];
+  }
+
 }
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
index b9e8e731ab..c8ea42cd6a 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
@@ -142,11 +142,11 @@ public function __toString() {
   public function getDatabase() {
     if (!isset($this->database)) {
       // Look first for an explicit state key containing the configuration.
-      if (isset($this->configuration['database_state_key'])) {
+      if ($this->configuration['database_state_key']) {
         $this->database = $this->setUpDatabase($this->state->get($this->configuration['database_state_key']));
       }
       // Next, use explicit configuration in the source plugin.
-      elseif (isset($this->configuration['key'])) {
+      elseif ($this->configuration['key']) {
         $this->database = $this->setUpDatabase($this->configuration);
       }
       // Next, try falling back to the global state key.
@@ -250,7 +250,7 @@ protected function prepareQuery() {
    */
   protected function initializeIterator() {
     // Initialize the batch size.
-    if ($this->batchSize == 0 && isset($this->configuration['batch_size'])) {
+    if ($this->batchSize == 0 && $this->configuration['batch_size'] !== FALSE) {
       // Valid batch sizes are integers >= 0.
       if (is_int($this->configuration['batch_size']) && ($this->configuration['batch_size']) >= 0) {
         $this->batchSize = $this->configuration['batch_size'];
@@ -441,4 +441,16 @@ protected function mapJoinable() {
     return TRUE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'database_state_key' => '',
+      'key' => '',
+      'batch_size' => FALSE,
+      'ignore_map' => FALSE,
+    ] + parent::defaultConfiguration();
+  }
+
 }
diff --git a/core/modules/migrate/src/ProcessPluginBase.php b/core/modules/migrate/src/ProcessPluginBase.php
index b6a0f5aaf8..240fd3b734 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,14 +22,24 @@
  *
  * @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}
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     // Do not call this method from children.
-    if (isset($this->configuration['method'])) {
+    if ($this->configuration['method']) {
       if (method_exists($this, $this->configuration['method'])) {
         return $this->{$this->configuration['method']}($value, $migrate_executable, $row, $destination_property);
       }
@@ -45,4 +57,13 @@ public function multiple() {
     return FALSE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'method' => '',
+    ];
+  }
+
 }
diff --git a/core/modules/migrate/tests/src/Kernel/MigrateEmbeddedDataTest.php b/core/modules/migrate/tests/src/Kernel/MigrateEmbeddedDataTest.php
index 019ac42ab9..62a96454f8 100644
--- a/core/modules/migrate/tests/src/Kernel/MigrateEmbeddedDataTest.php
+++ b/core/modules/migrate/tests/src/Kernel/MigrateEmbeddedDataTest.php
@@ -39,8 +39,11 @@ public function testEmbeddedData() {
     ];
 
     $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
+    /** @var \Drupal\Component\Plugin\ConfigurablePluginInterface $source */
     $source = $migration->getSourcePlugin();
 
+    $source_config_keys = array_keys($source->getConfiguration());
+
     // Validate the plugin returns the source data that was provided.
     $results = [];
     /** @var \Drupal\migrate\Row $row */
@@ -48,9 +51,10 @@ public function testEmbeddedData() {
       $data_row = $row->getSource();
       // The "data" row returned by getSource() also includes all source
       // configuration - we remove it so we see only the data itself.
-      unset($data_row['plugin']);
-      unset($data_row['data_rows']);
-      unset($data_row['ids']);
+      foreach ($source_config_keys as $key) {
+        unset($data_row[$key]);
+      }
+
       $results[] = $data_row;
     }
     $this->assertIdentical($results, $data_rows);
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/MigrateSourceTest.php b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
index 7f3d2937db..f5111229c0 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
@@ -499,21 +499,6 @@ protected function initializeIterator() {
  */
 class StubSourceGeneratorPlugin extends StubSourcePlugin {
 
-  /**
-   * {@inheritdoc}
-   */
-  protected $skipCount = TRUE;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $cacheCounts = TRUE;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $trackChanges = TRUE;
-
   /**
    * Return the skipCount value.
    */
@@ -549,4 +534,15 @@ protected function initializeIterator() {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'skip_count' => TRUE,
+      'cache_counts' => TRUE,
+      'track_changes' => TRUE,
+    ] + parent::defaultConfiguration();
+  }
+
 }
diff --git a/core/modules/migrate/tests/src/Unit/Plugin/migrate/ConfigurablePluginTraitTest.php b/core/modules/migrate/tests/src/Unit/Plugin/migrate/ConfigurablePluginTraitTest.php
new file mode 100644
index 0000000000..d2bee868a6
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Plugin/migrate/ConfigurablePluginTraitTest.php
@@ -0,0 +1,191 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit\Plugin\migrate;
+
+use Drupal\migrate\Plugin\migrate\ConfigurablePluginTrait;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Class ConfigurablePluginTraitTest.
+ *
+ * @group migrate
+ */
+class ConfigurablePluginTraitTest extends UnitTestCase {
+
+  /**
+   * Test a mock ConfigurablePluginTrait.
+   */
+  public function testConfigurableTrait() {
+
+    /* @var ConfigurablePluginTrait $mock_class */
+    $mock_class = $this->getMockForTrait(ConfigurablePluginTrait::class);
+    $this->assertArrayEquals([], $mock_class->defaultConfiguration());
+
+    $mock_class->setConfiguration([]);
+    $this->assertArrayEquals([], $mock_class->getConfiguration());
+
+    $test_configuration = [
+      'config_key_1' => 'config_value_1',
+      'config_key_2' => [
+        'nested_key_1' => 'nested_value_1',
+        'nested_key_2' => 'nested_value_2',
+      ],
+    ];
+    $mock_class->setConfiguration($test_configuration);
+    $this->assertArrayEquals($test_configuration, $mock_class->getConfiguration());
+
+    $test_configuration = [
+      0 => 'zero',
+      2 => 'two',
+    ];
+    $mock_class->setConfiguration($test_configuration);
+    $this->assertArrayEquals($test_configuration, $mock_class->getConfiguration());
+  }
+
+  /**
+   * Test an object using ConfigurablePluginTrait.
+   *
+   * Specifically test the way default and provided configurations are merged.
+   *
+   * @param array $default_configuration
+   *   The default configuration to use for the trait.
+   * @param array $test_configuration
+   *   The configuration to test.
+   * @param array $final_configuration
+   *   The expected final plugin configuration.
+   *
+   * @dataProvider configurableObjectDataProvider
+   */
+  public function testConfigurableObject(array $default_configuration, array $test_configuration, array $final_configuration) {
+    $test_object = new ConfigurablePluginTestClass($default_configuration);
+    $test_object->setConfiguration($test_configuration);
+    $this->assertArrayEquals($final_configuration, $test_object->getConfiguration());
+  }
+
+  /**
+   * Returns data for testConfigurableObject.
+   *
+   * @return array
+   *   The data.
+   */
+  public function configurableObjectDataProvider() {
+    return [
+      'Direct Override' => [
+        'default_configuration' => [
+          'default_key_1' => 'default_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'default_nested_value_1',
+            'default_nested_key_2' => 'default_nested_value_2',
+          ],
+        ],
+        'test_configuration' => [
+          'default_key_1' => 'override_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'override_nested_value_1',
+            'default_nested_key_2' => 'override_nested_value_2',
+          ],
+        ],
+        'final_configuration' => [
+          'default_key_1' => 'override_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'override_nested_value_1',
+            'default_nested_key_2' => 'override_nested_value_2',
+          ],
+        ],
+      ],
+      'Mixed Override' => [
+        'default_configuration' => [
+          'default_key_1' => 'default_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'default_nested_value_1',
+            'default_nested_key_2' => 'default_nested_value_2',
+          ],
+        ],
+        'test_configuration' => [
+          'override_key_1' => 'config_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'override_value_1',
+            'override_nested_key' => 'override_value',
+          ],
+        ],
+        'final_configuration' => [
+          'default_key_1' => 'default_value_1',
+          'default_key_2' => [
+            'default_nested_key_1' => 'override_value_1',
+            'default_nested_key_2' => 'default_nested_value_2',
+            'override_nested_key' => 'override_value',
+          ],
+          'override_key_1' => 'config_value_1',
+        ],
+      ],
+      'indexed_override' => [
+        'default_configuration' => [
+          'config_value_1',
+          'config_value_2',
+          'config_value_3',
+        ],
+        'test_configuration' => [
+          'override_value_1',
+          'override_value_2',
+        ],
+        'final_configuration' => [
+          'override_value_1',
+          'override_value_2',
+          'config_value_3',
+        ],
+      ],
+      'indexed_override_complex' => [
+        'default_configuration' => [
+          'config_value_1',
+          'config_value_2',
+          'config_value_3',
+        ],
+        'test_configuration' => [
+          0 => 'override_value_1',
+          2 => 'override_value_3',
+        ],
+        'final_configuration' => [
+          'override_value_1',
+          'config_value_2',
+          'override_value_3',
+        ],
+      ],
+    ];
+  }
+
+}
+
+/**
+ * A test class using ConfigurablePluginTrait.
+ */
+class ConfigurablePluginTestClass {
+  use ConfigurablePluginTrait;
+
+  /**
+   * A default configuration for the test class to return.
+   *
+   * @var array
+   */
+  protected $defaultConfiguration;
+
+  /**
+   * ConfigurablePluginTestClass constructor.
+   *
+   * @param array $default_configuration
+   *   The default configuration to return.
+   */
+  public function __construct(array $default_configuration) {
+    $this->defaultConfiguration = $default_configuration;
+  }
+
+  /**
+   * Return the provided test defaults.
+   *
+   * @return array
+   *   The default configuration.
+   */
+  public function defaultConfiguration() {
+    return $this->defaultConfiguration;
+  }
+
+}
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;
-  }
-
 }
