diff --git a/core/composer.json b/core/composer.json
index 60cc53c2df1cf9d05edab1c151ed7fb0510ee660..b88441f684b8fde84b6234c7b31899068753b9d9 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -138,6 +138,7 @@
         "drupal/menu_ui": "self.version",
         "drupal/migrate": "self.version",
         "drupal/migrate_drupal": "self.version",
+        "drupal/migrate_drupal_multilingual": "self.version",
         "drupal/migrate_drupal_ui": "self.version",
         "drupal/node": "self.version",
         "drupal/options": "self.version",
diff --git a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php
index e9f1e87ef4978cfc4b4b270435137c8fd0f48f48..4078782143baec2b27852c774878b6e358e3c8ec 100644
--- a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php
+++ b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php
@@ -26,6 +26,8 @@ class MigrateBlockContentTranslationTest extends MigrateDrupal6TestBase {
     'language',
     'statistics',
     'taxonomy',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
diff --git a/core/modules/block_content/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php b/core/modules/block_content/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php
index 5ff40526a6189933d46f56209ef7903a301f1f05..2847e35d5e17dc0c6165cb3fa8708b15b6eecf6e 100644
--- a/core/modules/block_content/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php
+++ b/core/modules/block_content/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php
@@ -19,6 +19,8 @@ class MigrateCustomBlockContentTranslationTest extends MigrateDrupal6TestBase {
     'block_content',
     'content_translation',
     'language',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
diff --git a/core/modules/config_translation/migrations/d6_system_maintenance_translation.yml b/core/modules/config_translation/migrations/d6_system_maintenance_translation.yml
index b370914f796d65b5fff5eb8be3256afb7f1d054b..5a3593c27e8d835a117fe5b966129f5ac15fecc7 100644
--- a/core/modules/config_translation/migrations/d6_system_maintenance_translation.yml
+++ b/core/modules/config_translation/migrations/d6_system_maintenance_translation.yml
@@ -3,6 +3,7 @@ label: Maintenance page configuration
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: variable_translation
   variables:
diff --git a/core/modules/config_translation/migrations/d6_system_site_translation.yml b/core/modules/config_translation/migrations/d6_system_site_translation.yml
index 066038338aba785879ce9f58b7c4a2828c333bbe..a246aa97d3bdcf3e4fe4d0a70d13a09cde6d3022 100644
--- a/core/modules/config_translation/migrations/d6_system_site_translation.yml
+++ b/core/modules/config_translation/migrations/d6_system_site_translation.yml
@@ -3,6 +3,7 @@ label: Site configuration
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: variable_translation
   constants:
diff --git a/core/modules/taxonomy/migrations/d6_taxonomy_vocabulary_translation.yml b/core/modules/config_translation/migrations/d6_taxonomy_vocabulary_translation.yml
similarity index 90%
rename from core/modules/taxonomy/migrations/d6_taxonomy_vocabulary_translation.yml
rename to core/modules/config_translation/migrations/d6_taxonomy_vocabulary_translation.yml
index 2ac7760ebaae4f06158900f790fb38655c9a6c2e..1fcba3e34d11cb97fe638f1a615603db581f6f2d 100644
--- a/core/modules/taxonomy/migrations/d6_taxonomy_vocabulary_translation.yml
+++ b/core/modules/config_translation/migrations/d6_taxonomy_vocabulary_translation.yml
@@ -3,6 +3,7 @@ label: Taxonomy vocabularies
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: d6_taxonomy_vocabulary_translation
 process:
@@ -23,6 +24,7 @@ process:
   translation: translation
 destination:
   plugin: entity:taxonomy_vocabulary
+  destination_module: config_translation
 migration_dependencies:
   required:
     - d6_taxonomy_vocabulary
diff --git a/core/modules/config_translation/migrations/d6_user_mail_translation.yml b/core/modules/config_translation/migrations/d6_user_mail_translation.yml
index 801f5678d1a21ccb6418bf2732b945998b3fe7d3..2fb3429e6f6323100831db74b31dde3ed03eff81 100644
--- a/core/modules/config_translation/migrations/d6_user_mail_translation.yml
+++ b/core/modules/config_translation/migrations/d6_user_mail_translation.yml
@@ -3,6 +3,7 @@ label: User mail configuration
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: variable_translation
   variables:
diff --git a/core/modules/config_translation/migrations/d6_user_profile_field_instance_translation.yml b/core/modules/config_translation/migrations/d6_user_profile_field_instance_translation.yml
index 0f728f665829e0b9b5ea85083177f594fa3b6d38..b8a88f43f6daef35916da42bc5144f35f32af18e 100644
--- a/core/modules/config_translation/migrations/d6_user_profile_field_instance_translation.yml
+++ b/core/modules/config_translation/migrations/d6_user_profile_field_instance_translation.yml
@@ -3,6 +3,7 @@ label: User profile field instance configuration
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: d6_profile_field_translation
   constants:
diff --git a/core/modules/config_translation/migrations/d6_user_settings_translation.yml b/core/modules/config_translation/migrations/d6_user_settings_translation.yml
index 05ecb15939d58e664a3844f913da4374e4f872d8..f947ff92766acaeeeb42445de61e5c8f7ee56ae3 100644
--- a/core/modules/config_translation/migrations/d6_user_settings_translation.yml
+++ b/core/modules/config_translation/migrations/d6_user_settings_translation.yml
@@ -3,6 +3,7 @@ label: User configuration
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: variable_translation
   variables:
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 37cd4a9ec2846a28a0d267c5e6c494c3c343811e..26d68eed99f55d2a531ab16d0cc0f3aa8c2fbb24 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,12 @@
  */
 class MigrateSystemMaintenanceTranslationTest extends MigrateDrupal6TestBase {
 
-  public static $modules = ['language', 'config_translation'];
+  public static $modules = [
+    'language',
+    'config_translation',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@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 326e1bb7e479038e65f5e7c6bb69430dc70ae390..e4209432645220a2a91b1bbcf91e0c53060472ca 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,12 @@
  */
 class MigrateSystemSiteTranslationTest extends MigrateDrupal6TestBase {
 
-  public static $modules = ['language', 'config_translation'];
+  public static $modules = [
+    'language',
+    'config_translation',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@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 bc622e1b6a7d3881ed169321476e70066f61ef54..5ff8402deb51fdf2f977f8e4ea73d6059275baba 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,13 @@ class MigrateUserConfigsTranslationTest extends MigrateDrupal6TestBase {
 
   use SchemaCheckTestTrait;
 
-  public static $modules = ['language', 'locale', 'config_translation'];
+  public static $modules = [
+    'language',
+    'locale',
+    'config_translation',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@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 c941e41282a617c035f2a486884c5bb7b42d823c..033f22b9e8e4bc44c3e22bf8e14f11f7e2ca5ba9 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,14 @@ class MigrateUserProfileFieldInstanceTranslationTest extends MigrateDrupal6TestB
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['config_translation', 'locale', 'language', 'field'];
+  public static $modules = [
+    'config_translation',
+    'locale',
+    'language',
+    'field',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * Tests migration of translated user profile fields.
diff --git a/core/modules/content_translation/migrations/d6_block_translation.yml b/core/modules/content_translation/migrations/d6_block_translation.yml
index 3f8810cbfa18cd4c831c1a239b009b146db79628..a27fcfd9e5154e52bd3a2a071bfcd3ca25d7a56f 100644
--- a/core/modules/content_translation/migrations/d6_block_translation.yml
+++ b/core/modules/content_translation/migrations/d6_block_translation.yml
@@ -3,6 +3,7 @@ label: Block translations
 migration_tags:
   - Drupal 6
   - Configuration
+  - Multilingual
 source:
   plugin: d6_block_translation
   constants:
diff --git a/core/modules/content_translation/migrations/d6_custom_block_translation.yml b/core/modules/content_translation/migrations/d6_custom_block_translation.yml
index 7a6d3685b834537cc3407380c4b6e40ca7aa7e00..a240667b9435c7701ed9c3555010e14a54204e2a 100644
--- a/core/modules/content_translation/migrations/d6_custom_block_translation.yml
+++ b/core/modules/content_translation/migrations/d6_custom_block_translation.yml
@@ -3,6 +3,7 @@ label: Custom block translations
 migration_tags:
   - Drupal 6
   - Content
+  - Multilingual
 source:
   plugin: d6_box_translation
 process:
diff --git a/core/modules/migrate_drupal/migrations/d6_entity_reference_translation.yml b/core/modules/content_translation/migrations/d6_entity_reference_translation.yml
similarity index 97%
rename from core/modules/migrate_drupal/migrations/d6_entity_reference_translation.yml
rename to core/modules/content_translation/migrations/d6_entity_reference_translation.yml
index 31888207392fcd80a9f28d044b128b5a5c95d114..74a586b82349794e0590bb7494951bc757505e14 100644
--- a/core/modules/migrate_drupal/migrations/d6_entity_reference_translation.yml
+++ b/core/modules/content_translation/migrations/d6_entity_reference_translation.yml
@@ -2,6 +2,7 @@ id: d6_entity_reference_translation
 label: Entity reference translations
 migration_tags:
   - Drupal 6
+  - Multilingual
   - Follow-up migration
 deriver: Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver
 # Supported target types for entity reference translation migrations. The array
diff --git a/core/modules/content_translation/migrations/d6_menu_links_translation.yml b/core/modules/content_translation/migrations/d6_menu_links_translation.yml
index 71e55992e8afe69dc4b309fe43443eefc933637b..34e4290235e7ebe5ad53cba5de0e30cb84a5779d 100644
--- a/core/modules/content_translation/migrations/d6_menu_links_translation.yml
+++ b/core/modules/content_translation/migrations/d6_menu_links_translation.yml
@@ -3,6 +3,7 @@ label: Menu links
 migration_tags:
   - Drupal 6
   - Content
+  - Multilingual
 source:
   plugin: d6_menu_link_translation
 process:
diff --git a/core/modules/node/migrations/d6_node_translation.yml b/core/modules/content_translation/migrations/d6_node_translation.yml
similarity index 98%
rename from core/modules/node/migrations/d6_node_translation.yml
rename to core/modules/content_translation/migrations/d6_node_translation.yml
index b1345ed065f092e7334dc7ccae0886f1996170be..38e6870162e4a153362b5de867a243381f5dfc26 100644
--- a/core/modules/node/migrations/d6_node_translation.yml
+++ b/core/modules/content_translation/migrations/d6_node_translation.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 6
   - translation
   - Content
+  - Multilingual
 class: Drupal\node\Plugin\migrate\D6NodeTranslation
 deriver: Drupal\node\Plugin\migrate\D6NodeDeriver
 source:
diff --git a/core/modules/content_translation/migrations/d6_taxonomy_term_translation.yml b/core/modules/content_translation/migrations/d6_taxonomy_term_translation.yml
index 0b42dcfdb988a5cc6c52c68b2598d4a82adecc57..96ccd8d569d9dd90096bfab0d5213298c46786cd 100644
--- a/core/modules/content_translation/migrations/d6_taxonomy_term_translation.yml
+++ b/core/modules/content_translation/migrations/d6_taxonomy_term_translation.yml
@@ -3,6 +3,7 @@ label: Taxonomy terms
 migration_tags:
   - Drupal 6
   - Content
+  - Multilingual
 source:
   plugin: d6_taxonomy_term
   translations: true
@@ -34,6 +35,7 @@ process:
   changed: timestamp
 destination:
   plugin: entity:taxonomy_term
+  destination_module: content_translation
 migration_dependencies:
   required:
     - d6_taxonomy_vocabulary
diff --git a/core/modules/migrate_drupal/migrations/d7_entity_reference_translation.yml b/core/modules/content_translation/migrations/d7_entity_reference_translation.yml
similarity index 97%
rename from core/modules/migrate_drupal/migrations/d7_entity_reference_translation.yml
rename to core/modules/content_translation/migrations/d7_entity_reference_translation.yml
index 7e59a9a0c75b7ea951394b92e75af55fa48e88c2..af5bef9490fffd419680004838a9f034a46722b9 100644
--- a/core/modules/migrate_drupal/migrations/d7_entity_reference_translation.yml
+++ b/core/modules/content_translation/migrations/d7_entity_reference_translation.yml
@@ -2,6 +2,7 @@ id: d7_entity_reference_translation
 label: Entity reference translations
 migration_tags:
   - Drupal 7
+  - Multilingual
   - Follow-up migration
 deriver: Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver
 # Supported target types for entity reference translation migrations. The array
diff --git a/core/modules/content_translation/migrations/d7_entity_translation_settings.yml b/core/modules/content_translation/migrations/d7_entity_translation_settings.yml
index 1a8e526c3ca32313e95501f6c194b7f8c565ae10..bd82446339d2c909ac2b60e7c420e2e1b684fa01 100644
--- a/core/modules/content_translation/migrations/d7_entity_translation_settings.yml
+++ b/core/modules/content_translation/migrations/d7_entity_translation_settings.yml
@@ -3,6 +3,7 @@ label: Drupal 7 Entity Translation settings
 migration_tags:
   - Drupal 7
   - Configuration
+  - Multilingual
 source:
   plugin: d7_entity_translation_settings
 process:
diff --git a/core/modules/node/migrations/d7_node_translation.yml b/core/modules/content_translation/migrations/d7_node_translation.yml
similarity index 98%
rename from core/modules/node/migrations/d7_node_translation.yml
rename to core/modules/content_translation/migrations/d7_node_translation.yml
index b5d488e268722c37ad73eff8fd899baef131f1cf..90a101fec13d0952fd3ef37c5273cafbce3489ed 100644
--- a/core/modules/node/migrations/d7_node_translation.yml
+++ b/core/modules/content_translation/migrations/d7_node_translation.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 7
   - translation
   - Content
+  - Multilingual
 class: Drupal\node\Plugin\migrate\D7NodeTranslation
 deriver: Drupal\node\Plugin\migrate\D7NodeDeriver
 source:
diff --git a/core/modules/menu_link_content/migrations/node_translation_menu_links.yml b/core/modules/content_translation/migrations/node_translation_menu_links.yml
similarity index 99%
rename from core/modules/menu_link_content/migrations/node_translation_menu_links.yml
rename to core/modules/content_translation/migrations/node_translation_menu_links.yml
index 4028c7a3f62ef696ce68eea324aedcd9134c4963..837a99b47a8a52102dd7c609443cd77dd637ba98 100644
--- a/core/modules/menu_link_content/migrations/node_translation_menu_links.yml
+++ b/core/modules/content_translation/migrations/node_translation_menu_links.yml
@@ -5,6 +5,7 @@ migration_tags:
   - Drupal 6
   - Drupal 7
   - Content
+  - Multilingual
 source:
   plugin: menu_link
   constants:
diff --git a/core/modules/statistics/migrations/statistics_node_translation_counter.yml b/core/modules/content_translation/migrations/statistics_node_translation_counter.yml
similarity index 97%
rename from core/modules/statistics/migrations/statistics_node_translation_counter.yml
rename to core/modules/content_translation/migrations/statistics_node_translation_counter.yml
index bf8cde4092016a757f4eaa39bcc9a71c795f756b..0c11cd211445bbbc628e1417a58cc49d27a6bab0 100644
--- a/core/modules/statistics/migrations/statistics_node_translation_counter.yml
+++ b/core/modules/content_translation/migrations/statistics_node_translation_counter.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 6
   - Drupal 7
   - Content
+  - Multilingual
 source:
   plugin: node_counter
 process:
diff --git a/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateTaxonomyTermTranslationTest.php b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateTaxonomyTermTranslationTest.php
index 1674cfa5b70b94e7e75f4001e7501ad2e11dbbdf..3e32406d28db764bb783c90f2236ffe3ee039e88 100644
--- a/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateTaxonomyTermTranslationTest.php
+++ b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateTaxonomyTermTranslationTest.php
@@ -20,6 +20,8 @@ class MigrateTaxonomyTermTranslationTest extends MigrateDrupal6TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'taxonomy',
   ];
diff --git a/core/modules/content_translation/tests/src/Kernel/Migrate/d7/MigrateEntityTranslationSettingsTest.php b/core/modules/content_translation/tests/src/Kernel/Migrate/d7/MigrateEntityTranslationSettingsTest.php
index 5fb6ddde60ad76170ce9e228a8c68a8c4489e497..136e5331ecac633dece7830ef568b0253942d3bf 100644
--- a/core/modules/content_translation/tests/src/Kernel/Migrate/d7/MigrateEntityTranslationSettingsTest.php
+++ b/core/modules/content_translation/tests/src/Kernel/Migrate/d7/MigrateEntityTranslationSettingsTest.php
@@ -20,6 +20,8 @@ class MigrateEntityTranslationSettingsTest extends MigrateDrupal7TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'taxonomy',
     'text',
diff --git a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTest.php b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTest.php
index 36e4f30dc0ae4278d99f3eb92e9be12b375e6498..8fab083230ea3d6b243dac680d5c8cda8b287ee8 100644
--- a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTest.php
+++ b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d6/MigrateMenuLinkTest.php
@@ -20,6 +20,8 @@ class MigrateMenuLinkTest extends MigrateNodeTestBase {
     'content_translation',
     'language',
     'menu_link_content',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'menu_ui',
   ];
 
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 4863dde76fd88ae308c89180b3371fb9a3fef28b..d9b47b0592e32033ba56a0d54b83fb1cf6331cdd 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,8 @@ class MigrateMenuLinkTranslationTest extends MigrateDrupal6TestBase {
     'menu_link_content',
     'language',
     'content_translation',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
diff --git a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d7/MigrateMenuLinkTest.php b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d7/MigrateMenuLinkTest.php
index ab21f2c611a9447b9aadb0b342fc4f553d775647..e9913f6fa65d054d5ad16b2229ad88fc930a5bcb 100644
--- a/core/modules/menu_link_content/tests/src/Kernel/Migrate/d7/MigrateMenuLinkTest.php
+++ b/core/modules/menu_link_content/tests/src/Kernel/Migrate/d7/MigrateMenuLinkTest.php
@@ -24,6 +24,8 @@ class MigrateMenuLinkTest extends MigrateDrupal7TestBase {
     'link',
     'menu_ui',
     'menu_link_content',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'text',
   ];
diff --git a/core/modules/migrate_drupal/migrate_drupal.install b/core/modules/migrate_drupal/migrate_drupal.install
index ed60201f7e80d414087302967dbcfd0ec349db06..820bcdc87062038bfc6cbdaae33019e76479a821 100644
--- a/core/modules/migrate_drupal/migrate_drupal.install
+++ b/core/modules/migrate_drupal/migrate_drupal.install
@@ -24,3 +24,10 @@ function migrate_drupal_update_8502() {
     ->set('follow_up_migration_tags', ['Follow-up migration'])
     ->save();
 }
+
+/**
+ * Install migrate_drupal_multilingual since migrate_drupal is installed.
+ */
+function migrate_drupal_update_8601() {
+  \Drupal::service('module_installer')->install(['migrate_drupal_multilingual']);
+}
diff --git a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
index 0aca5be2448cdf08a64776b108dd8b4226007a2d..0349d87a7731fbd640ad7187dff89ec55cb13f6e 100644
--- a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
+++ b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
@@ -110,6 +110,12 @@ protected function getMigrations($database_state_key, $drupal_version) {
       if (!empty(array_intersect($migration->getMigrationTags(), $this->getFollowUpMigrationTags()))) {
         continue;
       }
+      // Multilingual migrations require migrate_drupal_multilingual.
+      $tags = $migration->getMigrationTags() ?: [];
+      if (in_array('Multilingual', $tags, TRUE) && (!\Drupal::service('module_handler')->moduleExists('migrate_drupal_multilingual'))) {
+        throw new RequirementsException(sprintf("Install migrate_drupal_multilingual to run migration '%s'.", $migration->getPluginId()));
+      }
+
       try {
         // @todo https://drupal.org/node/2681867 We should be able to validate
         //   the entire migration at this point.
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php
index e02254a5e50d27fd7d12471d442202a5b3d15b1b..5225ce5d83148cbcd1256cbed0dbeb2fc235b452 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php
@@ -19,6 +19,8 @@ class FollowUpMigrationsTest extends MigrateNodeTestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // A requirement for d6_node_translation.
+    'migrate_drupal_multilingual',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php
index b9b38c2f734cf828a404febcac002fc740b3cb20..5417df47727948d0263db6049e7c7325618056a6 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php
@@ -26,6 +26,8 @@ class FollowUpMigrationsTest extends MigrateDrupal7TestBase {
     'language',
     'link',
     'menu_ui',
+    // A requirement for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'taxonomy',
     'telephone',
diff --git a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..75a79dc285b9a197d6a2fc2932a3d9bd3854c023
--- /dev/null
+++ b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml
@@ -0,0 +1,7 @@
+name: 'Migrate Drupal Multilingual'
+type: module
+description: 'Provides a requirement for multilingual migrations.'
+package: 'Core (Experimental)'
+core: 8.x
+dependencies:
+  - migrate_drupal
diff --git a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.module b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.module
new file mode 100644
index 0000000000000000000000000000000000000000..82ff699f84a56e34f1c33b1a99c95f5f029e0369
--- /dev/null
+++ b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.module
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Provides a requirement for multilingual content and configuration migrations.
+ */
+
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Implements hook_help().
+ */
+function migrate_drupal_multilingual_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.migrate_drupal_multilingual':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Migrate Drupal Multilingual module is a requirement for migrating translations. It does not provide a user interface. For more information, see the <a href=":migrate_drupal_multilingual">online documentation for the Migrate Drupal Multilingual module</a>.', [':migrate_drupal_multilingual' => 'https://www.drupal.org/node/2959712']) . '</p>';
+      return $output;
+  }
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6I18nReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6I18nReviewPageTest.php
index b70fe436aae67b3ec1644986761c6e991b8828e5..adc3071e9e0fe8facdba17ac60741e35a2da5483 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6I18nReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6I18nReviewPageTest.php
@@ -59,7 +59,6 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
-      'i18ntaxonomy',
       'imagecache',
       'imagefield',
       'language',
@@ -142,6 +141,7 @@ protected function getMissingPaths() {
       'i18npoll',
       'i18nprofile',
       'i18nsync',
+      'i18ntaxonomy',
       'i18nviews',
       'phone',
       'views',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6NoMultilingualTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6NoMultilingualTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e07e8bf211f7c1547d4a6c4430abee879f5bb558
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6NoMultilingualTest.php
@@ -0,0 +1,211 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Functional\d6;
+
+use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeExecuteTestBase;
+
+/**
+ * Tests Drupal 6 upgrade without translations.
+ *
+ * The test method is provided by the MigrateUpgradeTestBase class.
+ *
+ * @group migrate_drupal_ui
+ */
+class MigrateUpgrade6NoMultilingualTest extends MigrateUpgradeExecuteTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'language',
+    'content_translation',
+    'config_translation',
+    'migrate_drupal_ui',
+    'telephone',
+    'aggregator',
+    'book',
+    'forum',
+    'statistics',
+  ];
+
+  /**
+   * {@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,
+      'aggregator_feed' => 2,
+      'block' => 35,
+      'block_content' => 2,
+      'block_content_type' => 1,
+      'comment' => 6,
+      // The 'standard' profile provides the 'comment' comment type, and the
+      // migration creates 12 comment types, one per node type.
+      'comment_type' => 13,
+      'contact_form' => 5,
+      'configurable_language' => 5,
+      'editor' => 2,
+      'field_config' => 89,
+      'field_storage_config' => 63,
+      'file' => 8,
+      'filter_format' => 7,
+      'image_style' => 5,
+      'language_content_settings' => 3,
+      'migration' => 105,
+      'node' => 17,
+      // The 'book' module provides the 'book' node type, and the migration
+      // creates 12 node types.
+      'node_type' => 13,
+      'rdf_mapping' => 7,
+      'search_page' => 2,
+      'shortcut' => 2,
+      'shortcut_set' => 1,
+      'action' => 23,
+      'menu' => 8,
+      'taxonomy_term' => 8,
+      'taxonomy_vocabulary' => 7,
+      'tour' => 4,
+      'user' => 7,
+      'user_role' => 6,
+      'menu_link_content' => 8,
+      'view' => 16,
+      'date_format' => 11,
+      'entity_form_display' => 29,
+      'entity_form_mode' => 1,
+      'entity_view_display' => 55,
+      'entity_view_mode' => 14,
+      'base_field_override' => 38,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCountsIncremental() {
+    $counts = $this->getEntityCounts();
+    $counts['block_content'] = 3;
+    $counts['comment'] = 7;
+    $counts['file'] = 9;
+    $counts['menu_link_content'] = 9;
+    $counts['node'] = 18;
+    $counts['taxonomy_term'] = 9;
+    $counts['user'] = 8;
+    $counts['view'] = 16;
+    return $counts;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAvailablePaths() {
+    return [
+      'aggregator',
+      'block',
+      'book',
+      'comment',
+      'contact',
+      'content',
+      'date',
+      'dblog',
+      'email',
+      'filefield',
+      'filter',
+      'forum',
+      'imagecache',
+      'imagefield',
+      'language',
+      'link',
+      'locale',
+      'menu',
+      'node',
+      'nodereference',
+      'optionwidgets',
+      'path',
+      'profile',
+      'search',
+      'statistics',
+      'system',
+      'taxonomy',
+      'text',
+      'upload',
+      'user',
+      'userreference',
+      // Include modules that do not have an upgrade path and are enabled in the
+      // source database, defined in the $noUpgradePath property
+      // in MigrateUpgradeForm.
+      'date_api',
+      'date_timezone',
+      'event',
+      'i18n',
+      'i18nstrings',
+      'imageapi',
+      'number',
+      'php',
+      'profile',
+      'variable_admin',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getMissingPaths() {
+    return [
+      'i18nblocks',
+      'i18ncck',
+      'i18ncontent',
+      'i18nmenu',
+      'i18nprofile',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function testMigrateUpgradeExecute() {
+    $connection_options = $this->sourceDatabase->getConnectionOptions();
+    $this->drupalGet('/upgrade');
+    $session = $this->assertSession();
+    $session->responseContains('Upgrade a site by importing its files and the data from its database into a clean and empty new install of Drupal 8.');
+
+    $button = $session->buttonExists('Continue');
+    $button->click();
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+
+    $driver = $connection_options['driver'];
+    $connection_options['prefix'] = $connection_options['prefix']['default'];
+
+    // Use the driver connection form to get the correct options out of the
+    // database settings. This supports all of the databases we test against.
+    $drivers = drupal_get_database_types();
+    $form = $drivers[$driver]->getFormOptions($connection_options);
+    $connection_options = array_intersect_key($connection_options, $form + $form['advanced_options']);
+    $version = $this->getLegacyDrupalVersion($this->sourceDatabase);
+    $edit = [
+      $driver => $connection_options,
+      'version' => $version,
+    ];
+    if (count($drivers) !== 1) {
+      $edit['driver'] = $driver;
+    }
+    $edits = $this->translatePostValues($edit);
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $session->pageTextContains("Install migrate_drupal_multilingual to run migration 'd6_system_maintenance_translation'.");
+  }
+
+}
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 c62df12df4a68e3165450a0eb9fdbf409a3f8bb3..d2fe095b5044ad2b8f885f604624a3081085772d 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
@@ -18,6 +18,7 @@ class MigrateUpgrade6ReviewPageTest extends MigrateUpgradeReviewPageTestBase {
   public static $modules = [
     'language',
     'content_translation',
+    'config_translation',
     'telephone',
     'aggregator',
     'book',
@@ -26,6 +27,8 @@ class MigrateUpgrade6ReviewPageTest extends MigrateUpgradeReviewPageTestBase {
     'syslog',
     'tracker',
     'update',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
@@ -60,7 +63,11 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
+      'i18n',
       'i18nblocks',
+      'i18nmenu',
+      'i18nprofile',
+      'i18nstrings',
       'i18ntaxonomy',
       'imagecache',
       'imagefield',
@@ -105,9 +112,6 @@ protected function getAvailablePaths() {
       'fieldgroup',
       'filefield_meta',
       'help',
-      'i18n',
-      'i18nmenu',
-      'i18nstrings',
       'imageapi',
       'imageapi_gd',
       'imageapi_imagemagick',
@@ -141,7 +145,6 @@ protected function getMissingPaths() {
       'i18ncck',
       'i18ncontent',
       'i18npoll',
-      'i18nprofile',
       'i18nsync',
       'i18nviews',
       'phone',
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 80bc22126fb2f23cb90ba2829b82a5f684c5dd3f..96aa5579177540ef91e7989a413eb1b87daf35b4 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
@@ -23,6 +23,7 @@ class MigrateUpgrade6Test extends MigrateUpgradeExecuteTestBase {
   public static $modules = [
     'language',
     'content_translation',
+    'config_translation',
     'migrate_drupal_ui',
     'telephone',
     'aggregator',
@@ -30,6 +31,8 @@ class MigrateUpgrade6Test extends MigrateUpgradeExecuteTestBase {
     'forum',
     'statistics',
     'migration_provider_test',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
@@ -83,7 +86,7 @@ protected function getEntityCounts() {
       'menu' => 8,
       'taxonomy_term' => 8,
       'taxonomy_vocabulary' => 7,
-      'tour' => 4,
+      'tour' => 5,
       'user' => 7,
       'user_role' => 6,
       'menu_link_content' => 10,
@@ -132,9 +135,11 @@ protected function getAvailablePaths() {
       'filefield',
       'filter',
       'forum',
+      'i18n',
       'i18nblocks',
       'i18nmenu',
-      'i18nblocks',
+      'i18nprofile',
+      'i18nstrings',
       'i18ntaxonomy',
       'imagecache',
       'imagefield',
@@ -161,8 +166,6 @@ protected function getAvailablePaths() {
       'date_api',
       'date_timezone',
       'event',
-      'i18n',
-      'i18nstrings',
       'imageapi',
       'number',
       'php',
@@ -178,9 +181,6 @@ protected function getMissingPaths() {
     return [
       'i18ncck',
       'i18ncontent',
-      // 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',
     ];
   }
 
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7NoMultilingualTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7NoMultilingualTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c383cd74de6696d38fa230b9fa47256b321a9c46
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7NoMultilingualTest.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Functional\d7;
+
+use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeExecuteTestBase;
+
+/**
+ * Tests Drupal 6 upgrade without translations.
+ *
+ * The test method is provided by the MigrateUpgradeTestBase class.
+ *
+ * @group migrate_drupal_ui
+ */
+class MigrateUpgrade7NoMultilingualTest extends MigrateUpgradeExecuteTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'file',
+    'language',
+    'content_translation',
+    'migrate_drupal_ui',
+    'telephone',
+    'aggregator',
+    'book',
+    'forum',
+    'statistics',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal7.php');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getSourceBasePath() {
+    return __DIR__ . '/files';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCounts() {
+    return [
+      'aggregator_item' => 11,
+      'aggregator_feed' => 1,
+      'block' => 25,
+      'block_content' => 1,
+      'block_content_type' => 1,
+      'comment' => 1,
+      // The 'standard' profile provides the 'comment' comment type, and the
+      // migration creates 6 comment types, one per node type.
+      'comment_type' => 7,
+      // Module 'language' comes with 'en', 'und', 'zxx'. Migration adds 'is'.
+      'configurable_language' => 4,
+      'contact_form' => 3,
+      'editor' => 2,
+      'field_config' => 67,
+      'field_storage_config' => 50,
+      'file' => 3,
+      'filter_format' => 7,
+      'image_style' => 6,
+      'language_content_settings' => 2,
+      'migration' => 73,
+      'node' => 5,
+      'node_type' => 6,
+      'rdf_mapping' => 7,
+      'search_page' => 2,
+      'shortcut' => 6,
+      'shortcut_set' => 2,
+      'action' => 17,
+      'menu' => 6,
+      'taxonomy_term' => 18,
+      'taxonomy_vocabulary' => 4,
+      'tour' => 4,
+      'user' => 4,
+      'user_role' => 3,
+      'menu_link_content' => 10,
+      'view' => 16,
+      'date_format' => 11,
+      'entity_form_display' => 17,
+      'entity_form_mode' => 1,
+      'entity_view_display' => 28,
+      'entity_view_mode' => 14,
+      'base_field_override' => 9,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCountsIncremental() {
+    $counts = $this->getEntityCounts();
+    $counts['block_content'] = 2;
+    $counts['comment'] = 2;
+    $counts['file'] = 4;
+    $counts['menu_link_content'] = 11;
+    $counts['node'] = 6;
+    $counts['taxonomy_term'] = 19;
+    $counts['user'] = 5;
+    return $counts;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAvailablePaths() {
+    return [
+      'aggregator',
+      'block',
+      'book',
+      'color',
+      'comment',
+      'contact',
+      'date',
+      'dblog',
+      'email',
+      'entityreference',
+      'field',
+      'field_sql_storage',
+      'file',
+      'filter',
+      'forum',
+      'image',
+      'language',
+      'link',
+      'list',
+      'locale',
+      'menu',
+      'node',
+      'number',
+      'options',
+      'path',
+      'phone',
+      'search',
+      'shortcut',
+      'statistics',
+      'system',
+      'taxonomy',
+      'text',
+      'user',
+      // Include modules that do not have an upgrade path and are enabled in the
+      // source database, defined in the $noUpgradePath property
+      // in MigrateUpgradeForm.
+      'blog',
+      'contextual',
+      'date_api',
+      'entity',
+      'field_ui',
+      'help',
+      'php',
+      'simpletest',
+      'toolbar',
+      'translation',
+      'trigger',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getMissingPaths() {
+    return [
+      'rdf',
+      // These modules are in the missing path list because they are installed
+      // on the source site but they are not installed on the destination site.
+      'syslog',
+      'tracker',
+      'update',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function testMigrateUpgradeExecute() {
+    $connection_options = $this->sourceDatabase->getConnectionOptions();
+    $this->drupalGet('/upgrade');
+    $session = $this->assertSession();
+    $session->responseContains('Upgrade a site by importing its files and the data from its database into a clean and empty new install of Drupal 8.');
+
+    $button = $session->buttonExists('Continue');
+    $button->click();
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+
+    $driver = $connection_options['driver'];
+    $connection_options['prefix'] = $connection_options['prefix']['default'];
+
+    // Use the driver connection form to get the correct options out of the
+    // database settings. This supports all of the databases we test against.
+    $drivers = drupal_get_database_types();
+    $form = $drivers[$driver]->getFormOptions($connection_options);
+    $connection_options = array_intersect_key($connection_options, $form + $form['advanced_options']);
+    $version = $this->getLegacyDrupalVersion($this->sourceDatabase);
+    $edit = [
+      $driver => $connection_options,
+      'version' => $version,
+    ];
+    if (count($drivers) !== 1) {
+      $edit['driver'] = $driver;
+    }
+    $edits = $this->translatePostValues($edit);
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $session->pageTextContains("Install migrate_drupal_multilingual to run migration 'd7_node_translation:article'.");
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
index 28ceaf0987d8d5edba9a4815224d8d8c698b772d..b7dba648ebdacfa164a65698382e7cfbb28e5522 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7ReviewPageTest.php
@@ -26,6 +26,8 @@ class MigrateUpgrade7ReviewPageTest extends MigrateUpgradeReviewPageTestBase {
     'syslog',
     'tracker',
     'update',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
@@ -57,7 +59,6 @@ protected function getAvailablePaths() {
       'date',
       'dblog',
       'email',
-      'entity_translation',
       'field',
       'field_sql_storage',
       'file',
@@ -108,6 +109,7 @@ protected function getAvailablePaths() {
       'entity_feature',
       'entity_token',
       'entityreference',
+      'entity_translation',
       'field_ui',
       'help',
       'openid',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
index e651af99af175b9f4a49e67fbf6af6f776047880..b36b6eb0cc354fefec1156908ca90b05566f6d9a 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
@@ -31,6 +31,8 @@ class MigrateUpgrade7Test extends MigrateUpgradeExecuteTestBase {
     'forum',
     'statistics',
     'migration_provider_test',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
@@ -127,7 +129,6 @@ protected function getAvailablePaths() {
       'dblog',
       'email',
       'entityreference',
-      'entity_translation',
       'field',
       'field_sql_storage',
       'file',
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php
index 693ed36ff022dc7a34365e6a2e3c82f367d40033..700311c87116e8bd9683b45a8fe4a9478d1f2b7e 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php
@@ -19,7 +19,13 @@ class MigrateNodeTest extends MigrateNodeTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['language', 'content_translation', 'menu_ui'];
+  public static $modules = [
+    'language',
+    'content_translation',
+    'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d6/NodeTranslationRedirectTest.php b/core/modules/node/tests/src/Kernel/Migrate/d6/NodeTranslationRedirectTest.php
index 7daac88309baa9fbf34a56f1b9e545f745b827bc..f3d03166cf482afd70baf7053ba801f634bb6362 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d6/NodeTranslationRedirectTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/NodeTranslationRedirectTest.php
@@ -20,6 +20,8 @@ class NodeTranslationRedirectTest extends MigrateDrupal6TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
   ];
 
   /**
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeTest.php b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeTest.php
index 5b8a9ec97c917e6aca9f59593f48523a5b168c1b..61a19bbf6d11b4f1db2fc3a99ea99bdec0e678f6 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeTest.php
@@ -31,6 +31,8 @@ class MigrateNodeTest extends MigrateDrupal7TestBase {
     'language',
     'link',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'taxonomy',
     'telephone',
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d7/NodeTranslationRedirectTest.php b/core/modules/node/tests/src/Kernel/Migrate/d7/NodeTranslationRedirectTest.php
index 88cc2ade7bd03c61a6101286ef03884bf8c8656b..3e148aaf488c568082caca99e32cca476e0e5ccc 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d7/NodeTranslationRedirectTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d7/NodeTranslationRedirectTest.php
@@ -20,6 +20,8 @@ class NodeTranslationRedirectTest extends MigrateDrupal7TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'text',
   ];
diff --git a/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php b/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
index 59cf3cb1fb0d4c9dbbeef53e15a14079c639f227..28f22ecc959d0d3cfb59ee5e6f3df196518a4798 100644
--- a/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
+++ b/core/modules/path/tests/src/Kernel/Migrate/d6/MigrateUrlAliasTest.php
@@ -16,7 +16,14 @@ class MigrateUrlAliasTest extends MigrateDrupal6TestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['language', 'content_translation', 'path', 'menu_ui'];
+  public static $modules = [
+    'language',
+    'content_translation',
+    'path',
+    'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/path/tests/src/Kernel/Migrate/d7/MigrateUrlAliasTest.php b/core/modules/path/tests/src/Kernel/Migrate/d7/MigrateUrlAliasTest.php
index dae024950010a5627f123a2094911555f2eed971..b8d92e0c49a0252370f44d2bacc9eacb080075c6 100644
--- a/core/modules/path/tests/src/Kernel/Migrate/d7/MigrateUrlAliasTest.php
+++ b/core/modules/path/tests/src/Kernel/Migrate/d7/MigrateUrlAliasTest.php
@@ -18,6 +18,8 @@ class MigrateUrlAliasTest extends MigrateDrupal7TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'path',
     'text',
diff --git a/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php b/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php
index ea917f51a426c29e354117de5a400a11837cb307..29a35fb339044d5ce7f6b49e0b9e74eb28e0b7f2 100644
--- a/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php
+++ b/core/modules/statistics/tests/src/Kernel/Migrate/d6/MigrateNodeCounterTest.php
@@ -18,6 +18,8 @@ class MigrateNodeCounterTest extends MigrateDrupal6TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'statistics',
     'text',
diff --git a/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php b/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php
index 9a7317fada641192568a034ec8cc7213c3f3ba9c..1401e60fd492af65dac290f7a50886e9da57ff4c 100644
--- a/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php
+++ b/core/modules/statistics/tests/src/Kernel/Migrate/d7/MigrateNodeCounterTest.php
@@ -18,6 +18,8 @@ class MigrateNodeCounterTest extends MigrateDrupal7TestBase {
     'content_translation',
     'language',
     'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
     'node',
     'statistics',
     'text',
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 3993abb98fbeef4fbc327f6d4f0e5e3898f0dadb..9d7176c4975841cfa6bee2ee8f4fbafa7f23c230 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,13 @@ class MigrateTaxonomyVocabularyTranslationTest extends MigrateDrupal6TestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['language', 'taxonomy'];
+  public static $modules = [
+    'config_translation',
+    'language',
+    'taxonomy',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
 
   /**
    * {@inheritdoc}