diff --git a/core/modules/migrate/src/Plugin/Migration.php b/core/modules/migrate/src/Plugin/Migration.php
index 20c3a66..d775249 100644
--- a/core/modules/migrate/src/Plugin/Migration.php
+++ b/core/modules/migrate/src/Plugin/Migration.php
@@ -7,11 +7,13 @@
 
 namespace Drupal\migrate\Plugin;
 
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\MigrateSkipRowException;
 use Drupal\Component\Utility\NestedArray;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines the Migration plugin.
@@ -20,7 +22,7 @@
  * container for the information about a single migration such as the source,
  * process and destination plugins.
  */
-class Migration extends PluginBase implements MigrationInterface, RequirementsInterface {
+class Migration extends PluginBase implements MigrationInterface, RequirementsInterface, ContainerFactoryPluginInterface {
 
   /**
    * The migration ID (machine name).
@@ -217,6 +219,33 @@ class Migration extends PluginBase implements MigrationInterface, RequirementsIn
    */
   protected $migrationPluginManager;
 
+  /**
+   *  The source plugin manager.
+   *
+   * @var \Drupal\migrate\Plugin\MigratePluginManager
+   */
+  protected $sourcePluginManager;
+
+  /**
+   * Thep process plugin manager.
+   *
+   * @var \Drupal\migrate\Plugin\MigratePluginManager
+   */
+  protected $processPluginManager;
+
+  /**
+   * The destination plugin manager.
+   *
+   * @var \Drupal\migrate\Plugin\MigrateDestinationPluginManager
+   */
+  protected $destinationPluginManager;
+
+  /**
+   * The ID map plugin manager.
+   *
+   * @var \Drupal\migrate\Plugin\MigratePluginManager
+   */
+  protected $idMapPluginManager;
 
   /**
    * Labels corresponding to each defined status.
@@ -232,10 +261,33 @@ class Migration extends PluginBase implements MigrationInterface, RequirementsIn
   ];
 
   /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+   * Constructs a Migration.
+   *
+   * @param array $configuration
+   *   Plugin configuration.
+   * @param string $plugin_id
+   *   The plugin ID.
+   * @param mixed $plugin_definition
+   *   The plugin definition.
+   * @param \Drupal\migrate\Plugin\MigrationPluginManagerInterface $migration_plugin_manager
+   *   The migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $source_plugin_manager
+   *   The source migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $process_plugin_manager
+   *   The process migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigrateDestinationPluginManager $destination_plugin_manager
+   *   The destination migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $idmap_plugin_manager
+   *   The ID map migration plugin manager.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManager $source_plugin_manager, MigratePluginManager $process_plugin_manager, MigrateDestinationPluginManager $destination_plugin_manager, MigratePluginManager $idmap_plugin_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->migrationPluginManager = $migration_plugin_manager;
+    $this->sourcePluginManager = $source_plugin_manager;
+    $this->processPluginManager = $process_plugin_manager;
+    $this->destinationPluginManager = $destination_plugin_manager;
+    $this->idMapPluginManager = $idmap_plugin_manager;
+
     foreach ($plugin_definition as $key => $value) {
       $this->$key = $value;
     }
@@ -244,6 +296,22 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
   /**
    * {@inheritdoc}
    */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.migration'),
+      $container->get('plugin.manager.migrate.source'),
+      $container->get('plugin.manager.migrate.process'),
+      $container->get('plugin.manager.migrate.destination'),
+      $container->get('plugin.manager.migrate.id_map')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function id() {
     return $this->pluginId;
   }
@@ -283,7 +351,7 @@ public function getIdMapPlugin() {
    */
   public function getSourcePlugin() {
     if (!isset($this->sourcePlugin)) {
-      $this->sourcePlugin = \Drupal::service('plugin.manager.migrate.source')->createInstance($this->source['plugin'], $this->source, $this);
+      $this->sourcePlugin = $this->sourcePluginManager->createInstance($this->source['plugin'], $this->source, $this);
     }
     return $this->sourcePlugin;
   }
@@ -302,11 +370,11 @@ public function getProcessPlugins(array $process = NULL) {
         $this->processPlugins[$index][$property] = array();
         foreach ($configurations as $configuration) {
           if (isset($configuration['source'])) {
-            $this->processPlugins[$index][$property][] = \Drupal::service('plugin.manager.migrate.process')->createInstance('get', $configuration, $this);
+            $this->processPlugins[$index][$property][] = $this->processPluginManager->createInstance('get', $configuration, $this);
           }
           // Get is already handled.
           if ($configuration['plugin'] != 'get') {
-            $this->processPlugins[$index][$property][] = \Drupal::service('plugin.manager.migrate.process')->createInstance($configuration['plugin'], $configuration, $this);
+            $this->processPlugins[$index][$property][] = $this->processPluginManager->createInstance($configuration['plugin'], $configuration, $this);
           }
           if (!$this->processPlugins[$index][$property]) {
             throw new MigrateException("Invalid process configuration for $property");
@@ -351,7 +419,7 @@ public function getDestinationPlugin($stub_being_requested = FALSE) {
       throw new MigrateSkipRowException;
     }
     if (!isset($this->destinationPlugin)) {
-      $this->destinationPlugin = \Drupal::service('plugin.manager.migrate.destination')->createInstance($this->destination['plugin'], $this->destination, $this);
+      $this->destinationPlugin = $this->destinationPluginManager->createInstance($this->destination['plugin'], $this->destination, $this);
     }
     return $this->destinationPlugin;
   }
@@ -363,7 +431,7 @@ public function getIdMap() {
     if (!isset($this->idMapPlugin)) {
       $configuration = $this->idMap;
       $plugin = isset($configuration['plugin']) ? $configuration['plugin'] : 'sql';
-      $this->idMapPlugin = \Drupal::service('plugin.manager.migrate.id_map')->createInstance($plugin, $configuration, $this);
+      $this->idMapPlugin = $this->idMapPluginManager->createInstance($plugin, $configuration, $this);
     }
     return $this->idMapPlugin;
   }
@@ -434,9 +502,6 @@ public function checkRequirements() {
    *   The plugin manager.
    */
   protected function getMigrationPluginManager() {
-    if (!isset($this->migrationPluginManager)) {
-      $this->migrationPluginManager = \Drupal::service('plugin.manager.migration');
-    }
     return $this->migrationPluginManager;
   }
 
diff --git a/core/modules/migrate/src/Plugin/MigrationDeriverTrait.php b/core/modules/migrate/src/Plugin/MigrationDeriverTrait.php
index c1a6eff..b10f19c 100644
--- a/core/modules/migrate/src/Plugin/MigrationDeriverTrait.php
+++ b/core/modules/migrate/src/Plugin/MigrationDeriverTrait.php
@@ -31,7 +31,7 @@ public static function getSourcePlugin($source_plugin_id) {
         'plugin' => 'null',
       ],
     ];
-    return (new Migration([], uniqid(), $definition))->getSourcePlugin();
+    return \Drupal::service('plugin.manager.migration')->createStubMigration($definition)->getSourcePlugin();
   }
 
 }
diff --git a/core/modules/migrate/src/Plugin/MigrationPluginManager.php b/core/modules/migrate/src/Plugin/MigrationPluginManager.php
index 9c7dbc1..ceac596 100644
--- a/core/modules/migrate/src/Plugin/MigrationPluginManager.php
+++ b/core/modules/migrate/src/Plugin/MigrationPluginManager.php
@@ -223,4 +223,12 @@ protected function addDependency(array &$graph, $id, $dependency, $dynamic_ids)
     $graph[$id]['edges'] += array_combine($dependencies, $dependencies);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function createStubMigration(array $definition) {
+    $id = isset($definition['id']) ? $definition['id'] : uniqid();
+    return Migration::create(\Drupal::getContainer(), [], $id, $definition);
+  }
+
 }
diff --git a/core/modules/migrate/src/Plugin/MigrationPluginManagerInterface.php b/core/modules/migrate/src/Plugin/MigrationPluginManagerInterface.php
index bc7841f..5a78233 100644
--- a/core/modules/migrate/src/Plugin/MigrationPluginManagerInterface.php
+++ b/core/modules/migrate/src/Plugin/MigrationPluginManagerInterface.php
@@ -33,4 +33,16 @@
    */
   public function createInstances($id, array $configuration = array());
 
+  /**
+   * Creates a stub migration plugin from a definition array.
+   *
+   * @param array $definition
+   *   The migration definition. If an 'id' key is set then this will be used as
+   *   the migration ID, if not a random ID will be assigned.
+   *
+   * @return \Drupal\migrate\Plugin\Migration
+   *   The stub migration.
+   */
+  public function createStubMigration(array $definition);
+
 }
diff --git a/core/modules/migrate/src/Tests/MigrateEmbeddedDataTest.php b/core/modules/migrate/src/Tests/MigrateEmbeddedDataTest.php
index 70b5d8f..8baa46d 100644
--- a/core/modules/migrate/src/Tests/MigrateEmbeddedDataTest.php
+++ b/core/modules/migrate/src/Tests/MigrateEmbeddedDataTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -44,7 +43,7 @@ public function testEmbeddedData() {
       'destination' => ['plugin' => 'null'],
     ];
 
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $source = $migration->getSourcePlugin();
 
     // Validate the plugin returns the source data that was provided.
diff --git a/core/modules/migrate/src/Tests/MigrateEventsTest.php b/core/modules/migrate/src/Tests/MigrateEventsTest.php
index baa4149..9933f1f 100644
--- a/core/modules/migrate/src/Tests/MigrateEventsTest.php
+++ b/core/modules/migrate/src/Tests/MigrateEventsTest.php
@@ -15,7 +15,6 @@
 use Drupal\migrate\MigrateMessage;
 use Drupal\migrate\Event\MigrateEvents;
 use Drupal\migrate\MigrateExecutable;
-use Drupal\migrate\Plugin\Migration;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -80,7 +79,7 @@ public function testMigrateEvents() {
       'destination' => ['plugin' => 'dummy'],
     ];
 
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
 
     $executable = new MigrateExecutable($migration, new MigrateMessage());
     // As the import runs, events will be dispatched, recording the received
diff --git a/core/modules/migrate/src/Tests/MigrateInterruptionTest.php b/core/modules/migrate/src/Tests/MigrateInterruptionTest.php
index e65607a..d4cafda 100644
--- a/core/modules/migrate/src/Tests/MigrateInterruptionTest.php
+++ b/core/modules/migrate/src/Tests/MigrateInterruptionTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Event\MigratePostRowSaveEvent;
 use Drupal\migrate\MigrateMessage;
 use Drupal\migrate\Plugin\MigrationInterface;
@@ -60,7 +59,7 @@ public function testMigrateEvents() {
       'destination' => ['plugin' => 'dummy'],
     ];
 
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
 
     $executable = new MigrateExecutable($migration, new MigrateMessage());
     // When the import runs, the first row imported will trigger an
diff --git a/core/modules/migrate/src/Tests/MigrateMessageTest.php b/core/modules/migrate/src/Tests/MigrateMessageTest.php
index 30211e1..493a205 100644
--- a/core/modules/migrate/src/Tests/MigrateMessageTest.php
+++ b/core/modules/migrate/src/Tests/MigrateMessageTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Event\MigrateEvents;
 use Drupal\migrate\Event\MigrateIdMapMessageEvent;
@@ -76,7 +75,7 @@ protected function setUp() {
       ],
     ];
 
