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 efdee08..edb628a 100644
--- a/core/modules/migrate/config/schema/migrate.data_types.schema.yml
+++ b/core/modules/migrate/config/schema/migrate.data_types.schema.yml
@@ -15,6 +15,15 @@ migrate_source:
   type: migrate_plugin
   label: 'Source'
 
+# Base schema for migrate source plugins that extend
+# \Drupal\migrate\Plugin\migrate\source\SqlBase.
+migrate_source_sql:
+  type: migrate_source
+  mapping:
+    target:
+      type: string
+      label: 'The migration database target'
+
 migrate_load:
   type: migrate_plugin
   label: 'Load'
diff --git a/core/modules/migrate/config/schema/migrate.source.schema.yml b/core/modules/migrate/config/schema/migrate.source.schema.yml
index 97cab99..d89ff07 100644
--- a/core/modules/migrate/config/schema/migrate.source.schema.yml
+++ b/core/modules/migrate/config/schema/migrate.source.schema.yml
@@ -5,7 +5,7 @@ migrate.source.*:
   label: 'Default source'
 
 migrate.source.variable:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Variable'
   mapping:
     variables:
@@ -38,7 +38,7 @@ migrate.source.variable:
           label: 'Plugin'
 
 migrate.source.d6_comment:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 comment'
   mapping:
     constants:
@@ -50,7 +50,7 @@ migrate.source.d6_comment:
           label: 'Entity type'
 
 migrate.source.d6_comment_variable_per_comment_type:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 comment variable'
   mapping:
     constants:
@@ -58,7 +58,7 @@ migrate.source.d6_comment_variable_per_comment_type:
       label: 'Constants'
 
 migrate.source.d6_comment_entity_form_display_subject:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 comment subject entity form display'
   mapping:
     constants:
@@ -66,7 +66,7 @@ migrate.source.d6_comment_entity_form_display_subject:
       label: 'Constants'
 
 migrate.source.d6_box:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 box'
   mapping:
     constants:
@@ -78,7 +78,7 @@ migrate.source.d6_box:
           label: 'Type'
 
 migrate.source.d6_taxonomy_vocabulary:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field instance form display'
   mapping:
     constants:
@@ -86,7 +86,7 @@ migrate.source.d6_taxonomy_vocabulary:
       label: 'Constants'
 
 migrate.source.d6_field_instance_per_form_display:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field instance form display'
   mapping:
     constants:
@@ -94,7 +94,7 @@ migrate.source.d6_field_instance_per_form_display:
       label: 'Constants'
 
 migrate.source.d6_taxonomy_vocabulary_per_type:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field instance form display'
   mapping:
     constants:
@@ -102,7 +102,7 @@ migrate.source.d6_taxonomy_vocabulary_per_type:
       label: 'Constants'
 
 migrate.source.d6_taxonomy_vocabulary_per_type:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field instance form display'
   mapping:
     constants:
@@ -110,7 +110,7 @@ migrate.source.d6_taxonomy_vocabulary_per_type:
       label: 'Constants'
 
 migrate.source.d6_field:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 box'
   mapping:
     constants:
@@ -118,7 +118,7 @@ migrate.source.d6_field:
       label: 'Constants'
 
 migrate.source.variable_multirow:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 box'
   mapping:
     variables:
@@ -129,7 +129,7 @@ migrate.source.variable_multirow:
           label: 'Variable'
 
 migrate.source.d6_comment_variable:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 comment variable'
   mapping:
     constants:
@@ -137,7 +137,7 @@ migrate.source.d6_comment_variable:
       label: 'Constants'
 
 migrate.source.d6_contact_settings:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 contact settings'
   mapping:
     variables:
@@ -148,7 +148,7 @@ migrate.source.d6_contact_settings:
           label: 'Variable'
 
 migrate.source.d6_view_mode:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 view mode'
   mapping:
     constants:
@@ -163,7 +163,7 @@ migrate.source.d6_view_mode:
           label: 'Status'
 
 migrate.source.d6_profile_field:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 profile field'
   mapping:
     constants:
@@ -171,7 +171,7 @@ migrate.source.d6_profile_field:
       label: 'Constants'
 
 migrate.source.d6_field_formatter_settings:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field formatter settings'
   mapping:
     constants:
@@ -179,7 +179,7 @@ migrate.source.d6_field_formatter_settings:
       label: 'Constants'
 
 migrate.source.d6_node_type:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 node type'
   mapping:
     constants:
