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..64dd74f 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/Migration.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/Migration.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\MigrateException;
+use Drupal\migrate\MigrateSkipProcessException;
 use Drupal\migrate\MigrateSkipRowException;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Plugin\MigratePluginManager;
@@ -76,6 +77,7 @@ public function transform($value, MigrateExecutable $migrate_executable, Row $ro
       $scalar = TRUE;
       $value = array($value);
     }
+    $this->skipOnEmpty($value);
     $self = FALSE;
     /** @var \Drupal\migrate\Entity\MigrationInterface[] $migrations */
     $migrations = $this->migrationStorage->loadMultiple($migration_ids);
@@ -100,7 +102,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 +114,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 +124,8 @@ 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);
+
+      $stub_row = new Row($values + $migration->get('source'), $source_ids);
       $stub_row->stub(TRUE);
       // Do a normal migration with the stub row.
       $migrate_executable->processRow($stub_row, $process);
@@ -146,4 +149,18 @@ public function transform($value, MigrateExecutable $migrate_executable, Row $ro
     throw new MigrateSkipRowException();
   }
 
+  /**
+   * Skip the migration process entirely if the value is FALSE.
+   *
+   * @param mixed $value
+   *   The incoming value to transform.
+   *
+   * @throws \Drupal\migrate\MigrateSkipProcessException
+   */
+  protected function skipOnEmpty($value) {
+    if (!array_filter($value)) {
+      throw new MigrateSkipProcessException();
+    }
+  }
+
 }
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_comment.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_comment.yml
index 4cfea2f..dc38654 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_comment.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_comment.yml
@@ -9,29 +9,17 @@ source:
 process:
   cid: cid
   pid:
-    -
-      plugin: skip_process_on_empty
-      source: pid
-    -
-      plugin: migration
-      migration: d6_comment
-  entity_id:
     plugin: migration
-    migration: d6_node
-    source: nid
+    migration: d6_comment
+    source: pid
+  entity_id: nid
   entity_type: 'constants/entity_type'
   # field_name & comment_type is calculated in
   # \Drupal\migrate_drupal\Plugin\migrate\source\d6\Comment::prepareRow()
   field_name: field_name
   comment_type: comment_type
   subject: subject
-  uid:
-    -
-      plugin: skip_process_on_empty
-      source: uid
-    -
-      plugin: migration
-      migration: d6_user
+  uid: uid
   name: name
   mail: mail
   homepage: homepage
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_profile_values.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_profile_values.yml
index d6d0ab7..da0395e 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_profile_values.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_profile_values.yml
@@ -7,10 +7,7 @@ source:
 load:
   plugin: drupal_entity
 process:
-  uid:
-    plugin: migration
-    migration: d6_user
-    source: uid
+  uid: uid
 destination:
   plugin: entity:user
 migration_dependencies:
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,
       ],
     ];
   }
