diff --git a/core/modules/migrate_drupal/migration_templates/d7_entity_reference_translation.yml b/core/modules/migrate_drupal/migration_templates/d7_entity_reference_translation.yml
new file mode 100644
index 0000000000..6e755f4f01
--- /dev/null
+++ b/core/modules/migrate_drupal/migration_templates/d7_entity_reference_translation.yml
@@ -0,0 +1,14 @@
+id: d7_entity_reference_translation
+label: Entity reference translations
+migration_tags:
+  - Drupal 7
+  - migrate_drupal_post_process
+deriver: Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver
+target_types:
+  node:
+    bundles: d7_node_type
+    dependency: d7_node_translation
+source:
+  plugin: d8_entity_reference_translation
+  key: default
+  target: default
diff --git a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
index 683823296a..d59ba68c0b 100644
--- a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
+++ b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
@@ -89,12 +89,13 @@ protected function createDatabaseStateSettings(array $database, $drupal_version)
    * @return \Drupal\migrate\Plugin\MigrationInterface[]
    *   The migrations for import.
    */
-  protected function getMigrations($database_state_key, $drupal_version) {
+  protected function getMigrations($database_state_key, $drupal_version, $post_process = FALSE) {
     $version_tag = 'Drupal ' . $drupal_version;
     $plugin_manager = \Drupal::service('plugin.manager.migration');
     /** @var \Drupal\migrate\Plugin\Migration[] $all_migrations */
     $all_migrations = $plugin_manager->createInstancesByTag($version_tag);
     $migrations = [];
+    $post_process_migrations = [];
     foreach ($all_migrations as $migration) {
       try {
         // @todo https://drupal.org/node/2681867 We should be able to validate
@@ -107,7 +108,13 @@ protected function getMigrations($database_state_key, $drupal_version) {
         if ($destination_plugin instanceof RequirementsInterface) {
           $destination_plugin->checkRequirements();
         }
-        $migrations[] = $migration;
+        $plugin_definition = $migration->getPluginDefinition();
+        if (in_array('migrate_drupal_post_process', $plugin_definition['migration_tags'])) {
+          $post_process_migrations[] = $migration;
+        }
+        else {
+          $migrations[] = $migration;
+        }
       }
       catch (RequirementsException $e) {
         // Migrations which are not applicable given the source and destination
@@ -116,7 +123,7 @@ protected function getMigrations($database_state_key, $drupal_version) {
       }
     }
 
-    return $migrations;
+    return $post_process ? $post_process_migrations : $migrations;
   }
 
   /**
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php b/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php
new file mode 100644
index 0000000000..8df6af0485
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Drupal\migrate_drupal\Plugin\migrate;
+
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Drupal\migrate\Plugin\MigrationDeriverTrait;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * TODO
+ */
+class EntityReferenceTranslationDeriver extends DeriverBase implements ContainerDeriverInterface {
+
+  use MigrationDeriverTrait;
+
+  /**
+   * The base plugin ID this derivative is for.
+   *
+   * @var string
+   */
+  protected $basePluginId;
+
+  /**
+   * The entity field manager.
+   *
+   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
+   */
+  protected $entityFieldManager;
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * EntityReferenceTranslationDeriver constructor.
+   *
+   * @param string $base_plugin_id
+   *   The base plugin ID for the plugin ID.
+   * @param \Drupal\core\Entity\EntityFieldManagerInterface $entity_field_manager
+   *   The entity field manager.
+   * @param \Drupal\core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   */
+  public function __construct($base_plugin_id, EntityFieldManagerInterface $entity_field_manager, EntityTypeManagerInterface $entity_type_manager) {
+    $this->basePluginId = $base_plugin_id;
+    $this->entityFieldManager = $entity_field_manager;
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $base_plugin_id,
+      $container->get('entity_field.manager'),
+      $container->get('entity_type.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $field_map = $this->entityFieldManager->getFieldMapByFieldType('entity_reference');
+
+    foreach ($field_map as $entity_type => $fields) {
+      $storage = $this->entityTypeManager->getStorage($entity_type);
+
+      if ($storage instanceof SqlEntityStorageInterface) {
+        $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($entity_type);
+        $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type);
+        $table_mapping = $storage->getTableMapping();
+        $definition = $this->entityTypeManager->getDefinition($entity_type);
+        $base_table = $definition->getBaseTable();
+        $data_table = $definition->getDataTable();
+        $keys = $definition->getKeys();
+
+        foreach ($fields as $field_name => $field) {
+          foreach ($field['bundles'] as $bundle) {
+            $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type, $bundle);
+            $target_type = $field_definitions[$field_name]->getSettings()['target_type'];
+
+            if (isset($base_plugin_definition['target_types'][$target_type])) {
+              $derivative = $entity_type . '__' . $bundle;
+              if (!isset($this->derivatives[$derivative])) {
+                $this->derivatives[$derivative] = $base_plugin_definition;
+
+                $dependency = $base_plugin_definition['target_types'][$target_type]['dependency'];
+                if (isset($base_plugin_definition['target_types'][$target_type]['bundles'])) {
+                  $bundles = $base_plugin_definition['target_types'][$target_type]['bundles'];
+                  foreach (static::getSourcePlugin($bundles) as $row) {
+                    $this->derivatives[$derivative]['migration_dependencies']['required'][] = $dependency . ':' . $row->getSourceProperty('type');
+                  }
+                }
+                else {
+                  $this->derivatives[$derivative]['migration_dependencies']['required'][] = $dependency;
+                }
+
+                $this->derivatives[$derivative]['source']['id_field'] = $keys['id'];
+                $this->derivatives[$derivative]['source']['base_table'] = $base_table;
+                $this->derivatives[$derivative]['source']['data_table'] = $data_table;
+                $this->derivatives[$derivative]['source']['field_table'] = $table_mapping->getFieldTableName($field_name);
+
+                foreach (array_keys($base_field_definitions) as $base_field) {
+                  $this->derivatives[$derivative]['process'][$base_field] = $base_field;
+                }
+
+                $this->derivatives[$derivative]['destination']['plugin'] = 'entity:' . $entity_type;
+                $this->derivatives[$derivative]['destination']['default_bundle'] = $bundle;
+              }
+
+              $field_column = $table_mapping->getFieldColumnName($field_storage_definitions[$field_name], 'target_id');
+              $this->derivatives[$derivative]['process'][$field_name] = [
+                'plugin' => 'migration_lookup',
+                'source' => $field_column,
+                'migration' => 'd7_node_translation',
+              ];
+            }
+          }
+        }
+      }
+    }
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/d8/EntityReferenceTranslation.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/d8/EntityReferenceTranslation.php
new file mode 100644
index 0000000000..3e5d269cb7
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/d8/EntityReferenceTranslation.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\migrate_drupal\Plugin\migrate\source\d8;
+
+use Drupal\migrate\Plugin\migrate\source\SqlBase;
+
+/**
+ * TODO
+ *
+ * @MigrateSource(
+ *   id = "d8_entity_reference_translation"
+ * )
+ */
+class EntityReferenceTranslation extends SqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $base_table = $this->configuration['base_table'];
+    $data_table = $this->configuration['data_table'];
+    $field_table = $this->configuration['field_table'];
+    $id_field = $this->configuration['id_field'];
+
+    $query = $this->select($field_table, 'ft')
+      ->fields('ft', []);
+
+    if ($base_table && $base_table !== $field_table) {
+      $query->join($base_table, 'bt', "bt.$id_field = ft.entity_id");
+      $query->fields('bt', []);
+    }
+
+    if ($data_table && $data_table !== $field_table) {
+      $query->join($data_table, 'dt', "dt.$id_field = ft.entity_id");
+      $query->fields('dt', []);
+    }
+
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return [];
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
index 12dc5c1c89..0fb6b8f289 100644
--- a/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
+++ b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
@@ -66,6 +66,13 @@ class MigrateUpgradeImportBatch {
    *   The batch context.
    */
   public static function run($initial_ids, $config, &$context) {
+    $plugin_manager = \Drupal::service('plugin.manager.migration');
+    if ($config['post_process']) {
+      $migration_id = reset($initial_ids);
+      $plugin_manager->clearCachedDefinitions();
+      $initial_ids = $plugin_manager->createInstances($migration_id);
+      $initial_ids = array_keys($initial_ids);
+    }
     if (!static::$listenersAdded) {
       $event_dispatcher = \Drupal::service('event_dispatcher');
       $event_dispatcher->addListener(MigrateEvents::POST_ROW_SAVE, [static::class, 'onPostRowSave']);
diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index fff371d5b8..51726c323c 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -388,6 +388,7 @@ public function validateCredentialForm(array &$form, FormStateInterface $form_st
       else {
         $this->createDatabaseStateSettings($database, $version);
         $migrations = $this->getMigrations('migrate_drupal_' . $version, $version);
+        $post_process_migrations = $this->getMigrations('migrate_drupal_' . $version, $version, TRUE);
 
         // Get the system data from source database.
         $system_data = $this->getSystemData($connection);
@@ -398,10 +399,15 @@ public function validateCredentialForm(array &$form, FormStateInterface $form_st
         foreach ($migrations as $migration) {
           $migration_array[$migration->id()] = $migration->label();
         }
+        $post_process_migration_array = [];
+        foreach ($post_process_migrations as $migration) {
+          $post_process_migration_array[] = $migration->getbaseId();
+        }
 
         // Store the retrieved migration IDs in form storage.
         $form_state->set('version', $version);
         $form_state->set('migrations', $migration_array);
+        $form_state->set('post_process_migrations', $post_process_migration_array);
         if ($version == 6) {
           $form_state->set('source_base_path', $form_state->getValue('d6_source_base_path'));
         }
@@ -619,6 +625,9 @@ public function submitConfirmForm(array &$form, FormStateInterface $form_state)
 
     $migrations = $storage['migrations'];
     $config['source_base_path'] = $storage['source_base_path'];
+    $post_process_migrations = $storage['post_process_migrations'];
+    $post_process_config = $config;
+    $post_process_config['post_process'] = TRUE;
     $batch = [
       'title' => $this->t('Running upgrade'),
       'progress_message' => '',
@@ -627,6 +636,10 @@ public function submitConfirmForm(array &$form, FormStateInterface $form_state)
           [MigrateUpgradeImportBatch::class, 'run'],
           [array_keys($migrations), $config],
         ],
+        [
+          [MigrateUpgradeImportBatch::class, 'run'],
+          [$post_process_migrations, $post_process_config],
+        ],
       ],
       'finished' => [
         MigrateUpgradeImportBatch::class, 'finished',
