diff --git a/core/composer.json b/core/composer.json
index 7452a07776..e4130d8c81 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -138,6 +138,7 @@
         "drupal/migrate": "self.version",
         "drupal/migrate_drupal": "self.version",
         "drupal/migrate_drupal_ui": "self.version",
+        "drupal/migrate_drupal_i18n": "self.version",
         "drupal/node": "self.version",
         "drupal/options": "self.version",
         "drupal/page_cache": "self.version",
diff --git a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemMaintenanceTranslationTest.php b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemMaintenanceTranslationTest.php
index 37cd4a9ec2..8d64a7ba18 100644
--- a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemMaintenanceTranslationTest.php
+++ b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemMaintenanceTranslationTest.php
@@ -12,7 +12,11 @@
  */
 class MigrateSystemMaintenanceTranslationTest extends MigrateDrupal6TestBase {
 
-  public static $modules = ['language', 'config_translation'];
+  public static $modules = [
+    'language',
+    'config_translation',
+    'migrate_drupal_i18n',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemSiteTranslationTest.php b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemSiteTranslationTest.php
index 326e1bb7e4..daaf538767 100644
--- a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemSiteTranslationTest.php
+++ b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateSystemSiteTranslationTest.php
@@ -12,7 +12,11 @@
  */
 class MigrateSystemSiteTranslationTest extends MigrateDrupal6TestBase {
 
-  public static $modules = ['language', 'config_translation'];
+  public static $modules = [
+    'language',
+    'config_translation',
+    'migrate_drupal_i18n',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserConfigsTranslationTest.php b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserConfigsTranslationTest.php
index bc622e1b6a..09e1d3dea9 100644
--- a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserConfigsTranslationTest.php
+++ b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserConfigsTranslationTest.php
@@ -15,7 +15,12 @@ class MigrateUserConfigsTranslationTest extends MigrateDrupal6TestBase {
 
   use SchemaCheckTestTrait;
 
-  public static $modules = ['language', 'locale', 'config_translation'];
+  public static $modules = [
+    'language',
+    'locale',
+    'config_translation',
+    'migrate_drupal_i18n',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserProfileFieldInstanceTranslationTest.php b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserProfileFieldInstanceTranslationTest.php
index c941e41282..9baec9e7d1 100644
--- a/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserProfileFieldInstanceTranslationTest.php
+++ b/core/modules/config_translation/tests/src/Kernel/Migrate/d6/MigrateUserProfileFieldInstanceTranslationTest.php
@@ -15,7 +15,13 @@ class MigrateUserProfileFieldInstanceTranslationTest extends MigrateDrupal6TestB
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['config_translation', 'locale', 'language', 'field'];
+  public static $modules = [
+    'config_translation',
+    'locale',
+    'language',
+    'field',
+    'migrate_drupal_i18n',
+  ];
 
   /**
    * Tests migration of translated user profile fields.
diff --git a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTranslationTest.php b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTranslationTest.php
index 4863dde76f..87f516afdf 100644
--- a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTranslationTest.php
+++ b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTranslationTest.php
@@ -20,6 +20,7 @@ class MigrateMenuLinkTranslationTest extends MigrateDrupal6TestBase {
     'menu_link_content',
     'language',
     'content_translation',
+    'migrate_drupal_i18n',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal/migrate_drupal.install b/core/modules/migrate_drupal/migrate_drupal.install
index ed60201f7e..90b01a7558 100644
--- a/core/modules/migrate_drupal/migrate_drupal.install
+++ b/core/modules/migrate_drupal/migrate_drupal.install
@@ -24,3 +24,11 @@ function migrate_drupal_update_8502() {
     ->set('follow_up_migration_tags', ['Follow-up migration'])
     ->save();
 }
+
+/**
+ * Install migrate_drupal_i18n since migrate_drupal is installed.
+ */
+function migrate_drupal_update_8601() {
+  $moduleInstaller = \Drupal::service('module_installer');
+  $moduleInstaller->install(['migrate_drupal_i18n']);
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
index c8b44f894e..5cdd7314ee 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
@@ -103,6 +103,15 @@ public static function create(ContainerInterface $container, array $configuratio
    */
   public function checkRequirements() {
     if ($this->pluginDefinition['requirements_met'] === TRUE) {
+
+      // For i18n translations migrate_drupal_i18n must be enabled.
+      if (strpos($this->getSourceModule(), 'i18n') !== FALSE) {
+        if (!\Drupal::service('module_handler')
+          ->moduleExists('migrate_drupal_i18n')) {
+          throw new RequirementsException("The module migrate_drupal_i18n is not enabled on the new site.");
+        }
+      }
+
       if (isset($this->pluginDefinition['source_module'])) {
         if ($this->moduleExists($this->pluginDefinition['source_module'])) {
           if (isset($this->pluginDefinition['minimum_schema_version']) && !$this->getModuleSchemaVersion($this->pluginDefinition['source_module']) < $this->pluginDefinition['minimum_schema_version']) {
diff --git a/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.info.yml b/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.info.yml
new file mode 100644
index 0000000000..ad5bc63965
--- /dev/null
+++ b/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.info.yml
@@ -0,0 +1,8 @@
+name: 'Migrate Drupal i18n'
+type: module
+description: 'Provides a requirement for all i18n migrations.'
+package: 'Core (Experimental)'
+core: 8.x
+dependencies:
+  - migrate
+  - migrate_drupal
diff --git a/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.module b/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.module
new file mode 100644
index 0000000000..b050a47c95
--- /dev/null
+++ b/core/modules/migrate_drupal_i18n/migrate_drupal_i18n.module
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * A requirement for migrating i18n translations.
+ */
+
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Implements hook_help().
+ */
+function migrate_drupal_i18n_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.migrate_drupal_i18n':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Migrate Drupal i18n module is a requirement for migrating i18n translations. It does not provide a user interface. For more information, see the <a href=":migrate_drupal_i18n">online documentation for the Migrate Drupal i18n module</a>.', [':migrate_drupal_i18n' => 'https://www.drupal.org/docs/8/core/modules/experimental-migrate-drupal-i18n']) . '</p>';
+      return $output;
+  }
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
index 1eeb326b13..d610a446cd 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
@@ -60,7 +60,6 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
-      'i18ntaxonomy',
       'imagecache',
       'imagefield',
       'language',
@@ -105,7 +104,6 @@ protected function getAvailablePaths() {
       'filefield_meta',
       'help',
       'i18n',
-      'i18nmenu',
       'i18nstrings',
       'imageapi',
       'imageapi_gd',
@@ -140,9 +138,11 @@ protected function getMissingPaths() {
       'i18nblocks',
       'i18ncck',
       'i18ncontent',
+      'i18nmenu',
       'i18npoll',
       'i18nprofile',
       'i18nsync',
+      'i18ntaxonomy',
       'i18nviews',
       'phone',
       'views',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPagei18nTest.php
similarity index 77%
copy from core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
copy to core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPagei18nTest.php
index 1eeb326b13..458b1b2ac7 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6ReviewPagei18nTest.php
@@ -2,50 +2,24 @@
 
 namespace Drupal\Tests\migrate_drupal_ui\Functional\d6;
 
-use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeReviewPageTestBase;
-
 /**
  * Tests migrate upgrade review page for Drupal 6.
  *
  * @group migrate_drupal_6
  * @group migrate_drupal_ui
  */
-class MigrateUpgrade6ReviewPageTest extends MigrateUpgradeReviewPageTestBase {
+class MigrateUpgrade6ReviewPagei18nTest extends MigrateUpgrade6ReviewPageTest {
 
   /**
    * {@inheritdoc}
    */
   public static $modules = [
-    'language',
-    'content_translation',
-    'telephone',
-    'aggregator',
-    'book',
-    'forum',
-    'statistics',
-    'syslog',
-    'tracker',
-    'update',
+    'migrate_drupal_i18n',
   ];
 
   /**
    * {@inheritdoc}
    */
-  protected function setUp() {
-    parent::setUp();
-    $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal6.php');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getSourceBasePath() {
-    return __DIR__ . '/files';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   protected function getAvailablePaths() {
     return [
       'aggregator',
@@ -60,6 +34,7 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
+      'i18nmenu',
       'i18ntaxonomy',
       'imagecache',
       'imagefield',
@@ -105,7 +80,6 @@ protected function getAvailablePaths() {
       'filefield_meta',
       'help',
       'i18n',
-      'i18nmenu',
       'i18nstrings',
       'imageapi',
       'imageapi_gd',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
index abd6b8993c..d91290772d 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
@@ -132,8 +132,6 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
-      'i18nmenu',
-      'i18ntaxonomy',
       'imagecache',
       'imagefield',
       'language',
@@ -177,9 +175,11 @@ protected function getMissingPaths() {
       'i18nblocks',
       'i18ncck',
       'i18ncontent',
+      'i18nmenu',
       // This module is in the missing path list because it is installed on the
       // source site but it is not installed on the destination site.
       'i18nprofile',
+      'i18ntaxonomy',
     ];
   }
 
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6i18nTest.php
similarity index 64%
copy from core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
copy to core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6i18nTest.php
index abd6b8993c..a85e51d398 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6i18nTest.php
@@ -2,18 +2,17 @@
 
 namespace Drupal\Tests\migrate_drupal_ui\Functional\d6;
 
-use Drupal\node\Entity\Node;
 use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeExecuteTestBase;
 use Drupal\user\Entity\User;
 
 /**
- * Tests Drupal 6 upgrade using the migrate UI.
+ * Tests Drupal 6 i18n upgrade using the migrate UI.
  *
  * The test method is provided by the MigrateUpgradeTestBase class.
  *
  * @group migrate_drupal_ui
  */
-class MigrateUpgrade6Test extends MigrateUpgradeExecuteTestBase {
+class MigrateUpgrade6i18nTest extends MigrateUpgrade6Test {
 
   /**
    * Modules to enable.
@@ -21,35 +20,12 @@ class MigrateUpgrade6Test extends MigrateUpgradeExecuteTestBase {
    * @var array
    */
   public static $modules = [
-    'language',
-    'content_translation',
-    'migrate_drupal_ui',
-    'telephone',
-    'aggregator',
-    'book',
-    'forum',
-    'statistics',
-    'migration_provider_test',
+    'migrate_drupal_i18n',
   ];
 
   /**
    * {@inheritdoc}
    */
-  protected function setUp() {
-    parent::setUp();
-    $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal6.php');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getSourceBasePath() {
-    return __DIR__ . '/files';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   protected function getEntityCounts() {
     return [
       'aggregator_item' => 1,
@@ -64,8 +40,8 @@ protected function getEntityCounts() {
       'contact_form' => 5,
       'configurable_language' => 5,
       'editor' => 2,
-      'field_config' => 89,
-      'field_storage_config' => 63,
+      'field_config' => 88,
+      'field_storage_config' => 62,
       'file' => 8,
       'filter_format' => 7,
       'image_style' => 5,
@@ -183,36 +159,4 @@ protected function getMissingPaths() {
     ];
   }
 
-  /**
-   * Executes all steps of migrations upgrade.
-   */
-  public function testMigrateUpgradeExecute() {
-    parent::testMigrateUpgradeExecute();
-
-    // Ensure migrated users can log in.
-    $user = User::load(2);
-    $user->passRaw = 'john.doe_pass';
-    $this->drupalLogin($user);
-    $this->assertFollowUpMigrationResults();
-  }
-
-  /**
-   * Tests that follow-up migrations have been run successfully.
-   */
-  protected function assertFollowUpMigrationResults() {
-    $node = Node::load(10);
-    $this->assertSame('12', $node->get('field_reference')->target_id);
-    $this->assertSame('12', $node->get('field_reference_2')->target_id);
-    $translation = $node->getTranslation('fr');
-    $this->assertSame('12', $translation->get('field_reference')->target_id);
-    $this->assertSame('12', $translation->get('field_reference_2')->target_id);
-
-    $node = Node::load(12)->getTranslation('en');
-    $this->assertSame('10', $node->get('field_reference')->target_id);
-    $this->assertSame('10', $node->get('field_reference_2')->target_id);
-    $translation = $node->getTranslation('fr');
-    $this->assertSame('10', $translation->get('field_reference')->target_id);
-    $this->assertSame('10', $translation->get('field_reference_2')->target_id);
-  }
-
 }
diff --git a/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTaxonomyVocabularyTranslationTest.php b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTaxonomyVocabularyTranslationTest.php
index 3993abb98f..ff6c4eaf1b 100644
--- a/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTaxonomyVocabularyTranslationTest.php
+++ b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTaxonomyVocabularyTranslationTest.php
@@ -14,7 +14,7 @@ class MigrateTaxonomyVocabularyTranslationTest extends MigrateDrupal6TestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['language', 'taxonomy'];
+  public static $modules = ['language', 'taxonomy', 'migrate_drupal_i18n'];
 
   /**
    * {@inheritdoc}