-    $this->migration = new Migration([], uniqid(), $definition);
+    $this->migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
   }
 
   /**
diff --git a/core/modules/migrate/src/Tests/MigrateRollbackTest.php b/core/modules/migrate/src/Tests/MigrateRollbackTest.php
index 022973e..d2a9cff 100644
--- a/core/modules/migrate/src/Tests/MigrateRollbackTest.php
+++ b/core/modules/migrate/src/Tests/MigrateRollbackTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Row;
@@ -65,7 +64,7 @@ public function testRollback() {
       'destination' => ['plugin' => 'entity:taxonomy_vocabulary'],
     ];
 
-    $vocabulary_migration = new Migration([], uniqid(), $definition);
+    $vocabulary_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $vocabulary_id_map = $vocabulary_migration->getIdMap();
 
     $this->assertTrue($vocabulary_migration->getDestinationPlugin()->supportsRollback());
@@ -106,7 +105,7 @@ public function testRollback() {
       'migration_dependencies' => ['required' => ['vocabularies']],
     ];
 
-    $term_migration = new Migration([], uniqid(), $definition);
+    $term_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $term_id_map = $term_migration->getIdMap();
 
     $this->assertTrue($term_migration->getDestinationPlugin()->supportsRollback());
@@ -179,7 +178,7 @@ public function testRollback() {
       'migration_dependencies' => ['required' => ['vocabularies']],
     ];
 
-    $settings_migration = new Migration([], uniqid(), $definition);
+    $settings_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $this->assertFalse($settings_migration->getDestinationPlugin()->supportsRollback());
   }
 
diff --git a/core/modules/migrate/src/Tests/MigrateSkipRowTest.php b/core/modules/migrate/src/Tests/MigrateSkipRowTest.php
index 1f4461f..e6998c6 100644
--- a/core/modules/migrate/src/Tests/MigrateSkipRowTest.php
+++ b/core/modules/migrate/src/Tests/MigrateSkipRowTest.php
@@ -11,7 +11,6 @@
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
-use Drupal\migrate\Plugin\Migration;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -54,7 +53,7 @@ public function testPrepareRowSkip() {
       'load' => ['plugin' => 'null'],
     ];
 
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
 
     $executable = new MigrateExecutable($migration, new MigrateMessage());
     $result = $executable->import();
diff --git a/core/modules/migrate/src/Tests/MigrateStatusTest.php b/core/modules/migrate/src/Tests/MigrateStatusTest.php
index 19f186e..a35c8d7 100644
--- a/core/modules/migrate/src/Tests/MigrateStatusTest.php
+++ b/core/modules/migrate/src/Tests/MigrateStatusTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\MigrationInterface;
 
 /**
@@ -32,7 +31,7 @@ public function testStatus() {
       ],
       'process' => ['foo' => 'bar'],
     ];
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
 
     // Default status is idle.
     $status = $migration->getStatus();
diff --git a/core/modules/migrate/src/Tests/MigrationTest.php b/core/modules/migrate/src/Tests/MigrationTest.php
index 998337d..d5c07d4 100644
--- a/core/modules/migrate/src/Tests/MigrationTest.php
+++ b/core/modules/migrate/src/Tests/MigrationTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\migrate\Tests;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -32,7 +31,7 @@ class MigrationTest extends KernelTestBase {
    * @covers ::set()
    */
   public function testSetInvalidation() {
-    $migration = new Migration([], uniqid(), [
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration([
       'source' => ['plugin' => 'empty'],
       'destination' => ['plugin' => 'entity:entity_view_mode'],
     ]);
diff --git a/core/modules/migrate/tests/src/Kernel/Plugin/MigrationTest.php b/core/modules/migrate/tests/src/Kernel/Plugin/MigrationTest.php
new file mode 100644
index 0000000..9975700
--- /dev/null
+++ b/core/modules/migrate/tests/src/Kernel/Plugin/MigrationTest.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\migrate\Kernel\Plugin\MigrationTest.
+ */
+
+namespace Drupal\Tests\migrate\Kernel\Plugin;
+
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests the migration plugin.
+ *
+ * @coversDefaultClass \Drupal\migrate\Plugin\Migration
+ * @group migrate
+ */
+class MigrationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['migrate'];
+
+  /**
+   * Tests Migration::getProcessPlugins()
+   *
+   * @covers ::getProcessPlugins
+   */
+  public function testGetProcessPlugins() {
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration([]);
+    $this->assertEquals([], $migration->getProcessPlugins([]));
+  }
+
+}
diff --git a/core/modules/migrate/tests/src/Unit/Entity/MigrationTest.php b/core/modules/migrate/tests/src/Unit/Entity/MigrationTest.php
deleted file mode 100644
index c3e1592..0000000
--- a/core/modules/migrate/tests/src/Unit/Entity/MigrationTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\migrate\Unit\Entity\MigrationTest.
- */
-
-namespace Drupal\Tests\migrate\Unit\Entity;
-
-use Drupal\migrate\Plugin\Migration;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * Tests the migrate entity.
- *
- * @coversDefaultClass \Drupal\migrate\Plugin\Migration
- * @group migrate
- */
-class MigrationTest extends UnitTestCase {
-
-  /**
-   * Tests Migration::getProcessPlugins()
-   *
-   * @covers ::getProcessPlugins
-   */
-  public function testGetProcessPlugins() {
-    $migration = new Migration([], uniqid(), []);
-    $this->assertEquals([], $migration->getProcessPlugins([]));
-  }
-
-}
diff --git a/core/modules/migrate_drupal/migrate_drupal.module b/core/modules/migrate_drupal/migrate_drupal.module
index 49b5be9..dc3ab4e 100644
--- a/core/modules/migrate_drupal/migrate_drupal.module
+++ b/core/modules/migrate_drupal/migrate_drupal.module
@@ -10,7 +10,6 @@
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate\MigrateMessage;
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\RequirementsInterface;
 
 /**
@@ -43,7 +42,7 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
         'plugin' => 'null',
       ],
     ];
-    $vocabulary_migration = new Migration([], uniqid(), $vocabulary_migration_definition);
+    $vocabulary_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($vocabulary_migration_definition);
 
     try {
       $source_plugin = $vocabulary_migration->getSourcePlugin();
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php b/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
index e18e20c..6f3ba30 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\Exception\RequirementsException;
+use Drupal\migrate\Plugin\MigrateDestinationPluginManager;
 use Drupal\migrate\Plugin\MigratePluginManager;
 use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\MigrationPluginManagerInterface;
@@ -42,13 +43,6 @@ class CckMigration extends Migration implements ContainerFactoryPluginInterface
   protected $cckPluginCache;
 
   /**
-   * The migration plugin manager.
-   *
-   * @var \Drupal\Component\Plugin\PluginManagerInterface
-   */
-  protected $migrationPluginManager;
-
-  /**
    * Constructs a CckMigration.
    *
    * @param array $configuration
@@ -61,11 +55,18 @@ class CckMigration extends Migration implements ContainerFactoryPluginInterface
    *   The cckfield plugin manager.
    * @param \Drupal\migrate\Plugin\MigrationPluginManagerInterface $migration_plugin_manager
    *   The migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $source_plugin_manager
+   *   The source migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $process_plugin_manager
+   *   The process migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigrateDestinationPluginManager $destination_plugin_manager
+   *   The destination migration plugin manager.
+   * @param \Drupal\migrate\Plugin\MigratePluginManager $idmap_plugin_manager
+   *   The ID map migration plugin manager.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigratePluginManager $cck_manager, MigrationPluginManagerInterface $migration_plugin_manager) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigratePluginManager $cck_manager, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManager $source_plugin_manager, MigratePluginManager $process_plugin_manager, MigrateDestinationPluginManager $destination_plugin_manager, MigratePluginManager $idmap_plugin_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration_plugin_manager, $source_plugin_manager, $process_plugin_manager, $destination_plugin_manager, $idmap_plugin_manager);
     $this->cckPluginManager = $cck_manager;
-    $this->migrationPluginManager = $migration_plugin_manager;
   }
 
   /**
@@ -77,7 +78,11 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_id,
       $plugin_definition,
       $container->get('plugin.manager.migrate.cckfield'),
-      $container->get('plugin.manager.migration')
+      $container->get('plugin.manager.migration'),
+      $container->get('plugin.manager.migrate.source'),
+      $container->get('plugin.manager.migrate.process'),
+      $container->get('plugin.manager.migrate.destination'),
+      $container->get('plugin.manager.migrate.id_map')
     );
   }
 
diff --git a/core/modules/migrate_drupal/src/Tests/StubTestTrait.php b/core/modules/migrate_drupal/src/Tests/StubTestTrait.php
index 49edd21..ef240ff 100644
--- a/core/modules/migrate_drupal/src/Tests/StubTestTrait.php
+++ b/core/modules/migrate_drupal/src/Tests/StubTestTrait.php
@@ -6,7 +6,7 @@
  */
 
 namespace Drupal\migrate_drupal\Tests;
-use Drupal\migrate\Plugin\Migration;
+
 use Drupal\migrate\Row;
 
 /**
@@ -51,7 +51,7 @@ protected function createStub($entity_type_id) {
       'process' => [],
       'destination' => ['plugin' => 'entity:' . $entity_type_id],
     ];
-    $migration = new Migration([], uniqid(), $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $destination_plugin = $migration->getDestinationPlugin(TRUE);
     $stub_row = new Row([], [], TRUE);
     $destination_ids = $destination_plugin->import($stub_row);
diff --git a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
index 038d43c..f6f8ba3 100644
--- a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
+++ b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
@@ -12,7 +12,6 @@
 use Drupal\Core\Database\DatabaseExceptionWrapper;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\migrate\Exception\RequirementsException;
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\MigrationDeriverTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -111,7 +110,7 @@ public function getDerivativeDefinitions($base_plugin_definition) {
           $values['migration_dependencies']['required'][] = 'd6_node:' . $node_type;
         }
 
-        $migration = new Migration([], uniqid(), $values);
+        $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($values);
         if (isset($fields[$node_type])) {
           foreach ($fields[$node_type] as $field_name => $info) {
             $field_type = $info['type'];
diff --git a/core/modules/node/src/Plugin/migrate/D7NodeDeriver.php b/core/modules/node/src/Plugin/migrate/D7NodeDeriver.php
index f6b70e4..6307fce 100644
--- a/core/modules/node/src/Plugin/migrate/D7NodeDeriver.php
+++ b/core/modules/node/src/Plugin/migrate/D7NodeDeriver.php
@@ -12,7 +12,6 @@
 use Drupal\Core\Database\DatabaseExceptionWrapper;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\migrate\Exception\RequirementsException;
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Plugin\MigrationDeriverTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -99,7 +98,7 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         ]);
         $values['source']['node_type'] = $node_type;
 
-        $migration = new Migration([], uniqid(), $values);
+        $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($values);
         if (isset($fields[$node_type])) {
           foreach ($fields[$node_type] as $field_name => $info) {
             $field_type = $info['type'];
diff --git a/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php b/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php
index c3fbd35..d412610 100644
--- a/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php
+++ b/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\taxonomy\Tests\Migrate;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase;
 use Drupal\migrate_drupal\Tests\StubTestTrait;
@@ -69,7 +68,7 @@ public function testStubWithWeightMapping() {
       ],
       'destination' => ['plugin' => 'entity:taxonomy_vocabulary'],
     ];
-    $vocabulary_migration = new Migration([], uniqid(), $definition);
+    $vocabulary_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $vocabulary_executable = new MigrateExecutable($vocabulary_migration, $this);
     $vocabulary_executable->import();
 
diff --git a/core/modules/user/src/Plugin/migrate/ProfileValues.php b/core/modules/user/src/Plugin/migrate/ProfileValues.php
index 1821208..0c3e51a 100644
--- a/core/modules/user/src/Plugin/migrate/ProfileValues.php
+++ b/core/modules/user/src/Plugin/migrate/ProfileValues.php
@@ -34,7 +34,7 @@ public function getProcess() {
       ] + $this->source;
       $definition['destination']['plugin'] = 'null';
       try {
-        $profile_field_migration = new Migration([], uniqid(), $definition);
+        $profile_field_migration = $this->migrationPluginManager->createStubMigration($definition);
         $source_plugin = $profile_field_migration->getSourcePlugin();
         $source_plugin->checkRequirements();
         foreach ($source_plugin as $row) {
diff --git a/core/modules/user/src/Plugin/migrate/User.php b/core/modules/user/src/Plugin/migrate/User.php
index a337358..0586016 100644
--- a/core/modules/user/src/Plugin/migrate/User.php
+++ b/core/modules/user/src/Plugin/migrate/User.php
@@ -35,7 +35,7 @@ public function getProcess() {
       $definition['destination']['plugin'] = 'null';
       if (\Drupal::moduleHandler()->moduleExists('field')) {
         $definition['source']['plugin'] = 'd7_field_instance';
-        $field_migration = new Migration([], uniqid(), $definition);
+        $field_migration = $this->migrationPluginManager->createStubMigration($definition);
         foreach ($field_migration->getSourcePlugin() as $row) {
           $field_name = $row->getSourceProperty('field_name');
           $this->process[$field_name] = $field_name;
@@ -43,7 +43,7 @@ public function getProcess() {
       }
       try {
         $definition['source']['plugin'] = 'profile_field';
-        $profile_migration = new Migration([], uniqid(), $definition);
+        $profile_migration = $this->migrationPluginManager->createStubMigration($definition);
         // Ensure that Profile is enabled in the source DB.
         $profile_migration->checkRequirements();
         foreach ($profile_migration->getSourcePlugin() as $row) {
diff --git a/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php b/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php
index 03684e6..73532b8 100644
--- a/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php
+++ b/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\user\Tests\Migrate;
 
-use Drupal\migrate\Plugin\Migration;
 use Drupal\migrate\Tests\MigrateTestBase;
 use Drupal\user\Entity\User;
 
@@ -94,7 +93,7 @@ public function testAdminPasswordPreserved() {
       ],
       'destination' => ['plugin' => 'entity:user'],
     ];
-    $migration = new Migration([], $definition['id'], $definition);
+    $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
     $this->executeMigration($migration);
 
     // Verify that admin username and email were changed, but password was not.