@@ -187,7 +187,7 @@ migrate.source.d6_node_type:
       label: 'Constants'
 
 migrate.source.d6_upload_instance:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 upload form display'
   mapping:
     constants:
@@ -195,7 +195,7 @@ migrate.source.d6_upload_instance:
       label: 'Constants'
 
 migrate.source.d6_field_instance:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field instance'
   mapping:
     constants:
@@ -203,7 +203,7 @@ migrate.source.d6_field_instance:
       label: 'Constants'
 
 migrate.source.d6_field_instance_per_view_mode:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field formatter'
   mapping:
     constants:
@@ -211,7 +211,7 @@ migrate.source.d6_field_instance_per_view_mode:
       label: 'Constants'
 
 migrate.source.empty:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 field formatter'
   mapping:
     provider:
@@ -253,7 +253,7 @@ migrate.source.d6_user:
           label: 'Module name'
 
 migrate.source.d6_user_picture_file:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 user picure display'
   mapping:
     constants:
@@ -265,7 +265,7 @@ migrate.source.d6_user_picture_file:
           label: 'Public'
 
 migrate.source.d6_user_picture_instance:
-  type: migrate_source
+  type: migrate_source_sql
   label: 'Drupal 6 user picure display'
   mapping:
     provider:
diff --git a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
index ee162d8..074184f 100644
--- a/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/source/SqlBase.php
@@ -14,6 +14,15 @@
 
 /**
  * Sources whose data may be fetched via DBTNG.
+ *
+ * You can specify a 'target' configuration key to specify the database target
+ * to use for a specific migration source. You can specify an additional
+ * database target in settings.php. For example:
+ * @code
+ *   $databases['migrate']['other_database'] = [ ... ];
+ * @endcode
+ * Given that you can specify 'target: other_database' in the 'source' part of
+ * a migration configuration entity.
  */
 abstract class SqlBase extends SourcePluginBase {
 
@@ -57,7 +66,11 @@ public function __toString() {
    */
   public function getDatabase() {
     if (!isset($this->database)) {
-      $this->database = Database::getConnection('default', 'migrate');
+      $target = 'default';
+      if (isset($this->configuration['target'])) {
+        $target = $this->configuration['target'];
+      }
+      $this->database = Database::getConnection($target, 'migrate');
     }
     return $this->database;
   }
diff --git a/core/modules/migrate/src/Tests/SqlBaseTest.php b/core/modules/migrate/src/Tests/SqlBaseTest.php
new file mode 100644
index 0000000..91423b2
--- /dev/null
+++ b/core/modules/migrate/src/Tests/SqlBaseTest.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Tests\SqlBaseTest
+ */
+
+namespace Drupal\migrate\Tests;
+
+use Drupal\migrate\Plugin\migrate\source\TestSqlBase;
+use Drupal\Core\Database\Database;
+
+/**
+ * Test the functionality of SqlBase.
+ *
+ * @group migrate
+ */
+class SqlBaseTest extends MigrateTestBase {
+
+  /**
+   * Test different connection types.
+   */
+  public function testConnectionTypes() {
+    $sql_base = new TestSqlBase();
+    $this->assertIdentical($sql_base->getDatabase()->getTarget(), 'default');
+
+    $target = 'test_db_target';
+    $config = array('target' => $target);
+    $sql_base->setConfiguration($config);
+    Database::addConnectionInfo('migrate', $target, Database::getConnectionInfo('default')['default']);
+
+    $this->assertIdentical($sql_base->getDatabase()->getTarget(), $target);
+  }
+
+}
+
+namespace Drupal\migrate\Plugin\migrate\source;
+
+/**
+ * A dummy source to help with testing SqlBase.
+ *
+ * @package Drupal\migrate\Plugin\migrate\source
+ */
+class TestSqlBase extends SqlBase {
+
+  /**
+   * Override the constructor so we can create one easily.
+   */
+  public function __construct() {}
+
+  /**
+   * Get the database without caching it.
+   */
+  public function getDatabase() {
+    $this->database = NULL;
+    return parent::getDatabase();
+  }
+
+  /**
+   * Allow us to set the configuration from a test.
+   *
+   * @param array $config
+   *   The config array.
+   */
+  public function setConfiguration($config) {
+    $this->configuration = $config;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {}
+
+}
