diff --git a/core/modules/migrate/config/schema/migrate.data_types.schema.yml b/core/modules/migrate/config/schema/migrate.data_types.schema.yml
index d887785..e1b0231 100644
--- a/core/modules/migrate/config/schema/migrate.data_types.schema.yml
+++ b/core/modules/migrate/config/schema/migrate.data_types.schema.yml
@@ -24,6 +24,9 @@ migrate_source:
 migrate_source_sql:
   type: migrate_source
   mapping:
+    id_list:
+      type: sequence
+      label: 'Source IDs to be migrated'
     target:
       type: string
       label: 'The migration database target'
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
index 2ebcbba..e99c560 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php
@@ -84,13 +84,6 @@
   protected $originalHighWater;
 
   /**
-   * List of source IDs to process.
-   *
-   * @var array
-   */
-  protected $idList = array();
-
-  /**
    * Whether this instance should cache the source count.
    *
    * @var bool
@@ -146,6 +139,9 @@
 
   // @TODO, find out how to remove this.
   // @see https://www.drupal.org/node/2443617
+  /**
+   * @var \Drupal\migrate\MigrateExecutableInterface
+   */
   public $migrateExecutable;
 
   /**
@@ -166,10 +162,6 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
       $this->originalHighWater = $this->migration->getHighWater();
     }
 
-    if ($id_list = $this->migration->get('idlist')) {
-      $this->idList = $id_list;
-    }
-
     // Don't allow the use of both highwater and track changes together.
     if ($this->highWaterProperty && $this->trackChanges) {
       throw new MigrateException('You should either use a highwater mark or track changes not both. They are both designed to solve the same problem');
@@ -198,6 +190,23 @@ protected function getModuleHandler() {
   }
 
   /**
+   * Get the list of IDs of the rows to be migrated.
+   *
+   * @return array
+   *   The list of IDs of the rows to be migrated.
+   */
+  protected function getIdList() {
+    if (!empty($this->configuration['id_list'])) {
+      // @TODO: Add support for multiple IDs https://www.drupal.org/node/2529744
+      if (count($this->getIds()) != 1) {
+        throw new \LogicException('Source IDs can only be specified by a list if there is only one id.');
+      }
+      return $this->configuration['id_list'];
+    }
+    return [];
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function prepareRow(Row $row) {
@@ -233,7 +242,7 @@ public function prepareRow(Row $row) {
   /**
    * Returns the iterator that will yield the row arrays to be processed.
    *
-   * @return \Iterator
+   * @return \Iterator|\Countable
    */
   public function getIterator() {
     if (!isset($this->iterator)) {
@@ -307,10 +316,9 @@ public function next() {
     // In order to find the next row we want to process, we ask the source
     // plugin for the next possible row.
     while (!isset($this->currentRow) && $this->getIterator()->valid()) {
-
       $row_data = $this->getIterator()->current() + $this->configuration;
       $this->getIterator()->next();
-      $row = new Row($row_data, $this->migration->getSourcePlugin()->getIds(), $this->migration->get('destinationIds'));
+      $row = new Row($row_data, $this->getIds());
 
       // Populate the source key for this row.
       $this->currentSourceIds = $row->getSourceIdValues();
@@ -322,11 +330,11 @@ public function next() {
 
       // In case we have specified an ID list, but the ID given by the source is
       // not in there, we skip the row.
-      $id_in_the_list = $this->idList && in_array(reset($this->currentSourceIds), $this->idList);
-      if ($this->idList && !$id_in_the_list) {
+      $id_list = $this->getIdList();
+      $id_in_the_list = $id_list && in_array(reset($this->currentSourceIds), $id_list);
+      if ($id_list && !$id_in_the_list) {
         continue;
       }
-
       // Preparing the row gives source plugins the chance to skip.
       if ($this->prepareRow($row) === FALSE) {
         continue;
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
index 7a448f0..94bf2fc 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
@@ -8,6 +8,8 @@
 namespace Drupal\migrate\Plugin\migrate\source;
 
 use Drupal\Core\Database\Database;
+use Drupal\Core\Database\Query\ConditionInterface;
+use Drupal\Core\Database\Query\SelectInterface;
 use Drupal\migrate\Entity\MigrationInterface;
 use Drupal\migrate\Plugin\migrate\id_map\Sql;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
@@ -103,91 +105,124 @@ protected function prepareQuery() {
     $this->query->addTag('migrate_' . $this->migration->id());
     $this->query->addMetaData('migration', $this->migration);
 
-    return $this->query;
-  }
-
-  /**
-   * Implementation of MigrateSource::performRewind().
-   *
-   * We could simply execute the query and be functionally correct, but
-   * we will take advantage of the PDO-based API to optimize the query up-front.
-   */
-  protected function initializeIterator() {
-    $this->prepareQuery();
-    $high_water_property = $this->migration->get('highWaterProperty');
-
-    // Get the key values, for potential use in joining to the map table, or
-    // enforcing idlist.
-    $keys = array();
-
-    // The rules for determining what conditions to add to the query are as
-    // follows (applying first applicable rule)
-    // 1. If idlist is provided, then only process items in that list (AND key
-    //    IN (idlist)). Only applicable with single-value keys.
-    if ($id_list = $this->migration->get('idlist')) {
-      $this->query->condition($keys[0], $id_list, 'IN');
+    // If an ID list is provided, filter on it.
+    if ($id_list = $this->getIdList()) {
+      foreach ($this->getIds() as $field => $definition) {
+        // If a table alias was provided, prepend it in order to prevent
+        // the possibility of 'ambiguous column' errors.
+        if (isset($definition['alias'])) {
+          $field = $definition['alias'] . '.' . $field;
+        }
+        $this->query->condition($field, $id_list, 'IN');
+      }
     }
     else {
-      // 2. If the map is joinable, join it. We will want to accept all rows
+      $conditions = $this->query->orConditionGroup();
+      // 1. If the map is joinable, join it. We will want to accept all rows
       //    which are either not in the map, or marked in the map as NEEDS_UPDATE.
       //    Note that if high water fields are in play, we want to accept all rows
       //    above the high water mark in addition to those selected by the map
       //    conditions, so we need to OR them together (but AND with any existing
       //    conditions in the query). So, ultimately the SQL condition will look
       //    like (original conditions) AND (map IS NULL OR map needs update
-      //      OR above high water).
-      $conditions = $this->query->orConditionGroup();
-      $condition_added = FALSE;
-      if ($this->mapJoinable()) {
-        // Build the join to the map table. Because the source key could have
-        // multiple fields, we need to build things up.
-        $count = 1;
-        $map_join = '';
-        $delimiter = '';
-        foreach ($this->getIds() as $field_name => $field_schema) {
-          if (isset($field_schema['alias'])) {
-            $field_name = $field_schema['alias'] . '.' . $field_name;
-          }
-          $map_join .= "$delimiter$field_name = map.sourceid" . $count++;
-          $delimiter = ' AND ';
+      //    OR above high water).
+      //
+      // 2. If we are using high water marks, also include rows above the mark.
+      //    But, include all rows if the high water mark is not set.
+      if ($this->joinMapTable($conditions) || $this->addHighWaterProperty($conditions)) {
+        $this->query->condition($conditions);
+      }
+    }
+
+    return $this->query;
+  }
+
+  /**
+   * Joins the query on the migration's map table and filters by row status
+   * for a performance boost.
+   *
+   * @param \Drupal\Core\Database\Query\ConditionInterface $conditions
+   *   The condition group on which to set the filters.
+   * @param \Drupal\Core\Database\Query\SelectInterface|NULL $query
+   *   The query to alter. If not passed, defaults to $this->query.
+   *
+   * @return boolean
+   *   TRUE if the map table was joined, FALSE otherwise.
+   */
+  protected function joinMapTable(ConditionInterface $conditions, SelectInterface $query = NULL) {
+    if ($this->mapJoinable()) {
+      $query = $query ?: $this->query;
+      // Build the join to the map table. Because the source key could have
+      // multiple fields, we need to build things up.
+      $count = 1;
+      $map_join = '';
+      $delimiter = '';
+      foreach ($this->getIds() as $field_name => $field_schema) {
+        if (isset($field_schema['alias'])) {
+          $field_name = $field_schema['alias'] . '.' . $field_name;
         }
+        $map_join .= "$delimiter$field_name = map.sourceid" . $count++;
+        $delimiter = ' AND ';
+      }
 
-        $alias = $this->query->leftJoin($this->migration->getIdMap()->getQualifiedMapTableName(), 'map', $map_join);
-        $conditions->isNull($alias . '.sourceid1');
-        $conditions->condition($alias . '.source_row_status', MigrateIdMapInterface::STATUS_NEEDS_UPDATE);
-        $condition_added = TRUE;
+      $alias = $query->leftJoin($this->migration->getIdMap()->getQualifiedMapTableName(), 'map', $map_join);
+      $conditions->isNull($alias . '.sourceid1');
+      $conditions->condition($alias . '.source_row_status', MigrateIdMapInterface::STATUS_NEEDS_UPDATE);
 
-        // And as long as we have the map table, add its data to the row.
-        $n = count($this->getIds());
+      // And as long as we have the map table, add its data to the row.
+      $n = count($this->getIds());
+      for ($count = 1; $count <= $n; $count++) {
+        $map_key = 'sourceid' . $count;
+        $query->addField($alias, $map_key, "migrate_map_$map_key");
+      }
+      if ($n = count($this->migration->getDestinationPlugin()->getIds())) {
         for ($count = 1; $count <= $n; $count++) {
-          $map_key = 'sourceid' . $count;
-          $this->query->addField($alias, $map_key, "migrate_map_$map_key");
-        }
-        if ($n = count($this->migration->get('destinationIds'))) {
-          for ($count = 1; $count <= $n; $count++) {
-            $map_key = 'destid' . $count++;
-            $this->query->addField($alias, $map_key, "migrate_map_$map_key");
-          }
+          $map_key = 'destid' . $count++;
+          $query->addField($alias, $map_key, "migrate_map_$map_key");
         }
-        $this->query->addField($alias, 'source_row_status', 'migrate_map_source_row_status');
       }
-      // 3. If we are using high water marks, also include rows above the mark.
-      //    But, include all rows if the high water mark is not set.
-      if (isset($high_water_property['name']) && ($high_water = $this->migration->getHighWater()) !== '') {
-        if (isset($high_water_property['alias'])) {
-          $high_water = $high_water_property['alias'] . '.' . $high_water_property['name'];
-        }
-        else {
-          $high_water = $high_water_property['name'];
-        }
-        $conditions->condition($high_water, $high_water, '>');
-        $condition_added = TRUE;
+      $query->addField($alias, 'source_row_status', 'migrate_map_source_row_status');
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Adds a query condition to filter on the high-water property, if defined.
+   *
+   * @param \Drupal\Core\Database\Query\ConditionInterface $conditions
+   *   The condition group on which to add the filters.
+   *
+   * @return boolean
+   *   TRUE if the high-water property filter was added, FALSE otherwise.
+   */
+  protected function addHighWaterProperty(ConditionInterface $conditions) {
+    $high_water_property = $this->migration->get('highWaterProperty');
+    if (isset($high_water_property['name']) && ($high_water = $this->migration->getHighWater()) !== '') {
+      if (isset($high_water_property['alias'])) {
+        $high_water = $high_water_property['alias'] . '.' . $high_water_property['name'];
       }
-      if ($condition_added) {
-        $this->query->condition($conditions);
+      else {
+        $high_water = $high_water_property['name'];
       }
+      $conditions->condition($high_water, $high_water, '>');
+      return TRUE;
+    }
+    else {
+      return FALSE;
     }
+  }
 
+  /**
+   * Implementation of MigrateSource::performRewind().
+   *
+   * We could simply execute the query and be functionally correct, but
+   * we will take advantage of the PDO-based API to optimize the query up-front.
+   */
+  protected function initializeIterator() {
+    $this->prepareQuery();
     return new \IteratorIterator($this->query->execute());
   }
 
@@ -200,7 +235,7 @@ protected function initializeIterator() {
    * {@inheritdoc}
    */
   public function count() {
-    return $this->query()->countQuery()->execute()->fetchField();
+    return $this->prepareQuery()->countQuery()->execute()->fetchField();
   }
 
   /**
diff --git a/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
index d6e726a..6b73c66 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php
@@ -93,7 +93,7 @@ protected function getSource($configuration = [], $migrate_config = [], $status
     $source_plugin
       ->expects($this->any())
       ->method('getIds')
-      ->willReturn([]);
+      ->willReturn(['test_sourceid1' => []]);
     $source_plugin
       ->expects($this->any())
       ->method('__toString')
@@ -172,7 +172,8 @@ public function testPrepareRowFalse() {
    * Test that the when a source id is in the idList, we don't get a row.
    */
   public function testIdInList() {
-    $source = $this->getSource([], ['idlist' => ['test_sourceid1']]);
+    $source = $this->getSource(['id_list' => ['test_sourceid1']]);
+
     $source->rewind();
 
     $this->assertNull($source->current(), 'No row is available because id was in idList.');
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ActionTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ActionTest.php
index cc88aef..0250b35 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ActionTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ActionTest.php
@@ -24,8 +24,6 @@ class ActionTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_action',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorFeedTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorFeedTest.php
index ecb57ba..e0a2aa1 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorFeedTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorFeedTest.php
@@ -20,7 +20,6 @@ class AggregatorFeedTest extends MigrateSqlSourceTestCase {
 
   protected $migrationConfiguration = array(
     'id' => 'test',
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_aggregator_feed',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorItemTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorItemTest.php
index 29c0c0d..ae39e05 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorItemTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/AggregatorItemTest.php
@@ -22,8 +22,6 @@ class AggregatorItemTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_aggregator_item',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/BlockTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/BlockTest.php
index 79e3344..dd3e87e 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/BlockTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/BlockTest.php
@@ -24,7 +24,6 @@ class BlockTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_block',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/BoxTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/BoxTest.php
index fdd33ed..6b2bc8a 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/BoxTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/BoxTest.php
@@ -24,8 +24,6 @@ class BoxTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_boxes',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/CommentTestBase.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/CommentTestBase.php
index 0b8f403..9baa67d 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/CommentTestBase.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/CommentTestBase.php
@@ -22,8 +22,6 @@
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     // This needs to be the identifier of the actual key: cid for comment, nid
     // for node and so on.
     'source' => array(
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ContactCategoryTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ContactCategoryTest.php
index a3c4055..6973223 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ContactCategoryTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ContactCategoryTest.php
@@ -20,7 +20,6 @@ class ContactCategoryTest extends MigrateSqlSourceTestCase {
 
   protected $migrationConfiguration = array(
     'id' => 'test',
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_contact_category',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstancePerViewModeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstancePerViewModeTest.php
index 0bf81f9..bf0ea58 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstancePerViewModeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstancePerViewModeTest.php
@@ -24,8 +24,6 @@ class FieldInstancePerViewModeTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'view_mode_test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_field_instance_per_view_mode',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstanceTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstanceTest.php
index 22300bf..64480ad 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstanceTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldInstanceTest.php
@@ -24,8 +24,6 @@ class FieldInstanceTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = [
     // The id of the entity, can be any string.
     'id' => 'test_fieldinstance',
-    // Leave it empty for now.
-    'idlist' => [],
     'source' => [
       'plugin' => 'd6_field_instance',
     ],
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldTest.php
index e95ac4a..2d0a5d9 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FieldTest.php
@@ -24,8 +24,6 @@ class FieldTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The id of the entity, can be any string.
     'id' => 'test_field',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_field',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FileTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FileTest.php
index 52614c9..570a553 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FileTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FileTest.php
@@ -22,8 +22,6 @@ class FileTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_file',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FilterFormatTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FilterFormatTest.php
index 49ec31a..384fd9d 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/FilterFormatTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/FilterFormatTest.php
@@ -24,7 +24,6 @@ class FilterFormatTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     'id' => 'test',
     'highWaterProperty' => array('field' => 'test'),
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_filter_formats',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuLinkSourceTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuLinkSourceTest.php
index fb9e0e7..054a040 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuLinkSourceTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuLinkSourceTest.php
@@ -24,26 +24,11 @@ class MenuLinkSourceTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'mlid',
-    // Leave it empty for now.
-    'idlist' => array(),
     // This needs to be the identifier of the actual key: cid for comment, nid
     // for node and so on.
     'source' => array(
       'plugin' => 'drupal6_menu_link',
     ),
-    'sourceIds' => array(
-      'mlid' => array(
-        // This is where the field schema would go but for now we need to
-        // specify the table alias for the key. Most likely this will be the
-        // same as BASE_ALIAS.
-        'alias' => 'ml',
-      ),
-    ),
-    'destinationIds' => array(
-      'mlid' => array(
-        // This is where the field schema would go.
-      ),
-    ),
   );
 
   protected $expectedResults = array(
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuTest.php
index 4ec45b4..b448ed2 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/MenuTest.php
@@ -24,8 +24,6 @@ class MenuTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     // This needs to be the identifier of the actual key: cid for comment, nid
     // for node and so on.
     'source' => array(
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeByNodeTypeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeByNodeTypeTest.php
index 2370bd8..c283bc6 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeByNodeTypeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeByNodeTypeTest.php
@@ -21,8 +21,6 @@ class NodeByNodeTypeTest extends MigrateSqlSourceTestCase {
   // The fake Migration configuration entity.
   protected $migrationConfiguration = array(
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     // The fake configuration for the source.
     'source' => array(
       'plugin' => 'd6_node',
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeIdListTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeIdListTest.php
new file mode 100644
index 0000000..b01e0cb
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeIdListTest.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\migrate_drupal\Unit\source\d6\NodeIdListTest.
+ */
+
+namespace Drupal\Tests\migrate_drupal\Unit\source\d6;
+
+/**
+ * Tests D6 node source plugin.
+ *
+ * @group migrate_drupal
+ */
+class NodeIdListTest extends NodeTest {
+
+  // The fake Migration configuration entity.
+  protected $migrationConfiguration = [
+    'id' => 'test',
+    // The fake configuration for the source.
+    'source' => [
+      'plugin' => 'd6_node',
+      'id_list' => [1],
+    ],
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->expectedResults = array_slice($this->expectedResults, 0, 1);
+  }
+
+}
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionByNodeTypeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionByNodeTypeTest.php
index e4e7acb..1e984de 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionByNodeTypeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionByNodeTypeTest.php
@@ -21,23 +21,11 @@ class NodeRevisionByNodeTypeTest extends MigrateSqlSourceTestCase {
   // The fake Migration configuration entity.
   protected $migrationConfiguration = [
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => [],
     // The fake configuration for the source.
     'source' => [
       'plugin' => 'd6_node_revision',
       'node_type' => 'page',
     ],
-    'sourceIds' => [
-      'vid' => [
-        'alias' => 'v',
-      ],
-    ],
-    'destinationIds' => [
-      'vid' => [
-        // This is where the field schema would go.
-      ],
-    ],
   ];
 
   protected $databaseContents = [
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionTest.php
index 4dde4b1..ef225b1 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeRevisionTest.php
@@ -21,22 +21,10 @@ class NodeRevisionTest extends MigrateSqlSourceTestCase {
   // The fake Migration configuration entity.
   protected $migrationConfiguration = [
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => [],
     // The fake configuration for the source.
     'source' => [
       'plugin' => 'd6_node_revision',
     ],
-    'sourceIds' => [
-      'vid' => [
-        'alias' => 'v',
-      ],
-    ],
-    'destinationIds' => [
-      'vid' => [
-        // This is where the field schema would go.
-      ],
-    ],
   ];
 
   protected $databaseContents = [
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTest.php
index a108f61..24c9049 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTest.php
@@ -21,8 +21,6 @@ class NodeTest extends MigrateSqlSourceTestCase {
   // The fake Migration configuration entity.
   protected $migrationConfiguration = array(
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     // The fake configuration for the source.
     'source' => array(
       'plugin' => 'd6_node',
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTypeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTypeTest.php
index 5d80aca..530414e 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTypeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/NodeTypeTest.php
@@ -24,8 +24,6 @@ class NodeTypeTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test_nodetypes',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_nodetype',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ProfileFieldTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ProfileFieldTest.php
index 4a8609e..51cabb0 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ProfileFieldTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ProfileFieldTest.php
@@ -24,8 +24,6 @@ class ProfileFieldTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = [
     // The id of the entity, can be any string.
     'id' => 'test_profile_fields',
-    // Leave it empty for now.
-    'idlist' => [],
     'source' => [
       'plugin' => 'd6_profile_field',
     ],
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/RoleTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/RoleTest.php
index e9311d7..8f3c08c 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/RoleTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/RoleTest.php
@@ -24,8 +24,6 @@ class RoleTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => array(),
     // This needs to be the identifier of the actual key: cid for comment, nid
     // for node and so on.
     'source' => array(
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/TermTestBase.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/TermTestBase.php
index ba8129c..7f2de9f 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/TermTestBase.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/TermTestBase.php
@@ -19,7 +19,6 @@
   protected $migrationConfiguration = array(
     'id' => 'test',
     'highWaterProperty' => array('field' => 'test'),
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_taxonomy_term',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UrlAliasTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UrlAliasTest.php
index 780ed0b..6177894 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UrlAliasTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UrlAliasTest.php
@@ -21,7 +21,6 @@ class UrlAliasTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     'id' => 'test',
     'highWaterProperty' => array('field' => 'test'),
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_url_alias',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserPictureTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserPictureTest.php
index de70385..5f7b6fe 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserPictureTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserPictureTest.php
@@ -20,7 +20,6 @@ class UserPictureTest extends MigrateSqlSourceTestCase {
 
   protected $migrationConfiguration = array(
     'id' => 'test_user_picture',
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_user_picture',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserTest.php
index 36d4b67..29a4c10 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/UserTest.php
@@ -20,7 +20,6 @@ class UserTest extends MigrateSqlSourceTestCase {
 
   protected $migrationConfiguration = array(
     'id' => 'test',
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_user',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ViewModeTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ViewModeTest.php
index 250549f..d285dcd 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/ViewModeTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/ViewModeTest.php
@@ -24,8 +24,6 @@ class ViewModeTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = array(
     // The ID of the entity, can be any string.
     'id' => 'view_mode_test',
-    // Leave it empty for now.
-    'idlist' => array(),
     'source' => array(
       'plugin' => 'd6_field_instance_view_mode',
     ),
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/VocabularyTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/VocabularyTest.php
index 2c0d5e6..f5e273a 100644
--- a/core/modules/migrate_drupal/tests/src/Unit/source/d6/VocabularyTest.php
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/VocabularyTest.php
@@ -22,8 +22,6 @@ class VocabularyTest extends MigrateSqlSourceTestCase {
   protected $migrationConfiguration = [
     // The ID of the entity, can be any string.
     'id' => 'test',
-    // Leave it empty for now.
-    'idlist' => [],
     'source' => [
       'plugin' => 'd6_vocabulary',
     ],
