diff --git a/core/modules/migrate/config/schema/migrate.destination.schema.yml b/core/modules/migrate/config/schema/migrate.destination.schema.yml
index 2bd474e..139164d 100644
--- a/core/modules/migrate/config/schema/migrate.destination.schema.yml
+++ b/core/modules/migrate/config/schema/migrate.destination.schema.yml
@@ -3,6 +3,11 @@
 migrate.destination.*:
   type: migrate_destination
   label: 'Default destination'
+  mapping:
+    no_stub:
+      type: boolean
+      label: 'Whether stubbing is allowed.'
+      default: false
 
 migrate.destination.config:
   type: migrate_destination
diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index 9fb93b7..f3981ff 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateException;
+use Drupal\migrate\MigrateSkipRowException;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Plugin\RequirementsInterface;
 
@@ -272,8 +273,11 @@ protected function getProcessNormalized(array $process) {
   /**
    * {@inheritdoc}
    */
-  public function getDestinationPlugin() {
+  public function getDestinationPlugin($stub = FALSE) {
     if (!isset($this->destinationPlugin)) {
+      if ($stub && !empty($this->destination['no_stub'])) {
+        throw new MigrateSkipRowException;
+      }
       $this->destinationPlugin = \Drupal::service('plugin.manager.migrate.destination')->createInstance($this->destination['plugin'], $this->destination, $this);
     }
     return $this->destinationPlugin;
diff --git a/core/modules/migrate/src/Entity/MigrationInterface.php b/core/modules/migrate/src/Entity/MigrationInterface.php
index 4bfb89f..2bb3fbf 100644
--- a/core/modules/migrate/src/Entity/MigrationInterface.php
+++ b/core/modules/migrate/src/Entity/MigrationInterface.php
@@ -125,7 +125,7 @@ public function getProcessPlugins(array $process = NULL);
    * @return \Drupal\migrate\Plugin\MigrateDestinationInterface
    *   The destination plugin.
    */
-  public function getDestinationPlugin();
+  public function getDestinationPlugin($stub = FALSE);
 
   /**
    * Returns the initialized id_map plugin.
diff --git a/core/modules/migrate/src/Plugin/migrate/process/Migration.php b/core/modules/migrate/src/Plugin/migrate/process/Migration.php
index 0fb0dc9..32df37b 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Migration.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Migration.php
@@ -100,7 +100,7 @@ public function transform($value, MigrateExecutable $migrate_executable, Row $ro
       }
     }
 
-    if (!$destination_ids && ($self && empty($this->configuration['no_stub']) || isset($this->configuration['stub_id']) || count($migrations) == 1)) {
+    if (!$destination_ids && ($self || isset($this->configuration['stub_id']) || count($migrations) == 1)) {
       // If the lookup didn't succeed, figure out which migration will do the
       // stubbing.
       if ($self) {
@@ -112,9 +112,9 @@ public function transform($value, MigrateExecutable $migrate_executable, Row $ro
       else {
         $migration = reset($migrations);
       }
-      $destination_plugin = $migration->getDestinationPlugin();
+      $destination_plugin = $migration->getDestinationPlugin(TRUE);
       // Only keep the process necessary to produce the destination ID.
-      $process = array_intersect_key($migration->get('process'), $destination_plugin->getIds());
+      $process = $migration->get('process');
       // We already have the source id values but need to key them for the Row
       // constructor.
       $source_ids = $migration->getSourcePlugin()->getIds();
@@ -122,7 +122,9 @@ public function transform($value, MigrateExecutable $migrate_executable, Row $ro
       foreach (array_keys($source_ids) as $index => $source_id) {
         $values[$source_id] = $source_id_values[$migration->id()][$index];
       }
-      $stub_row = new Row($values, $source_ids);
+
+      $values['plugin'] = $migration->getSourcePlugin()->getPluginId();
+      $stub_row = new Row($values, $source_ids + $migration->get('source'));
       $stub_row->stub(TRUE);
       // Do a normal migration with the stub row.
       $migrate_executable->processRow($stub_row, $process);
diff --git a/core/modules/migrate/tests/src/Unit/process/MigrationTest.php b/core/modules/migrate/tests/src/Unit/process/MigrationTest.php
deleted file mode 100644
index 77fb8be..0000000
--- a/core/modules/migrate/tests/src/Unit/process/MigrationTest.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\Tests\migrate\Unit\process\MigrationTest.
- */
-
-namespace Drupal\Tests\migrate\Unit\process;
-
-use Drupal\migrate\Plugin\migrate\process\Migration;
-
-/**
- * Test the Migration process plugin.
- *
- * @coversDefaultClass \Drupal\migrate\Plugin\migrate\process\Migration
- *
- * @group migrate
- */
-class MigrationTest extends MigrateProcessTestCase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    $this->plugin = new TestMigrationTest();
-    $this->migrationConfiguration = array('id' => 'test_migration');
-    parent::setUp();
-  }
-
-  /**
-   * Test the no_stub setting.
-   *
-   * @covers ::transform
-   *
-   * @expectedException \Drupal\migrate\MigrateSkipRowException
-   */
-  public function testNoStub() {
-
-    $migration = $this->getMigration();
-    $this->plugin->migration = $migration;
-
-    $storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
-    $storage->expects($this->any())
-      ->method('loadMultiple')
-      ->willReturn(array($migration, $migration));
-    $this->plugin->setMigrationStorage($storage);
-
-    $this->plugin->setConfiguration(array(
-      'migration' => array('test_migration', 'test_migration2'),
-      'no_stub' => TRUE,
-    ));
-
-    $this->plugin->transform('test', $this->migrateExecutable, $this->row, 'test');
-  }
-
-
-}
-
-class TestMigrationTest extends Migration {
-
-  public function __construct() {
-  }
-
-  public function setConfiguration($configuration) {
-    $this->configuration = $configuration;
-  }
-
-  public function setMigrationStorage($storage) {
-    $this->migrationStorage = $storage;
-  }
-
-}
diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_filter_format.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_filter_format.yml
index e6c86df..e70e6c5 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_filter_format.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_filter_format.yml
@@ -42,3 +42,4 @@ process:
         default_value: true
 destination:
   plugin: entity:filter_format
+  no_stub: true
diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_user.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_user.yml
index 3d42482..0388977 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_user.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_user.yml
@@ -38,7 +38,6 @@ process:
     -
       plugin: migration
       migration: d6_filter_format
-      no_stub: 1
   user_picture:
     plugin: d6_user_picture
     source: uid
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php b/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php
index f4b6a16..b661131 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php
@@ -147,7 +147,6 @@ protected function processTextField($field_name, $field_data, MigrationInterface
         'plugin' => 'migration',
         'migration' => 'd6_filter_format',
         'source' => $format_key,
-        'no_stub' => 1,
       ],
     ];
   }
