diff --git a/core/modules/content_translation/migrations/d6_entity_reference_translation.yml b/core/modules/content_translation/migrations/d6_entity_reference_translation.yml
index 87150ec395..f697d240a6 100644
--- a/core/modules/content_translation/migrations/d6_entity_reference_translation.yml
+++ b/core/modules/content_translation/migrations/d6_entity_reference_translation.yml
@@ -14,6 +14,7 @@ provider:
 target_types:
   node:
     - d6_node_translation
+    - d6_node_master
 # The source plugin will be set by the deriver.
 source:
   plugin: empty
diff --git a/core/modules/content_translation/migrations/d6_node_master.yml b/core/modules/content_translation/migrations/d6_node_master.yml
new file mode 100644
index 0000000000..38a0322a2c
--- /dev/null
+++ b/core/modules/content_translation/migrations/d6_node_master.yml
@@ -0,0 +1,53 @@
+# Migrates all revisions and all revision translations.
+id: d6_node_master
+label: Node Master
+audit: true
+migration_tags:
+  - Drupal 6
+  - Content
+  - Multilingual
+class: Drupal\node\Plugin\migrate\D6NodeTranslation
+deriver: Drupal\node\Plugin\migrate\D6NodeDeriver
+source:
+  plugin: d6_node_master
+process:
+  # If you are using this file to build a custom migration consider removing
+  # the nid and vid fields to allow incremental migrations.
+  nid: tnid
+  vid: vid
+  langcode:
+    plugin: default_value
+    source: language
+    default_value: "und"
+  title: title
+  uid: node_uid
+  status: status
+  created: created
+  changed: timestamp
+  promote: promote
+  sticky: sticky
+  'body/format':
+    plugin: migration_lookup
+    migration: d6_filter_format
+    source: format
+  'body/value': body
+  'body/summary': teaser
+  revision_uid: revision_uid
+  revision_log: log
+  revision_timestamp: timestamp
+  content_translation_source: source_langcode
+destination:
+  plugin: entity_master:node
+  translations: true
+  destination_module: content_translation
+migration_dependencies:
+  required:
+    - d6_user
+    - d6_node_type
+    - d6_node_settings
+    - d6_filter_format
+    - language
+  optional:
+    - d6_field_instance_widget_settings
+    - d6_field_formatter_settings
+    - d6_upload_field_instance
diff --git a/core/modules/content_translation/migrations/d7_entity_reference_translation.yml b/core/modules/content_translation/migrations/d7_entity_reference_translation.yml
index 2e8d548f0a..f1841f8930 100644
--- a/core/modules/content_translation/migrations/d7_entity_reference_translation.yml
+++ b/core/modules/content_translation/migrations/d7_entity_reference_translation.yml
@@ -14,6 +14,7 @@ provider:
 target_types:
   node:
     - d7_node_translation
+    - d7_node_master
 # The source plugin will be set by the deriver.
 source:
   plugin: empty
diff --git a/core/modules/content_translation/migrations/d7_node_master.yml b/core/modules/content_translation/migrations/d7_node_master.yml
new file mode 100644
index 0000000000..444af3fb70
--- /dev/null
+++ b/core/modules/content_translation/migrations/d7_node_master.yml
@@ -0,0 +1,47 @@
+# Migrates all revisions and all revision translations.
+id: d7_node_master
+label: Nodes
+audit: true
+migration_tags:
+  - Drupal 7
+  - Content
+  - Multilingual
+class: Drupal\node\Plugin\migrate\D7NodeTranslation
+deriver: Drupal\node\Plugin\migrate\D7NodeDeriver
+source:
+  plugin: d7_node_master
+process:
+  # If you are using this file to build a custom migration consider removing
+  # the nid and vid fields to allow incremental migrations.
+  # In D7, nodes always have a tnid, but it's zero for untranslated nodes.
+  # We normalize it to equal the nid in that case.
+  # @see \Drupal\node\Plugin\migrate\source\d7\Node::prepareRow().
+  nid: tnid
+  vid: vid
+  langcode:
+    plugin: default_value
+    source: language
+    default_value: "und"
+  title: title
+  uid: node_uid
+  status: status
+  created: created
+  changed: timestamp
+  promote: promote
+  sticky: sticky
+  revision_uid: revision_uid
+  revision_log: log
+  revision_timestamp: timestamp
+  content_translation_source: source_langcode
+destination:
+  plugin: entity_master:node
+  translations: true
+  destination_module: content_translation
+migration_dependencies:
+  required:
+    - d7_user
+    - d7_node_type
+    - language
+  optional:
+    - d7_field_instance
+    - d7_comment_field_instance
diff --git a/core/modules/migrate/src/Plugin/Derivative/MigrateEntityMaster.php b/core/modules/migrate/src/Plugin/Derivative/MigrateEntityMaster.php
new file mode 100644
index 0000000000..d54db942f7
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/Derivative/MigrateEntityMaster.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\migrate\Plugin\Derivative;
+
+/**
+ * MigrateEntityMaster Deriver.
+ */
+class MigrateEntityMaster extends MigrateEntity {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    foreach ($this->entityDefinitions as $entity_type => $entity_info) {
+      $this->derivatives[$entity_type] = [
+        'id' => "entity_master:$entity_type",
+        'class' => 'Drupal\migrate\Plugin\migrate\destination\EntityContentMaster',
+        'requirements_met' => 1,
+        'provider' => $entity_info->getProvider(),
+      ];
+    }
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php
index 3f8dae982f..e48b2e5a8b 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php
@@ -264,6 +264,12 @@ protected function updateEntity(EntityInterface $entity, Row $row) {
         $language = $row->getDestinationProperty($property);
         if (!$entity->hasTranslation($language)) {
           $entity->addTranslation($language);
+          // MigrateUploadTest does an import where it is makes a new revision
+          // when the content type has new_revision as false.
+          // @todo: fix d6/MigrateUploadTest
+          if ($this->storage->getEntityType()->isRevisionable() && $entity->isNewRevision()) {
+            $entity->setNewRevision(TRUE);
+          }
 
           // We're adding a translation, so delete it on rollback.
           $rollback_action = MigrateIdMapInterface::ROLLBACK_DELETE;
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentMaster.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentMaster.php
new file mode 100644
index 0000000000..8be2cb9ed7
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentMaster.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate\destination;
+
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityChangedInterface;
+use Drupal\migrate\Row;
+
+/**
+ * Master destination for migrating the entire entity revision table.
+ *
+ * @MigrateDestination(
+ *   id = "entity_master",
+ *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityMaster"
+ * )
+ */
+class EntityContentMaster extends EntityContentBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids = [];
+    $id_key = $this->getKey('id');
+    $ids[$id_key] = $this->getDefinitionFromEntity($id_key);
+
+    $revision_key = $this->getKey('revision');
+    if ($revision_key) {
+      $ids[$revision_key] = $this->getDefinitionFromEntity($revision_key);
+    }
+
+    $langcode_key = $this->getKey('langcode');
+    if ($langcode_key) {
+      $ids[$langcode_key] = $this->getDefinitionFromEntity($langcode_key);
+    }
+
+    return $ids;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @todo: Use EntityFieldDefinitionTrait instead.
+   *   See https://www.drupal.org/project/drupal/issues/2937782.
+   */
+  protected static function getEntityTypeId($plugin_id) {
+    // Remove entity_revision:
+    return substr($plugin_id, 14);
+  }
+
+  /**
+   * Gets the entity.
+   *
+   * @param \Drupal\migrate\Row $row
+   *   The row object.
+   * @param array $old_destination_id_values
+   *   The old destination IDs.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|false
+   *   The entity or false if it can not be created.
+   */
+  protected function getEntity(Row $row, array $old_destination_id_values) {
+    $revision_id = $old_destination_id_values ?
+      $old_destination_id_values[1] :
+      $row->getDestinationProperty($this->getKey('revision'));
+    if (!empty($revision_id) && ($entity = $this->storage->loadRevision($revision_id))) {
+      $entity->setNewRevision(FALSE);
+    }
+    else {
+      if (($entity_id = $row->getDestinationProperty($this->getKey('id'))) &&
+        ($entity = $this->storage->load($entity_id))) {
+        $entity->enforceIsNew(FALSE);
+        $entity->setNewRevision(TRUE);
+      }
+      else {
+        // Attempt to ensure we always have a bundle.
+        if ($bundle = $this->getBundle($row)) {
+          $row->setDestinationProperty($this->getKey('bundle'), $bundle);
+        }
+
+        // Stubs might need some required fields filled in.
+        if ($row->isStub()) {
+          $this->processStubRow($row);
+        }
+        $entity = $this->storage->create($row->getDestination());
+        $entity->enforceIsNew();
+      }
+    }
+    // We need to update the entity, so that the destination row IDs are
+    // correct.
+    $entity = $this->updateEntity($entity, $row);
+    $entity->isDefaultRevision(TRUE);
+    if ($entity instanceof EntityChangedInterface && $entity instanceof ContentEntityInterface) {
+      // If we updated any untranslatable fields, update the timestamp for the
+      // other translations.
+      /** @var \Drupal\Core\Entity\ContentEntityInterface|\Drupal\Core\Entity\EntityChangedInterface $entity */
+      foreach ($entity->getTranslationLanguages() as $langcode => $language) {
+        if ($entity->getTranslation($langcode)->hasTranslationChanges()) {
+          $entity->getTranslation($langcode)->setChangedTime($entity->getChangedTime());
+        }
+      }
+    }
+    return $entity;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function save(ContentEntityInterface $entity, array $old_destination_id_values = []) {
+    parent::save($entity, $old_destination_id_values);
+    return [
+      $entity->id(),
+      $entity->getRevisionId(),
+    ];
+  }
+
+}
diff --git a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
index 03f631fb26..afbde8f946 100644
--- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
+++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
@@ -971,14 +971,10 @@ protected function getMigrationPluginManager() {
    * {@inheritdoc}
    */
   public function getHighestId() {
-    array_filter(
-      $this->migration->getDestinationPlugin()->getIds(),
-      function (array $id) {
-        if ($id['type'] !== 'integer') {
-          throw new \LogicException('Cannot determine the highest migrated ID without an integer ID column');
-        }
-      }
-    );
+    // Ensure that at least one ID is an integer.
+    if (array_search('integer', array_column($this->migration->getDestinationPlugin()->getIds(), 'type')) === FALSE) {
+      throw new \LogicException('Cannot determine the highest migrated ID without an integer ID column');
+    };
 
     // List of mapping tables to look in for the highest ID.
     $map_tables = [
diff --git a/core/modules/migrate_drupal/migrate_drupal.module b/core/modules/migrate_drupal/migrate_drupal.module
index 3f9439dd3b..5a3ca8aeef 100644
--- a/core/modules/migrate_drupal/migrate_drupal.module
+++ b/core/modules/migrate_drupal/migrate_drupal.module
@@ -12,6 +12,23 @@
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate\Plugin\RequirementsInterface;
 
+/**
+ * Indicates of the node migration map tables in use.
+ */
+const NODE_MIGRATE_TYPE_MASTER = 'MASTER';
+
+/**
+ * Indicates of the node migration map tables in use.
+ *
+ * @todo needs a better name.
+ */
+const NODE_MIGRATE_TYPE_NOT_MASTER = 'NOT_MASTER';
+
+/**
+ * Indicates of the node migration map tables in use.
+ */
+const NODE_MIGRATE_TYPE_BOTH = 'BOTH';
+
 /**
  * Implements hook_help().
  */
@@ -46,7 +63,8 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
       ],
     ];
     $vocabulary_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($vocabulary_migration_definition);
-    $translation_active = \Drupal::service('module_handler')->moduleExists('content_translation');
+    $module_handler = \Drupal::service('module_handler');
+    $translation_active = $module_handler->moduleExists('content_translation');
 
     try {
       $source_plugin = $vocabulary_migration->getSourcePlugin();
@@ -89,6 +107,210 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
       // When the definitions are loaded it is possible the tables will not
       // exist.
     }
+  }
+
+  // If this source database is multilingual then we are only running the
+  // dN_node_master migration and not any other dN_node* migration.  Alter all
+  // instances of migration_lookup in core migrations to use dN_node_master.
+  if (_use_master_node_migration($definitions) === NODE_MIGRATE_TYPE_MASTER) {
+    foreach ($definitions as &$definition) {
+      if (!preg_match('/d([67])_(node|node_translation|node_revision)($|:.*)/', $definition['id'])) {
+        $properties = ['destination', 'migration_dependencies'];
+        foreach ($properties as $property) {
+          if (isset($definition[$property])) {
+            array_walk_recursive($definition[$property], function (&$value) {
+              if (is_string($value)) {
+                $value = preg_replace('/d([67])_(node|node_translation|node_revision)($|:.*)/', 'd$1_node_master$3', $value);
+              }
+              return $value;
+            });
+          }
+        }
+      }
+
+      // Pipeline does not extract the migration_lookup return value.
+      if (preg_match('/d6_term_node($|:.*)/', $definition['id'])) {
+        $tmp = $definition['process']['nid'][0]['migration'];
+        $definition['process']['nid'][0]['migration'] = _insert_migration($tmp);
+        $definition['process']['nid'][2] = [
+          'plugin' => 'node_master_node_lookup',
+        ];
+      }
+      // Pipeline does not extract the migration_lookup return value.
+      if (preg_match('/d6_term_node_revision($|:.*)/', $definition['id'])) {
+        $tmp = $definition['process']['vid'][0]['migration'];
+        $definition['process']['vid'][0]['migration'] = _insert_migration($tmp);
+        $definition['process']['vid'][2] = [
+          'plugin' => 'node_master_node_revision_lookup',
+        ];
+      }
+      // Pipeline does not extract the migration_lookup return value.
+      if (preg_match('/d6_term_node_translation($|:.*)/', $definition['id'])) {
+        $tmp = $definition['process']['dest_nid'][0]['migration'];
+        $definition['process']['dest_nid'][0]['migration'] = _insert_migration($tmp);
+        $definition['process']['dest_nid'][2] = [
+          'plugin' => 'node_master_node_translation_lookup',
+        ];
+      }
+    }
+
+    // Pipeline does not extract the migration_lookup return value.
+    if (isset($definitions['d6_comment'])) {
+      $tmp = $definitions['d6_comment']['process']['entity_id'][0]['migration'];
+      $definitions['d6_comment']['process']['entity_id'][0]['migration'] = _insert_migration($tmp);
+      $definitions['d6_comment']['process']['entity_id'][2] = [
+        'plugin' => 'node_master_node_lookup',
+      ];
+    }
+    // Pipeline does not extract the migration_lookup return value.
+    if (isset($definitions['d6_url_alias'])) {
+      $tmp = $definitions['d6_url_alias']['process']['node_translation'][2]['migration'];
+      $definitions['d6_url_alias']['process']['node_translation'][2]['migration'] = _insert_migration($tmp);
+      $definitions['d6_url_alias']['process']['node_translation'][3] = [
+        'plugin' => 'node_master_node_translation_lookup',
+      ];
+    }
+    // Pipeline does not extract the migration_lookup return value.
+    if (isset($definitions['d7_comment'])) {
+      $tmp = $definitions['d7_comment']['process']['entity_id'][0]['migration'];
+      $definitions['d7_comment']['process']['entity_id'][0]['migration'] = _insert_migration($tmp);
+      $definitions['d7_comment']['process']['entity_id'][2] = [
+        'plugin' => 'node_master_node_lookup',
+      ];
+    }
+    // Pipeline does not extract the migration_lookup return value.
+    if (isset($definitions['d7_url_alias'])) {
+      $tmp = $definitions['d7_url_alias']['process']['node_translation'][2]['migration'];
+      $definitions['d7_url_alias']['process']['node_translation'][2]['migration'] = _insert_migration($tmp);
+      $definitions['d7_url_alias']['process']['node_translation'][3] = [
+        'plugin' => 'node_master_node_translation_lookup',
+      ];
+    }
+    // Pipeline does not extract the migration_lookup return value.
+    if (isset($definitions['statistics_node_counter'])) {
+      $tmp = $definitions['statistics_node_counter']['process']['nid'][0]['migration'];
+      $definitions['statistics_node_counter']['process']['nid'][0]['migration'] = _insert_migration($tmp);
+      $definitions['statistics_node_counter']['process']['nid'][2] = [
+        'plugin' => 'node_master_node_lookup',
+      ];
+    }
+    // Pipeline extracts the first item of the migration_lookup return value.
+    if (isset($definitions['node_translation_menu_links'])) {
+      $tmp = $definitions['node_translation_menu_links']['process']['new_nid'][4]['migration'];
+      $definitions['node_translation_menu_links']['process']['new_nid'][4]['migration'] = _insert_migration($tmp);
+    }
+  }
+}
+
+/**
+ * Add dN_node_master to the migrations array of a migration_lookup plugin.
+ *
+ * @internal
+ *   Only to be used by migrate_drupal_migration_plugins_alter().
+ */
+function _insert_migration($migrations) {
+  if (!is_array($migrations)) {
+    $migrations = [$migrations];
+  }
+  $new_migration_list = [];
+  foreach ($migrations as $migration) {
+    $tmp = substr($migration, 0, 2) . '_node_master';
+    array_unshift($new_migration_list, $tmp, $migration);
+  }
+  return array_unique($new_migration_list);
+}
+
+/**
+ * Determines is the node master migration is to be used.
+ *
+ * The node master migration is the default. It is not used when there
+ * are existing tables for dNnode.
+ *
+ * @param array[] $definitions
+ *   An associative array of migrations keyed by migration ID. Each value is the
+ *   migration array, obtained by decoding the migration YAML file and enriched
+ *   with some meta information added during discovery phase, like migration
+ *   'class', 'provider' or '_discovered_file_path'.
+ *
+ * @return string
+ *   Indicator of the node migration map tables in use.
+ *
+ * @internal
+ *   Only to be used by migrate_drupal_migration_plugins_alter().
+ */
+function _use_master_node_migration(array $definitions) {
+  /** @var \Drupal\migrate\Plugin\migrate\source\SqlBase $source_plugin */
+  if (isset($definitions['system_site'])) {
+    $source_plugin = \Drupal::service('plugin.manager.migration')
+      ->createStubMigration($definitions['system_site'])
+      ->getSourcePlugin();
+    $connection = NULL;
+    try {
+      $connection = $source_plugin->getDatabase();
+    }
+    catch (\Exception $e) {
+      // @todo: do something useful.
+    }
+    $version_string = FALSE;
 
+    if ($connection) {
+      if ($connection->schema()->tableExists('system')) {
+        try {
+          $version_string = $connection
+            ->query('SELECT schema_version FROM {system} WHERE name = :module', [':module' => 'system'])
+            ->fetchField();
+          if ($version_string && $version_string[0] == '1') {
+            if ((int) $version_string >= 1000) {
+              $version_string = '5';
+            }
+            else {
+              $version_string = FALSE;
+            }
+          }
+        }
+        catch (\PDOException $e) {
+          $version_string = FALSE;
+        }
+      }
+    }
+    $version = $version_string ? substr($version_string, 0, 1) : FALSE;
+
+    $use_master_node = NODE_MIGRATE_TYPE_MASTER;
+    $node_exists = FALSE;
+    $node_master_exists = FALSE;
+    $connection = \Drupal::database();
+
+    $bases = ['node', 'node_master'];
+    $tables = $connection->schema()->findTables('migrate_map_d' . $version . '_node%');
+    foreach ($bases as $base) {
+      $exists = $base . '_exists';
+      $$exists = FALSE;
+      $base_tables = preg_grep('/^migrate_map_d' . $version . '_' . $base . '_{2}.*$/', $tables);
+      foreach ($base_tables as $base_table) {
+        if ($connection->schema()->tableExists($base_table)) {
+          if ($connection->select($base_table)->countQuery()->execute()->fetchField()) {
+            $$exists = TRUE;
+            break;
+          }
+        }
+      }
+    }
+
+    if ($node_exists && $node_master_exists) {
+      $use_master_node = NODE_MIGRATE_TYPE_BOTH;
+    }
+    if ($node_exists && !$node_master_exists) {
+      $use_master_node = NODE_MIGRATE_TYPE_NOT_MASTER;
+    }
+
+    // This might be a test environment so check if the 'node_migrate_master'
+    // test module is enabled.
+    if (!$node_exists && !$node_master_exists) {
+      if (!\Drupal::service('module_handler')->moduleExists('node_migrate_master')) {
+        $use_master_node = NODE_MIGRATE_TYPE_NOT_MASTER;
+      }
+    }
+    return $use_master_node;
   }
+
 }
diff --git a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
index 8cb60347bc..92bc954fef 100644
--- a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
+++ b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
@@ -123,6 +123,29 @@ protected function getMigrations($database_state_key, $drupal_version) {
     $version_tag = 'Drupal ' . $drupal_version;
     /** @var \Drupal\migrate\Plugin\Migration[] $all_migrations */
     $all_migrations = $this->getMigrationPluginManager()->createInstancesByTag($version_tag);
+
+    // If this source database is multilingual then we must run only the
+    // dN_node_master migration and not any other dN_node* migration or the
+    // entity translation migrations. Conversely, if the source database is not
+    // multilingual then we want to run all dN_node* migrations except
+    // dN_node_master. Here we unset the migrations we don't want to run.
+    $type = $this->useMasterNodeMigration($all_migrations, $drupal_version);
+    if ($type === NODE_MIGRATE_TYPE_MASTER) {
+      $patterns = '/(d' . $drupal_version . '_node:)|(d' . $drupal_version . '_node_translation:)|(d' . $drupal_version . '_node_revision:)|(entity_translation)/';
+    }
+    if ($type === NODE_MIGRATE_TYPE_NOT_MASTER) {
+      $patterns = '/(d' . $drupal_version . '_node_master:)/';
+    }
+    if ($type === NODE_MIGRATE_TYPE_BOTH) {
+      $patterns = '//';
+    }
+
+    foreach ($all_migrations as $key => $migrations) {
+      if (preg_match($patterns, $key)) {
+        unset($all_migrations[$key]);
+      }
+    }
+
     $migrations = [];
     foreach ($all_migrations as $migration) {
       // Skip migrations tagged with any of the follow-up migration tags. They
@@ -273,4 +296,48 @@ protected function getState() {
     return $this->state;
   }
 
+  /**
+   * Determines is the node master migration is to be used.
+   *
+   * The node master migration is the default. It is not used when there
+   * are existing tables for dNnode.
+   *
+   * @return string
+   *   Indicator of the node migration map tables in use.
+   */
+  protected function useMasterNodeMigration($migrations, $version) {
+    $use_master_node = NODE_MIGRATE_TYPE_MASTER;
+    $node_exists = FALSE;
+    $node_master_exists = FALSE;
+
+    $ids = ['node_master', 'node'];
+    foreach ($ids as $id) {
+      $exists = $id . '_exists';
+      $$exists = FALSE;
+      $patterns = '/d' . $version . '_' . $id . ':/';
+      $matches = preg_grep($patterns, array_keys($migrations));
+      foreach ($matches as $match) {
+        if ($migrations[$match]->getIdMap()->processedCount()) {
+          $$exists = TRUE;
+          break;
+        }
+      }
+    }
+    if ($node_exists && $node_master_exists) {
+      $use_master_node = NODE_MIGRATE_TYPE_BOTH;
+    }
+    if ($node_exists && !$node_master_exists) {
+      $use_master_node = NODE_MIGRATE_TYPE_NOT_MASTER;
+    }
+
+    // This might be a test environment so check if the 'node_migrate_master'
+    // test module is enabled.
+    if (!$node_exists && !$node_master_exists) {
+      if (!\Drupal::service('module_handler')->moduleExists('node_migrate_master')) {
+        $use_master_node = NODE_MIGRATE_TYPE_NOT_MASTER;
+      }
+    }
+    return $use_master_node;
+  }
+
 }
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeLookup.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeLookup.php
new file mode 100644
index 0000000000..898612c659
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeLookup.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\migrate_drupal\Plugin\migrate\process;
+
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+
+/**
+ * Returns only the nid from migration_lookup on node_master migration.
+ *
+ * When the source database has i18n enabled d7_node migrations are not run and
+ * when used in the migration process or dependencies they are replaced with the
+ * node_master migration. The node_master migration uses 3 source ids whereas
+ * the others use 1 source id. This is a quick fix to return only the first
+ * source id, which is the nid.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
+ *
+ * @MigrateProcessPlugin(
+ *   id = "node_master_node_lookup"
+ * )
+ */
+class NodeMasterNodeLookup extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (is_array($value) && count($value) === 3) {
+      return $value[0];
+    }
+    return $value;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeRevisionLookup.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeRevisionLookup.php
new file mode 100644
index 0000000000..b622827779
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeRevisionLookup.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\migrate_drupal\Plugin\migrate\process;
+
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+
+/**
+ * Returns only the vid from migration_lookup on node_master migration.
+ *
+ * When the source database has i18n enabled d7_node migrations are not run and
+ * when used in the migration process or dependencies they are replaced with the
+ * node_master migration. The node_master migration uses 3 source ids whereas
+ * the others use 1 source id. This is a quick fix to return only the first
+ * source id, which is the nid.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
+ *
+ * @MigrateProcessPlugin(
+ *   id = "node_master_node_revision_lookup"
+ * )
+ */
+class NodeMasterNodeRevisionLookup extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (is_array($value) && count($value) === 3) {
+      return $value[1];
+    }
+    return $value;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeTranslationLookup.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeTranslationLookup.php
new file mode 100644
index 0000000000..089c008aab
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeTranslationLookup.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\migrate_drupal\Plugin\migrate\process;
+
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+
+/**
+ * Returns nid and langcode from migration_lookup on node_master migration.
+ *
+ * When the source database has i18n enabled d7_node_translation migrations are
+ * not run and when used in the migration process or dependencies they are
+ * replaced with the node_master migration. The node_master migration uses 3
+ * source ids whereas the others use 1 source id. This is a quick fix to return
+ * only the nid and the langcode.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
+ *
+ * @MigrateProcessPlugin(
+ *   id = "node_master_node_translation_lookup"
+ * )
+ */
+class NodeMasterNodeTranslationLookup extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (is_array($value) && count($value) === 3) {
+      unset($value[1]);
+      return array_values($value);
+    }
+    return $value;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal6.php b/core/modules/migrate_drupal/tests/fixtures/drupal6.php
index ca641233d9..a6e4ab7610 100644
--- a/core/modules/migrate_drupal/tests/fixtures/drupal6.php
+++ b/core/modules/migrate_drupal/tests/fixtures/drupal6.php
@@ -44473,10 +44473,10 @@
   'vid' => '1',
   'type' => 'story',
   'language' => '',
-  'title' => 'Test title',
+  'title' => 'Test title rev 3',
   'uid' => '1',
   'status' => '1',
-  'created' => '1388271197',
+  'created' => '1390095702',
   'changed' => '1420861423',
   'comment' => '0',
   'promote' => '0',
@@ -44507,7 +44507,7 @@
   'vid' => '4',
   'type' => 'test_planet',
   'language' => '',
-  'title' => 'Test planet title 3',
+  'title' => 'Test page title rev 4',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -44524,7 +44524,7 @@
   'vid' => '6',
   'type' => 'test_planet',
   'language' => '',
-  'title' => '',
+  'title' => 'Node 4',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -44541,7 +44541,7 @@
   'vid' => '7',
   'type' => 'test_planet',
   'language' => '',
-  'title' => '',
+  'title' => 'Node 5',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -44558,7 +44558,7 @@
   'vid' => '8',
   'type' => 'test_planet',
   'language' => '',
-  'title' => '',
+  'title' => 'Node 6',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -44575,7 +44575,7 @@
   'vid' => '9',
   'type' => 'test_planet',
   'language' => '',
-  'title' => '',
+  'title' => 'Node 7',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -44592,7 +44592,7 @@
   'vid' => '10',
   'type' => 'test_planet',
   'language' => '',
-  'title' => '',
+  'title' => 'Node 8',
   'uid' => '1',
   'status' => '1',
   'created' => '1388271527',
@@ -45288,7 +45288,7 @@
   'body' => 'test',
   'teaser' => 'test',
   'log' => '',
-  'timestamp' => '1420861423',
+  'timestamp' => '1390095702',
   'format' => '1',
 ))
 ->values(array(
@@ -45317,10 +45317,10 @@
   'nid' => '1',
   'vid' => '5',
   'uid' => '1',
-  'title' => 'Test title rev 3',
-  'body' => 'body test rev 3',
-  'teaser' => 'teaser test rev 3',
-  'log' => 'modified rev 3',
+  'title' => 'Test title rev 2',
+  'body' => 'body test rev 2',
+  'teaser' => 'teaser test rev 2',
+  'log' => 'modified rev 2',
   'timestamp' => '1390095703',
   'format' => '1',
 ))
@@ -45526,11 +45526,11 @@
   'nid' => '1',
   'vid' => '2001',
   'uid' => '2',
-  'title' => 'Test title rev 2',
-  'body' => 'body test rev 2',
-  'teaser' => 'teaser test rev 2',
-  'log' => 'modified rev 2',
-  'timestamp' => '1390095702',
+  'title' => 'Test title rev 3',
+  'body' => 'body test rev 3',
+  'teaser' => 'teaser test rev 3',
+  'log' => 'modified rev 3',
+  'timestamp' => '1420861423',
   'format' => '1',
 ))
 ->values(array(
@@ -49670,29 +49670,29 @@
   'value' => 'i:0;',
 ))
 ->values(array(
-  'name' => 'i18n_newnode_current_employee',
+  'name' => 'i18n_lock_node_sponsor',
   'value' => 'i:0;',
 ))
 ->values(array(
-  'name' => 'i18n_node_employee',
-  'value' => 's:1:"1";',
-))
-->values(array(
-  'name' => 'i18n_required_node_employee',
+  'name' => 'i18n_newnode_current_employee',
   'value' => 'i:0;',
 ))
 ->values(array(
-  'name' => 'i18n_lock_node_sponsor',
+  'name' => 'i18n_newnode_current_sponsor',
   'value' => 'i:0;',
 ))
 ->values(array(
-  'name' => 'i18n_newnode_current_sponsor',
-  'value' => 'i:0;',
+  'name' => 'i18n_node_employee',
+  'value' => 's:1:"1";',
 ))
 ->values(array(
   'name' => 'i18n_node_sponsor',
   'value' => 'i:1;',
 ))
+->values(array(
+  'name' => 'i18n_required_node_employee',
+  'value' => 'i:0;',
+))
 ->values(array(
   'name' => 'i18n_required_node_sponsor',
   'value' => 'i:0;',
diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal7.php b/core/modules/migrate_drupal/tests/fixtures/drupal7.php
index 905c9ee32d..8e4bc01ea1 100644
--- a/core/modules/migrate_drupal/tests/fixtures/drupal7.php
+++ b/core/modules/migrate_drupal/tests/fixtures/drupal7.php
@@ -5089,7 +5089,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'body_value' => "...is that it's the absolute best show ever. Trust me, I would know.",
@@ -5101,7 +5101,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'body_value' => "is - ...is that it's the absolute best show ever. Trust me, I would know.",
@@ -6945,23 +6945,23 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_link_url' => '<front>',
-  'field_link_title' => 'Home',
-  'field_link_attributes' => 'a:0:{}',
+  'field_link_title' => NULL,
+  'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
 ))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_link_url' => '<front>',
-  'field_link_title' => 'Home',
+  'field_link_title' => NULL,
   'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
 ))
 ->execute();
@@ -7573,7 +7573,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '5',
@@ -7583,7 +7583,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '4',
@@ -7593,7 +7593,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '4',
-  'revision_id' => '4',
+  'revision_id' => '13',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '3',
@@ -7603,7 +7603,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '5',
-  'revision_id' => '5',
+  'revision_id' => '14',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '2',
@@ -7709,7 +7709,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '5',
@@ -7719,7 +7719,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '4',
@@ -7729,7 +7729,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '4',
-  'revision_id' => '4',
+  'revision_id' => '13',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '3',
@@ -7739,7 +7739,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '5',
-  'revision_id' => '5',
+  'revision_id' => '14',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '2',
@@ -7822,7 +7822,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_tags_tid' => '9',
@@ -7832,7 +7832,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_tags_tid' => '9',
@@ -7842,7 +7842,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '1',
   'field_tags_tid' => '14',
@@ -7852,7 +7852,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '1',
   'field_tags_tid' => '14',
@@ -7862,7 +7862,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '2',
   'field_tags_tid' => '17',
@@ -7872,7 +7872,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '2',
   'field_tags_tid' => '17',
@@ -8530,6 +8530,63 @@
   ),
   'mysql_character_set' => 'utf8',
 ));
+$connection->insert('field_data_field_text_long_plain')
+->fields(array(
+  'entity_type',
+  'bundle',
+  'deleted',
+  'entity_id',
+  'revision_id',
+  'language',
+  'delta',
+  'field_text_long_plain_value',
+  'field_text_long_plain_format',
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'DS9 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'is - DS9 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '4',
+  'revision_id' => '13',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'is - Firefly 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '5',
+  'revision_id' => '14',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'Firefly 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->execute();
 
 $connection->schema()->createTable('field_data_field_text_long_plain_filtered', array(
   'fields' => array(
@@ -8730,7 +8787,7 @@
     'bundle' => 'article',
     'deleted' => '0',
     'entity_id' => '2',
-    'revision_id' => '2',
+    'revision_id' => '11',
     'language' => 'und',
     'delta' => '0',
     'field_text_plain_value' => 'Kai Opaka',
@@ -8741,7 +8798,7 @@
     'bundle' => 'article',
     'deleted' => '0',
     'entity_id' => '3',
-    'revision_id' => '3',
+    'revision_id' => '12',
     'language' => 'und',
     'delta' => '0',
     'field_text_plain_value' => 'Kai Opaka',
@@ -9333,7 +9390,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_fixed_tid' => '24',
@@ -9439,7 +9496,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
@@ -9449,7 +9506,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
@@ -9555,7 +9612,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_translate_tid' => '21',
@@ -9565,7 +9622,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_translate_tid' => '23',
@@ -10215,6 +10272,18 @@
   'body_summary' => '',
   'body_format' => 'filtered_html',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'body_value' => "...is that it's the absolute best show ever. Trust me, I would know.",
+  'body_summary' => '',
+  'body_format' => 'filtered_html',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -10231,11 +10300,11 @@
   'entity_type' => 'node',
   'bundle' => 'article',
   'deleted' => '0',
-  'entity_id' => '4',
-  'revision_id' => '4',
+  'entity_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
-  'body_value' => 'is - Is that is it awesome.',
+  'body_value' => "is - ...is that it's the absolute best show ever. Trust me, I would know.",
   'body_summary' => '',
   'body_format' => 'filtered_html',
 ))
@@ -10243,11 +10312,11 @@
   'entity_type' => 'node',
   'bundle' => 'article',
   'deleted' => '0',
-  'entity_id' => '5',
-  'revision_id' => '5',
+  'entity_id' => '4',
+  'revision_id' => '4',
   'language' => 'und',
   'delta' => '0',
-  'body_value' => 'en - Is that is it awesome.',
+  'body_value' => 'is - Is that is it awesome.',
   'body_summary' => '',
   'body_format' => 'filtered_html',
 ))
@@ -12099,8 +12168,20 @@
   'language' => 'und',
   'delta' => '0',
   'field_link_url' => '<front>',
+  'field_link_title' => 'Home;',
+  'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_link_url' => '<front>',
   'field_link_title' => 'Home',
-  'field_link_attributes' => 'a:0:{}',
+  'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
 ))
 ->values(array(
   'entity_type' => 'node',
@@ -12114,6 +12195,18 @@
   'field_link_title' => 'Home',
   'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_link_url' => '<front>',
+  'field_link_title' => 'Home',
+  'field_link_attributes' => 'a:1:{s:5:"title";s:0:"";}',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_long_text', array(
   'fields' => array(
@@ -12744,6 +12837,16 @@
   'delta' => '0',
   'field_reference_target_id' => '5',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_target_id' => '5',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12754,6 +12857,16 @@
   'delta' => '0',
   'field_reference_target_id' => '4',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_target_id' => '4',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12764,6 +12877,16 @@
   'delta' => '0',
   'field_reference_target_id' => '3',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '4',
+  'revision_id' => '13',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_target_id' => '3',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12774,6 +12897,16 @@
   'delta' => '0',
   'field_reference_target_id' => '2',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '5',
+  'revision_id' => '14',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_target_id' => '2',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_reference_2', array(
   'fields' => array(
@@ -12881,6 +13014,16 @@
   'delta' => '0',
   'field_reference_2_target_id' => '5',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_2_target_id' => '5',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12891,6 +13034,16 @@
   'delta' => '0',
   'field_reference_2_target_id' => '4',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_2_target_id' => '4',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12901,6 +13054,16 @@
   'delta' => '0',
   'field_reference_2_target_id' => '3',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '4',
+  'revision_id' => '13',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_2_target_id' => '3',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12911,6 +13074,16 @@
   'delta' => '0',
   'field_reference_2_target_id' => '2',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '5',
+  'revision_id' => '14',
+  'language' => 'und',
+  'delta' => '0',
+  'field_reference_2_target_id' => '2',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_tags', array(
   'fields' => array(
@@ -12985,6 +13158,16 @@
   'delta',
   'field_tags_tid',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_tags_tid' => '9',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -12995,6 +13178,16 @@
   'delta' => '0',
   'field_tags_tid' => '9',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_tags_tid' => '9',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -13005,6 +13198,16 @@
   'delta' => '0',
   'field_tags_tid' => '9',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '1',
+  'field_tags_tid' => '14',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -13015,6 +13218,16 @@
   'delta' => '1',
   'field_tags_tid' => '14',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '1',
+  'field_tags_tid' => '14',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -13035,6 +13248,16 @@
   'delta' => '2',
   'field_tags_tid' => '17',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '2',
+  'field_tags_tid' => '17',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -13045,6 +13268,16 @@
   'delta' => '2',
   'field_tags_tid' => '17',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '2',
+  'field_tags_tid' => '17',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_term_entityreference', array(
   'fields' => array(
@@ -13705,6 +13938,96 @@
   ),
   'mysql_character_set' => 'utf8',
 ));
+$connection->insert('field_revision_field_text_long_plain')
+->fields(array(
+  'entity_type',
+  'bundle',
+  'deleted',
+  'entity_id',
+  'revision_id',
+  'language',
+  'delta',
+  'field_text_long_plain_value',
+  'field_text_long_plain_format',
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '2',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'DS9 1st rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'DS9 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '3',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'is - DS9 1st rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'is - DS9 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '4',
+  'revision_id' => '13',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'is - Firefly 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '5',
+  'revision_id' => '5',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'Firefly 1st rev',
+  'field_text_long_plain_format' => NULL,
+))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '5',
+  'revision_id' => '14',
+  'language' => 'und',
+  'delta' => '0',
+  'field_text_long_plain_value' => 'Firefly 2nd rev',
+  'field_text_long_plain_format' => NULL,
+))
+->execute();
 
 $connection->schema()->createTable('field_revision_field_text_long_plain_filtered', array(
   'fields' => array(
@@ -13906,7 +14229,7 @@
     'bundle' => 'article',
     'deleted' => '0',
     'entity_id' => '2',
-    'revision_id' => '2',
+    'revision_id' => '11',
     'language' => 'und',
     'delta' => '0',
     'field_text_plain_value' => 'Kai Opaka',
@@ -13917,7 +14240,7 @@
     'bundle' => 'article',
     'deleted' => '0',
     'entity_id' => '3',
-    'revision_id' => '3',
+    'revision_id' => '12',
     'language' => 'und',
     'delta' => '0',
     'field_text_plain_value' => 'Kai Opaka',
@@ -14498,6 +14821,16 @@
   'delta' => '0',
   'field_vocab_fixed_tid' => '24',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_vocab_fixed_tid' => '24',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_vocab_localize', array(
   'fields' => array(
@@ -14605,6 +14938,16 @@
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_vocab_localize_tid' => '20',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -14615,6 +14958,16 @@
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_vocab_localize_tid' => '20',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_field_vocab_translate', array(
   'fields' => array(
@@ -14722,6 +15075,16 @@
   'delta' => '0',
   'field_vocab_translate_tid' => '21',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '2',
+  'revision_id' => '11',
+  'language' => 'und',
+  'delta' => '0',
+  'field_vocab_translate_tid' => '21',
+))
 ->values(array(
   'entity_type' => 'node',
   'bundle' => 'article',
@@ -14732,6 +15095,16 @@
   'delta' => '0',
   'field_vocab_translate_tid' => '23',
 ))
+->values(array(
+  'entity_type' => 'node',
+  'bundle' => 'article',
+  'deleted' => '0',
+  'entity_id' => '3',
+  'revision_id' => '12',
+  'language' => 'und',
+  'delta' => '0',
+  'field_vocab_translate_tid' => '23',
+))
 ->execute();
 $connection->schema()->createTable('field_revision_name_field', array(
   'fields' => array(
@@ -40628,14 +41001,14 @@
 ))
 ->values(array(
   'nid' => '2',
-  'vid' => '2',
+  'vid' => '11',
   'type' => 'article',
   'language' => 'en',
   'title' => 'The thing about Deep Space 9',
   'uid' => '2',
   'status' => '1',
   'created' => '1441306772',
-  'changed' => '1441306832',
+  'changed' => '1564543637',
   'comment' => '2',
   'promote' => '1',
   'sticky' => '0',
@@ -40644,14 +41017,14 @@
 ))
 ->values(array(
   'nid' => '3',
-  'vid' => '3',
+  'vid' => '12',
   'type' => 'article',
   'language' => 'is',
   'title' => 'is - The thing about Deep Space 9',
   'uid' => '1',
   'status' => '1',
   'created' => '1471428152',
-  'changed' => '1471428152',
+  'changed' => '1564543706',
   'comment' => '2',
   'promote' => '1',
   'sticky' => '0',
@@ -40660,14 +41033,14 @@
 ))
 ->values(array(
   'nid' => '4',
-  'vid' => '4',
+  'vid' => '13',
   'type' => 'article',
   'language' => 'is',
   'title' => 'is - The thing about Firefly',
   'uid' => '1',
   'status' => '1',
   'created' => '1478755274',
-  'changed' => '1478755274',
+  'changed' => '1564543810',
   'comment' => '1',
   'promote' => '1',
   'sticky' => '0',
@@ -40676,14 +41049,14 @@
 ))
 ->values(array(
   'nid' => '5',
-  'vid' => '5',
+  'vid' => '14',
   'type' => 'article',
   'language' => 'en',
   'title' => 'en - The thing about Firefly',
   'uid' => '1',
   'status' => '1',
   'created' => '1478755314',
-  'changed' => '1478755314',
+  'changed' => '1564543929',
   'comment' => '1',
   'promote' => '1',
   'sticky' => '0',
@@ -41145,9 +41518,9 @@
   'nid' => '2',
   'vid' => '2',
   'uid' => '1',
-  'title' => 'The thing about Deep Space 9',
-  'log' => '',
-  'timestamp' => '1441306832',
+  'title' => 'The thing about Deep Space 9 (1st rev)',
+  'log' => 'DS9 1st rev',
+  'timestamp' => '1564543588',
   'status' => '1',
   'comment' => '2',
   'promote' => '1',
@@ -41157,9 +41530,9 @@
   'nid' => '3',
   'vid' => '3',
   'uid' => '1',
-  'title' => 'is - The thing about Deep Space 9',
-  'log' => '',
-  'timestamp' => '1471428152',
+  'title' => 'is - The thing about Deep Space 9 (1st rev)',
+  'log' => 'is - DS9 1st rev',
+  'timestamp' => '1564543677',
   'status' => '1',
   'comment' => '2',
   'promote' => '1',
@@ -41169,8 +41542,8 @@
   'nid' => '4',
   'vid' => '4',
   'uid' => '1',
-  'title' => 'is - The thing about Firefly',
-  'log' => '',
+  'title' => 'is - The thing about Firefly (1st rev)',
+  'log' => 'is - Firefly 1st rev',
   'timestamp' => '1478755274',
   'status' => '1',
   'comment' => '1',
@@ -41181,9 +41554,9 @@
   'nid' => '5',
   'vid' => '5',
   'uid' => '1',
-  'title' => 'en - The thing about Firefly',
-  'log' => '',
-  'timestamp' => '1478755314',
+  'title' => 'en - The thing about Firefly (1st rev)',
+  'log' => 'Firefly 1st rev',
+  'timestamp' => '1564543887',
   'status' => '1',
   'comment' => '1',
   'promote' => '1',
@@ -41249,6 +41622,54 @@
   'promote' => '1',
   'sticky' => '0',
 ))
+->values(array(
+  'nid' => '2',
+  'vid' => '11',
+  'uid' => '1',
+  'title' => 'The thing about Deep Space 9',
+  'log' => 'DS9 2nd rev',
+  'timestamp' => '1564543637',
+  'status' => '1',
+  'comment' => '2',
+  'promote' => '1',
+  'sticky' => '0',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '12',
+  'uid' => '1',
+  'title' => 'is - The thing about Deep Space 9',
+  'log' => 'is - DS9 2nd rev',
+  'timestamp' => '1564543706',
+  'status' => '1',
+  'comment' => '2',
+  'promote' => '1',
+  'sticky' => '0',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '13',
+  'uid' => '1',
+  'title' => 'is - The thing about Firefly',
+  'log' => 'is - Firefly 2nd rev',
+  'timestamp' => '1564543810',
+  'status' => '1',
+  'comment' => '1',
+  'promote' => '1',
+  'sticky' => '0',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '14',
+  'uid' => '1',
+  'title' => 'en - The thing about Firefly',
+  'log' => 'Firefly 2nd rev',
+  'timestamp' => '1564543929',
+  'status' => '1',
+  'comment' => '1',
+  'promote' => '1',
+  'sticky' => '0',
+))
 ->execute();
 $connection->schema()->createTable('node_type', array(
   'fields' => array(
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 5225ce5d83..acb3d0e156 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsTest.php
@@ -31,15 +31,32 @@ protected function setUp() {
     $this->executeMigrations([
       'language',
       'd6_language_content_settings',
+    ]);
+  }
+
+  /**
+   * Test entity reference translations using d6_node and d6_node_translation.
+   */
+  public function testEntityReferenceTranslations() {
+    $this->executeMigrations([
       'd6_node',
       'd6_node_translation',
     ]);
+    $this->entityTranslationTest();
+  }
+
+  /**
+   * Test entity reference translations using d6_node_master migration.
+   */
+  public function testEntityReferenceTranslationsNodeMaster() {
+    $this->executeMigrations(['d6_node_master']);
+    $this->entityTranslationTest();
   }
 
   /**
    * Test entity reference translations.
    */
-  public function testEntityReferenceTranslations() {
+  public function entityTranslationTest() {
     // Test the entity reference field before the follow-up migrations.
     $node = Node::load(10);
     $this->assertSame('13', $node->get('field_reference')->target_id);
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php
index a02853f6e1..6aefe5d864 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php
@@ -135,6 +135,7 @@ function (AuditResult $result) {
       'd6_file',
       'd6_menu_links',
       'd6_node',
+      'd6_node_master',
       'd6_node_revision',
       'd6_taxonomy_term',
       'd6_term_node_revision',
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 b99f40393d..02bd253a6b 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsTest.php
@@ -50,8 +50,6 @@ protected function setUp() {
       'language',
       'd7_language_content_settings',
       'd7_taxonomy_vocabulary',
-      'd7_node',
-      'd7_node_translation',
     ]);
   }
 
@@ -68,9 +66,28 @@ protected function getFileMigrationInfo() {
   }
 
   /**
-   * Test entity reference translations.
+   * Test entity reference translations using d7_node and d7_node_translation.
    */
   public function testEntityReferenceTranslations() {
+    $this->executeMigrations([
+      'd7_node',
+      'd7_node_translation',
+    ]);
+    $this->entityTranslationTest();
+  }
+
+  /**
+   * Test entity reference translations using d7_node_master migration.
+   */
+  public function testEntityReferenceTranslationsNodeMaster() {
+    $this->executeMigrations(['d7_node_master']);
+    $this->entityTranslationTest();
+  }
+
+  /**
+   * Test entity reference translations.
+   */
+  public function entityTranslationTest() {
     // Test the entity reference field before the follow-up migrations.
     $node = Node::load(2);
     $this->assertSame('5', $node->get('field_reference')->target_id);
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php
index 1693ce1623..0061ee210d 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php
@@ -135,6 +135,7 @@ function (AuditResult $result) {
       'd7_file_private',
       'd7_menu_links',
       'd7_node',
+      'd7_node_master',
       'd7_node_revision',
       'd7_taxonomy_term',
       'd7_user',
diff --git a/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php b/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php
index ec58b94081..5993571b7b 100644
--- a/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\migrate_drupal_ui\Form;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\migrate\Audit\AuditResult;
 use Drupal\migrate\Audit\IdAuditor;
 use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
 
@@ -40,6 +41,51 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
     $results = (new IdAuditor())->auditMultiple($migrations);
 
+    // If dN_node_master migration is being used get the audit results for node
+    // revisions manually. We need to do this manually because the node master
+    // map has the ids for both nodes and revisions and Sql::getHighestId()
+    // only returns the highest migrated ID of the destination entity type,
+    // which for node_master is node.
+    $migration_plugin_manager = \Drupal::service('plugin.manager.migration');
+    foreach ($migrations as $migration) {
+      $migration_id = $migration->getPluginId();
+      if (preg_match('/node_master/', $migration_id) === 1) {
+        $map_table = $migration->getIdMap()->mapTableName();
+
+        $database = \Drupal::database();
+        if (!$database->schema()->tableExists($map_table)) {
+          continue;
+        }
+        // Get highest migrated node revision id.
+        $query = $database->select($map_table, 'map')
+          ->fields('map', ['destid2'])
+          ->range(0, 1)
+          ->orderBy('destid2', 'DESC');
+        $ids[] = $query->execute()->fetchField();
+        $max = (int) (max($ids));
+
+        // Make a migration based on node_master but with and entity_revision
+        // destination.
+        $revision_migration = $migration->getPluginDefinition();
+        $revision_migration['id'] = $migration->getPluginId() . '-revision';
+        $revision_migration['destination']['plugin'] = 'entity_revision:node';
+        $revision_migration = $migration_plugin_manager->createStubMigration($revision_migration);
+
+        // Get the highest node revision id.
+        $destination = $revision_migration->getDestinationPlugin();
+        $highest = $destination->getHighestId();
+
+        if ($highest > $max) {
+          $results[$migration_id . '-revision'] = AuditResult::fail($revision_migration, [
+            $this->t('The destination system contains data which was not created by a migration.'),
+          ]);
+        }
+        else {
+          $results[$migration_id . '-revision'] = AuditResult::pass($revision_migration);
+        }
+      }
+    }
+
     /** @var \Drupal\migrate\Audit\AuditResult $result */
     foreach ($results as $result) {
       $destination = $result->getMigration()->getDestinationPlugin();
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
index 7038e7b378..7cb4ee2743 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
@@ -112,8 +112,6 @@ public function testMigrateUpgradeExecute() {
       'file',
       'taxonomy_term',
       'user',
-      'comment',
-      'node',
     ];
     $this->assertIdConflict($session, $entity_types);
 
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
index db75e036a8..0a406c6850 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
@@ -196,12 +196,13 @@ protected function assertReviewPage(WebAssert $session, array $available_paths,
    * @param array $entity_types
    *   An array of entity types
    */
-  protected function assertIdConflict(WebAssert $session, $entity_types) {
+  protected function assertIdConflict(WebAssert $session, array $entity_types) {
     /** @var \Drupal\ $entity_type_manager */
     $entity_type_manager = \Drupal::service('entity_type.manager');
 
     $session->pageTextContains('WARNING: Content may be overwritten on your new site.');
     $session->pageTextContains('There is conflicting content of these types:');
+    $this->assertNotEmpty($entity_types, 'No entity types provided to \Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeTestBase::assertIdConflict()');
     foreach ($entity_types as $entity_type) {
       $label = $entity_type_manager->getDefinition($entity_type)->getPluralLabel();
       $session->pageTextContains($label);
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/IdConflictTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/IdConflictTest.php
new file mode 100644
index 0000000000..5b04c66e9a
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/IdConflictTest.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Functional\d6;
+
+use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeExecuteTestBase;
+
+/**
+ * Tests Drupal 6 Id Conflict page.
+ *
+ * The test method is provided by the MigrateUpgradeTestBase class.
+ *
+ * @group migrate_drupal_ui
+ * @group legacy
+ */
+class IdConflictTest extends MigrateUpgradeExecuteTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'language',
+    'content_translation',
+    'config_translation',
+    'migrate_drupal_ui',
+    'telephone',
+    'aggregator',
+    'book',
+    'forum',
+    'statistics',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
+
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * {@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() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCountsIncremental() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAvailablePaths() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getMissingPaths() {
+  }
+
+  /**
+   * Executes all steps of migrations upgrade.
+   */
+  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.');
+
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+    $session->fieldExists('mysql[host]');
+
+    $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,
+      'source_private_file_path' => $this->getSourceBasePath(),
+      'version' => $version,
+    ];
+    if ($version == 6) {
+      $edit['d6_source_base_path'] = $this->getSourceBasePath();
+    }
+    else {
+      $edit['source_base_path'] = $this->getSourceBasePath();
+    }
+    if (count($drivers) !== 1) {
+      $edit['driver'] = $driver;
+    }
+    $edits = $this->translatePostValues($edit);
+
+    // Start the upgrade process.
+    $this->drupalGet('/upgrade');
+    $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.');
+
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+    $session->fieldExists('mysql[host]');
+
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $entity_types = [
+      'block_content',
+      'menu_link_content',
+      'file',
+      'taxonomy_term',
+      'user',
+      'comment',
+      'node',
+    ];
+    $this->assertIdConflict($session, $entity_types);
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/Upgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/Upgrade6Test.php
index 0731f12aff..0f4607aa30 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/Upgrade6Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/Upgrade6Test.php
@@ -35,13 +35,26 @@ class Upgrade6Test extends MigrateUpgradeExecuteTestBase {
     'migration_provider_test',
     // Required for translation migrations.
     'migrate_drupal_multilingual',
+    'node_migrate_master',
   ];
 
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
   /**
    * {@inheritdoc}
    */
   protected function setUp() {
     parent::setUp();
+
+    $this->nodeStorage = $this->container->get('entity_type.manager')
+      ->getStorage('node');
+    $this->nodeStorage->delete($this->nodeStorage->loadMultiple());
+
     $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal6.php');
   }
 
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/IdConflictTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/IdConflictTest.php
new file mode 100644
index 0000000000..c0ce31dcea
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/IdConflictTest.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Functional\d7;
+
+use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeExecuteTestBase;
+
+/**
+ * Tests Drupal 7 Id Conflict page.
+ *
+ * The test method is provided by the MigrateUpgradeTestBase class.
+ *
+ * @group migrate_drupal_ui
+ * @group legacy
+ */
+class IdConflictTest extends MigrateUpgradeExecuteTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'file',
+    'language',
+    'config_translation',
+    'content_translation',
+    'migrate_drupal_ui',
+    'telephone',
+    'aggregator',
+    'book',
+    'forum',
+    'rdf',
+    'statistics',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
+
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * {@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() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCountsIncremental() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAvailablePaths() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getMissingPaths() {
+  }
+
+  /**
+   * Executes all steps of migrations upgrade.
+   */
+  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.');
+
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+    $session->fieldExists('mysql[host]');
+
+    $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,
+      'source_private_file_path' => $this->getSourceBasePath(),
+      'version' => $version,
+    ];
+    if ($version == 6) {
+      $edit['d6_source_base_path'] = $this->getSourceBasePath();
+    }
+    else {
+      $edit['source_base_path'] = $this->getSourceBasePath();
+    }
+    if (count($drivers) !== 1) {
+      $edit['driver'] = $driver;
+    }
+    $edits = $this->translatePostValues($edit);
+
+    // Start the upgrade process.
+    $this->drupalGet('/upgrade');
+    $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.');
+
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $session->pageTextContains('Provide credentials for the database of the Drupal site you want to upgrade.');
+    $session->fieldExists('mysql[host]');
+
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $entity_types = [
+      'block_content',
+      'menu_link_content',
+      'file',
+      'taxonomy_term',
+      'user',
+      'comment',
+      'node',
+    ];
+    $this->assertIdConflict($session, $entity_types);
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
index 4cf61aea55..e5fc13f76a 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
@@ -37,13 +37,25 @@ class Upgrade7Test extends MigrateUpgradeExecuteTestBase {
     'migration_provider_test',
     // Required for translation migrations.
     'migrate_drupal_multilingual',
+    'node_migrate_master',
   ];
 
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
   /**
    * {@inheritdoc}
    */
   protected function setUp() {
     parent::setUp();
+    $this->nodeStorage = $this->container->get('entity_type.manager')
+      ->getStorage('node');
+    $this->nodeStorage->delete($this->nodeStorage->loadMultiple());
+
     $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal7.php');
   }
 
@@ -79,7 +91,7 @@ protected function getEntityCounts() {
       'file' => 3,
       'filter_format' => 7,
       'image_style' => 6,
-      'language_content_settings' => 18,
+      'language_content_settings' => 17,
       'node' => 6,
       'node_type' => 6,
       'rdf_mapping' => 8,
@@ -90,7 +102,7 @@ protected function getEntityCounts() {
       'menu' => 6,
       'taxonomy_term' => 24,
       'taxonomy_vocabulary' => 7,
-      'path_alias' => 8,
+      'path_alias' => 6,
       'tour' => 5,
       'user' => 4,
       'user_role' => 3,
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/NodeMaster.php b/core/modules/node/src/Plugin/migrate/source/d6/NodeMaster.php
new file mode 100644
index 0000000000..bdce7839f6
--- /dev/null
+++ b/core/modules/node/src/Plugin/migrate/source/d6/NodeMaster.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Drupal\node\Plugin\migrate\source\d6;
+
+/**
+ * Gets all node revisions from the source, including translation revisions.
+ *
+ * @MigrateSource(
+ *   id = "d6_node_master",
+ *   source_module = "node"
+ * )
+ */
+class NodeMaster extends NodeRevision {
+
+  /**
+   * The join options between the node and the node_revisions_table.
+   */
+  const JOIN = 'n.nid = nr.nid';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = parent::query();
+    $query->orderBy('nr.vid');
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return [
+      'nid' => [
+        'type' => 'integer',
+        'alias' => 'n',
+      ],
+      'vid' => [
+        'type' => 'integer',
+        'alias' => 'nr',
+      ],
+      'language' => [
+        'type' => 'string',
+        'alias' => 'n',
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/node/src/Plugin/migrate/source/d7/NodeMaster.php b/core/modules/node/src/Plugin/migrate/source/d7/NodeMaster.php
new file mode 100644
index 0000000000..4272fd9762
--- /dev/null
+++ b/core/modules/node/src/Plugin/migrate/source/d7/NodeMaster.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\node\Plugin\migrate\source\d7;
+
+use Drupal\Core\Database\Query\SelectInterface;
+
+/**
+ * Gets all node revisions from the source, including translation revisions.
+ *
+ * @MigrateSource(
+ *   id = "d7_node_master",
+ *   source_module = "node"
+ * )
+ */
+class NodeMaster extends NodeRevision {
+
+  /**
+   * The join options between the node and the node_revisions_table.
+   */
+  const JOIN = 'n.nid = nr.nid';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = parent::query();
+    $query->orderBy('nr.vid');
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return [
+      'nid' => [
+        'type' => 'integer',
+        'alias' => 'n',
+      ],
+      'vid' => [
+        'type' => 'integer',
+        'alias' => 'nr',
+      ],
+      'language' => [
+        'type' => 'string',
+        'alias' => 'n',
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function handleTranslations(SelectInterface $query) {}
+
+}
diff --git a/core/modules/node/tests/modules/node_migrate_master/node_migrate_master.info.yml b/core/modules/node/tests/modules/node_migrate_master/node_migrate_master.info.yml
new file mode 100644
index 0000000000..480810f266
--- /dev/null
+++ b/core/modules/node/tests/modules/node_migrate_master/node_migrate_master.info.yml
@@ -0,0 +1,7 @@
+name: Node migrate master
+type: module
+description: Use the master node migrations.
+package: Testing
+version: VERSION
+core: 8.x
+hidden: true
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeMasterTest.php b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeMasterTest.php
new file mode 100644
index 0000000000..133b7ded03
--- /dev/null
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeMasterTest.php
@@ -0,0 +1,1257 @@
+<?php
+
+namespace Drupal\Tests\node\Kernel\Migrate\d6;
+
+use Drupal\migrate\Audit\IdAuditor;
+use Drupal\node\NodeInterface;
+use Drupal\Tests\file\Kernel\Migrate\d6\FileMigrationTestTrait;
+use Drupal\Tests\migrate_drupal\Traits\CreateTestContentEntitiesTrait;
+
+/**
+ * Test class for a master node migration for Drupal 6.
+ *
+ * @group migrate_drupal_6
+ */
+class MigrateNodeMasterTest extends MigrateNodeTestBase {
+
+  use FileMigrationTestTrait;
+  use CreateTestContentEntitiesTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'language',
+    'content_translation',
+    'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+  ];
+
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->setUpMigratedFiles();
+
+    // Create content.
+    $this->createContent();
+
+    $this->nodeStorage = $this->container->get('entity_type.manager')
+      ->getStorage('node');
+    $this->nodeStorage->delete($this->nodeStorage->loadMultiple());
+
+    $this->installSchema('file', ['file_usage']);
+    $this->executeMigrations([
+      'language',
+      'd6_language_content_settings',
+      'd6_node_master',
+    ]);
+  }
+
+  /**
+   * Tests the master node migration.
+   */
+  public function testNodeMasterMigration() {
+    $migration = \Drupal::service('plugin.manager.migration')->createInstances('d6_node_master');
+    $result = (new IdAuditor())->auditMultiple($migration);
+
+    $db = \Drupal::database();
+    $this->assertEquals($this->expectedNodeFieldRevisionTable(), $db->select('node_field_revision', 'nr')
+      ->fields('nr')
+      ->execute()
+      ->fetchAll(\PDO::FETCH_ASSOC));
+    $this->assertEquals($this->expectedNodeFieldDataTable(), $db->select('node_field_data', 'nr')
+      ->fields('nr')
+      ->execute()
+      ->fetchAll(\PDO::FETCH_ASSOC));
+
+    // Now load and test each revision, including the field 'field_text_plain'
+    // which has text reflecting the revision.
+    $data = $this->expectedRevisionEntityData()[0];
+    foreach ($this->expectedNodeFieldRevisionTable() as $key => $revision) {
+      $this->assertRevision($revision, $data[$key]);
+    }
+  }
+
+  /**
+   * Asserts various aspects of a node revision.
+   *
+   * @param array $revision
+   *   An array of revision data matching database table node_field_revision.
+   * @param array $data
+   *   An array of revision data.
+   */
+  protected function assertRevision(array $revision, array $data) {
+    /* @var  \Drupal\node\NodeInterface $actual */
+    $actual = $this->nodeStorage->loadRevision($revision['vid'])
+      ->getTranslation($revision['langcode']);
+    $this->assertInstanceOf(NodeInterface::class, $actual);
+    $this->assertSame($revision['title'], $actual->getTitle(), sprintf("Title '%s' does not match actual '%s' for revision '%d' langcode '%s'", $revision['title'], $actual->getTitle(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($revision['revision_translation_affected'], $actual->get('revision_translation_affected')->value, sprintf("revision_translation_affected '%s' does not match actual '%s' for revision '%d' langcode '%s'", $revision['revision_translation_affected'], $actual->get('revision_translation_affected')->value, $revision['vid'], $revision['langcode']));
+
+    $this->assertSame($data['created'], $actual->getRevisionCreationTime(), sprintf("Creation time '%s' does not match actual '%s' for revision '%d' langcode '%s'", $data['created'], $actual->getRevisionCreationTime(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($data['changed'], $actual->getChangedTime(), sprintf("Changed time '%s' does not match actual '%s' for revision '%d' langcode '%s'", $data['changed'], $actual->getChangedTime(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($data['log'], $actual->getRevisionLogMessage(), sprintf("Revision log '%s' does not match actual '%s' for revision '%d' langcode '%s'", var_export($data['log'], TRUE), $actual->getRevisionLogMessage(), $revision['vid'], $revision['langcode']));
+  }
+
+  /**
+   * Provides the expected node_field_data table.
+   *
+   * @return array
+   *   The table.
+   */
+  protected function expectedNodeFieldDataTable() {
+    return [
+      0 =>
+        [
+          'nid' => '1',
+          'vid' => '2001',
+          'type' => 'story',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title rev 3',
+          'created' => '1390095702',
+          'changed' => '1420861423',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      1 =>
+        [
+          'nid' => '2',
+          'vid' => '3',
+          'type' => 'story',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title rev 3',
+          'created' => '1388271197',
+          'changed' => '1420718386',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      2 =>
+        [
+          'nid' => '3',
+          'vid' => '4',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test page title rev 4',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      3 =>
+        [
+          'nid' => '4',
+          'vid' => '6',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 4',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      4 =>
+        [
+          'nid' => '5',
+          'vid' => '7',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 5',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      5 =>
+        [
+          'nid' => '6',
+          'vid' => '8',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 6',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      6 =>
+        [
+          'nid' => '7',
+          'vid' => '9',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 7',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      7 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'type' => 'test_planet',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 8',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      8 =>
+        [
+          'nid' => '9',
+          'vid' => '12',
+          'type' => 'story',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Once upon a time',
+          'created' => '1444671588',
+          'changed' => '1444671588',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      9 =>
+        [
+          'nid' => '10',
+          'vid' => '14',
+          'type' => 'page',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Real McCoy',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      10 =>
+        [
+          'nid' => '10',
+          'vid' => '14',
+          'type' => 'page',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Le Vrai McCoy',
+          'created' => '1444239050',
+          'changed' => '1444239050',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      11 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'type' => 'page',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Zulu People',
+          'created' => '1444239050',
+          'changed' => '1444239050',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      12 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'type' => 'page',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Le peuple zoulou',
+          'created' => '1520613038',
+          'changed' => '1520613305',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      13 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'type' => 'page',
+          'langcode' => 'zu',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Abantu zulu',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      14 =>
+        [
+          'nid' => '14',
+          'vid' => '17',
+          'type' => 'company',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'United Federation of Planets',
+          'created' => '1493066668',
+          'changed' => '1493066668',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      15 =>
+        [
+          'nid' => '15',
+          'vid' => '18',
+          'type' => 'company',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Klingon Empire',
+          'created' => '1493066677',
+          'changed' => '1493066677',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      16 =>
+        [
+          'nid' => '16',
+          'vid' => '19',
+          'type' => 'company',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Romulan Empire',
+          'created' => '1493066684',
+          'changed' => '1493066684',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      17 =>
+        [
+          'nid' => '17',
+          'vid' => '20',
+          'type' => 'company',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Ferengi Commerce Authority',
+          'created' => '1493066693',
+          'changed' => '1493066693',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      18 =>
+        [
+          'nid' => '18',
+          'vid' => '21',
+          'type' => 'employee',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Ambassador Sarek',
+          'created' => '1493066711',
+          'changed' => '1494966544',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      19 =>
+        [
+          'nid' => '19',
+          'vid' => '22',
+          'type' => 'forum',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'New Forum Topic',
+          'created' => '1501955771',
+          'changed' => '1501955771',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      20 =>
+        [
+          'nid' => '21',
+          'vid' => '2003',
+          'type' => 'employee',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'John Smith - EN',
+          'created' => '1534014650',
+          'changed' => '1534014650',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      21 =>
+        [
+          'nid' => '21',
+          'vid' => '2003',
+          'type' => 'employee',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'John Smith - FR',
+          'created' => '1534014687',
+          'changed' => '1534014687',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+    ];
+  }
+
+  /**
+   * Provides the expected node_field_revision table.
+   *
+   * @return array
+   *   The table.
+   */
+  protected function expectedNodeFieldRevisionTable() {
+    return [
+      0 =>
+        [
+          'nid' => '1',
+          'vid' => '1',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title',
+          'created' => '1390095702',
+          'changed' => '1390095702',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      1 =>
+        [
+          'nid' => '2',
+          'vid' => '3',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title rev 3',
+          'created' => '1388271197',
+          'changed' => '1420718386',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      2 =>
+        [
+          'nid' => '3',
+          'vid' => '4',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test page title rev 4',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      3 =>
+        [
+          'nid' => '1',
+          'vid' => '5',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title rev 2',
+          'created' => '1390095702',
+          'changed' => '1390095703',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      4 =>
+        [
+          'nid' => '4',
+          'vid' => '6',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 4',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      5 =>
+        [
+          'nid' => '5',
+          'vid' => '7',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 5',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      6 =>
+        [
+          'nid' => '6',
+          'vid' => '8',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 6',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      7 =>
+        [
+          'nid' => '7',
+          'vid' => '9',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 7',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      8 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 8',
+          'created' => '1388271527',
+          'changed' => '1390095701',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      9 =>
+        [
+          'nid' => '9',
+          'vid' => '11',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Node 9',
+          'created' => '1444671588',
+          'changed' => '1390095701',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      10 =>
+        [
+          'nid' => '9',
+          'vid' => '12',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Once upon a time',
+          'created' => '1444671588',
+          'changed' => '1444671588',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      11 =>
+        [
+          'nid' => '10',
+          'vid' => '13',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Real McCoy',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      12 =>
+        [
+          'nid' => '10',
+          'vid' => '14',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Real McCoy',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      13 =>
+        [
+          'nid' => '10',
+          'vid' => '14',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Le Vrai McCoy',
+          'created' => '1444239050',
+          'changed' => '1444239050',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      14 =>
+        [
+          'nid' => '12',
+          'vid' => '15',
+          'langcode' => 'zu',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Abantu zulu',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      15 =>
+        [
+          'nid' => '12',
+          'vid' => '16',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Zulu People',
+          'created' => '1444239050',
+          'changed' => '1444239050',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      16 =>
+        [
+          'nid' => '12',
+          'vid' => '16',
+          'langcode' => 'zu',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Abantu zulu',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      17 =>
+        [
+          'nid' => '14',
+          'vid' => '17',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'United Federation of Planets',
+          'created' => '1493066668',
+          'changed' => '1493066668',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      18 =>
+        [
+          'nid' => '15',
+          'vid' => '18',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Klingon Empire',
+          'created' => '1493066677',
+          'changed' => '1493066677',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      19 =>
+        [
+          'nid' => '16',
+          'vid' => '19',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Romulan Empire',
+          'created' => '1493066684',
+          'changed' => '1493066684',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      20 =>
+        [
+          'nid' => '17',
+          'vid' => '20',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Ferengi Commerce Authority',
+          'created' => '1493066693',
+          'changed' => '1493066693',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      21 =>
+        [
+          'nid' => '18',
+          'vid' => '21',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Ambassador Sarek',
+          'created' => '1493066711',
+          'changed' => '1494966544',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      22 =>
+        [
+          'nid' => '19',
+          'vid' => '22',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'New Forum Topic',
+          'created' => '1501955771',
+          'changed' => '1501955771',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      23 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The Zulu People',
+          'created' => '1444239050',
+          'changed' => '1444239050',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      24 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Le peuple zoulou',
+          'created' => '1520613038',
+          'changed' => '1520613305',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      25 =>
+        [
+          'nid' => '12',
+          'vid' => '23',
+          'langcode' => 'zu',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Abantu zulu',
+          'created' => '1444238800',
+          'changed' => '1444238808',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'zu',
+          'content_translation_outdated' => '0',
+        ],
+      26 =>
+        [
+          'nid' => '1',
+          'vid' => '2001',
+          'langcode' => 'und',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Test title rev 3',
+          'created' => '1390095702',
+          'changed' => '1420861423',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      27 =>
+        [
+          'nid' => '21',
+          'vid' => '2002',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'John Smith - EN',
+          'created' => '1534014650',
+          'changed' => '1534014650',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      28 =>
+        [
+          'nid' => '21',
+          'vid' => '2003',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'John Smith - EN',
+          'created' => '1534014650',
+          'changed' => '1534014650',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      29 =>
+        [
+          'nid' => '21',
+          'vid' => '2003',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'John Smith - FR',
+          'created' => '1534014687',
+          'changed' => '1534014687',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+    ];
+  }
+
+  /**
+   * Provides the expected node_field_revision table.
+   *
+   * @return array
+   *   Selected properties and fields on the revision.
+   */
+  protected function expectedRevisionEntityData() {
+    return [
+      $revision_data = [
+        // Node 1, revision 1, und.
+        0 =>
+          [
+            'log' => NULL,
+            'created' => '1390095702',
+            'changed' => '1390095702',
+          ],
+        // Node 2, revision 3, und.
+        1 =>
+          [
+            'log' => NULL,
+            'created' => '1420718386',
+            'changed' => '1420718386',
+          ],
+        // Node 3, revision 4, und.
+        2 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 1, revision 5, und.
+        3 =>
+          [
+            'log' => 'modified rev 2',
+            'created' => '1390095703',
+            'changed' => '1390095703',
+          ],
+        // Node 4, revision 6, und.
+        4 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 5, revision 7, und.
+        5 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 6, revision 8, und.
+        6 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 7, revision 9, und.
+        7 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 8, revision 10, und.
+        8 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 9, revision 11, und.
+        9 =>
+          [
+            'log' => NULL,
+            'created' => '1390095701',
+            'changed' => '1390095701',
+          ],
+        // Node 9, revision 12, und.
+        10 =>
+          [
+            'log' => NULL,
+            'created' => '1444671588',
+            'changed' => '1444671588',
+          ],
+        // Node 10, revision 13, en.
+        11 =>
+          [
+            'log' => NULL,
+            'created' => '1444238808',
+            'changed' => '1444238808',
+          ],
+        // Node 10, revision 14, en.
+        12 =>
+          [
+            'log' => NULL,
+            'created' => '1444239050',
+            'changed' => '1444238808',
+          ],
+        // Node 10, revision 14, fr.
+        13 =>
+          [
+            'log' => NULL,
+            'created' => '1444239050',
+            'changed' => '1444239050',
+          ],
+        // Node 12, revision 15, zu.
+        14 =>
+          [
+            'log' => NULL,
+            'created' => '1444238808',
+            'changed' => '1444238808',
+          ],
+        // Node 12, revision 16, en.
+        15 =>
+          [
+            'log' => NULL,
+            'created' => '1444239050',
+            'changed' => '1444239050',
+          ],
+        // Node 12, revision 16, zu.
+        16 =>
+          [
+            'log' => NULL,
+            'created' => '1444239050',
+            'changed' => '1444238808',
+          ],
+        // Node 14, revision 17, und.
+        17 =>
+          [
+            'log' => NULL,
+            'created' => '1493066668',
+            'changed' => '1493066668',
+          ],
+        // Node 15, revision 18, und.
+        18 =>
+          [
+            'log' => NULL,
+            'created' => '1493066677',
+            'changed' => '1493066677',
+          ],
+        // Node 16, revision 19, und.
+        19 =>
+          [
+            'log' => NULL,
+            'created' => '1493066684',
+            'changed' => '1493066684',
+          ],
+        // Node 17, revision 20, und.
+        20 =>
+          [
+            'log' => NULL,
+            'created' => '1493066693',
+            'changed' => '1493066693',
+          ],
+        // Node 18, revision 21, und.
+        21 =>
+          [
+            'log' => NULL,
+            'created' => '1494966544',
+            'changed' => '1494966544',
+          ],
+        // Node 19, revision 22, und.
+        22 =>
+          [
+            'log' => NULL,
+            'created' => '1501955771',
+            'changed' => '1501955771',
+          ],
+        // Node 12, revision 23, en.
+        23 =>
+          [
+            'log' => NULL,
+            'created' => '1520613305',
+            'changed' => '1444239050',
+          ],
+        // Node 12, revision 23, fr.
+        24 =>
+          [
+            'log' => NULL,
+            'created' => '1520613305',
+            'changed' => '1520613305',
+          ],
+        // Node 12, revision 23, zu.
+        25 =>
+          [
+            'log' => NULL,
+            'created' => '1520613305',
+            'changed' => '1444238808',
+          ],
+        // Node 1, revision 2001, und.
+        26 =>
+          [
+            'log' => 'modified rev 3',
+            'created' => '1420861423',
+            'changed' => '1420861423',
+          ],
+        // Node 21, revision 2002, en.
+        27 =>
+          [
+            'log' => NULL,
+            'created' => '1534014650',
+            'changed' => '1534014650',
+          ],
+        // Node 21, revision 2003, en.
+        28 =>
+          [
+            'log' => NULL,
+            'created' => '1534014687',
+            'changed' => '1534014650',
+          ],
+        // Node 21, revision 2003, fr.
+        29 =>
+          [
+            'log' => NULL,
+            'created' => '1534014687',
+            'changed' => '1534014687',
+          ],
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeRevisionTest.php b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeRevisionTest.php
index 9dbfb54126..31571be5cc 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeRevisionTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeRevisionTest.php
@@ -66,17 +66,17 @@ public function testNodeRevision() {
     $this->assertIdentical('1', $node->id());
     $this->assertIdentical('2001', $node->getRevisionId());
     $this->assertIdentical('und', $node->langcode->value);
-    $this->assertIdentical('Test title rev 2', $node->getTitle());
-    $this->assertIdentical('body test rev 2', $node->body->value);
-    $this->assertIdentical('teaser test rev 2', $node->body->summary);
+    $this->assertIdentical('Test title rev 3', $node->getTitle());
+    $this->assertIdentical('body test rev 3', $node->body->value);
+    $this->assertIdentical('teaser test rev 3', $node->body->summary);
     $this->assertIdentical('2', $node->getRevisionUser()->id());
-    $this->assertIdentical('modified rev 2', $node->revision_log->value);
-    $this->assertIdentical('1390095702', $node->getRevisionCreationTime());
+    $this->assertIdentical('modified rev 3', $node->revision_log->value);
+    $this->assertIdentical('1420861423', $node->getRevisionCreationTime());
 
-    $this->assertRevision(1, 'und', 'Test title', NULL, '1420861423');
+    $this->assertRevision(1, 'und', 'Test title', NULL, '1390095702');
     $this->assertRevision(3, 'und', 'Test title rev 3', NULL, '1420718386');
     $this->assertRevision(4, 'und', 'Test page title rev 4', NULL, '1390095701');
-    $this->assertRevision(5, 'und', 'Test title rev 3', 'modified rev 3', '1390095703');
+    $this->assertRevision(5, 'und', 'Test title rev 2', 'modified rev 2', '1390095703');
     $this->assertRevision(6, 'und', 'Node 4', NULL, '1390095701');
     $this->assertRevision(7, 'und', 'Node 5', NULL, '1390095701');
     $this->assertRevision(8, 'und', 'Node 6', NULL, '1390095701');
@@ -92,7 +92,7 @@ public function testNodeRevision() {
     $this->assertRevision(20, 'und', 'Ferengi Commerce Authority', NULL, '1493066693');
     $this->assertRevision(21, 'und', 'Ambassador Sarek', NULL, '1494966544');
     $this->assertRevision(22, 'und', 'New Forum Topic', NULL, '1501955771');
-    $this->assertRevision(2001, 'und', 'Test title rev 2', 'modified rev 2', '1390095702');
+    $this->assertRevision(2001, 'und', 'Test title rev 3', 'modified rev 3', '1420861423');
     $this->assertRevision(2002, 'en', 'John Smith - EN', NULL, '1534014650');
 
     // Test that the revision translations are not migrated and there should not
@@ -101,6 +101,7 @@ public function testNodeRevision() {
     foreach ($ids as $id) {
       $this->assertNull($this->nodeStorage->loadRevision($id));
     }
+
   }
 
 }
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 c390af2db4..143f72a82a 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeTest.php
@@ -54,10 +54,10 @@ public function testNode() {
     $this->assertIdentical('filtered_html', $node->body->format);
     $this->assertIdentical('story', $node->getType(), 'Node has the correct bundle.');
     $this->assertIdentical('Test title', $node->getTitle(), 'Node has the correct title.');
-    $this->assertIdentical('1388271197', $node->getCreatedTime(), 'Node has the correct created time.');
+    $this->assertIdentical('1390095702', $node->getCreatedTime(), 'Node has the correct created time.');
     $this->assertIdentical(FALSE, $node->isSticky());
     $this->assertIdentical('1', $node->getOwnerId());
-    $this->assertIdentical('1420861423', $node->getRevisionCreationTime());
+    $this->assertIdentical('1390095702', $node->getRevisionCreationTime());
 
     /** @var \Drupal\node\NodeInterface $node_revision */
     $node_revision = \Drupal::entityTypeManager()->getStorage('node')->loadRevision(1);
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeMasterTest.php b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeMasterTest.php
new file mode 100644
index 0000000000..dd16a5aaf0
--- /dev/null
+++ b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeMasterTest.php
@@ -0,0 +1,931 @@
+<?php
+
+namespace Drupal\Tests\node\Kernel\Migrate\d7;
+
+use Drupal\node\NodeInterface;
+use Drupal\Tests\file\Kernel\Migrate\d7\FileMigrationSetupTrait;
+use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
+use Drupal\Tests\migrate_drupal\Traits\CreateTestContentEntitiesTrait;
+
+/**
+ * Test class for a master node migration for Drupal 7.
+ *
+ * @group migrate_drupal_7
+ */
+class MigrateNodeMasterTest extends MigrateDrupal7TestBase {
+
+  use FileMigrationSetupTrait;
+  use CreateTestContentEntitiesTrait;
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'content_translation',
+    'comment',
+    'datetime',
+    'image',
+    'language',
+    'link',
+    'menu_ui',
+    // Required for translation migrations.
+    'migrate_drupal_multilingual',
+    'node',
+    'taxonomy',
+    'telephone',
+    'text',
+  ];
+
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->fileMigrationSetup();
+
+    $this->installEntitySchema('comment');
+    $this->installEntitySchema('taxonomy_term');
+    $this->installSchema('comment', ['comment_entity_statistics']);
+    $this->installSchema('node', ['node_access']);
+    $this->installSchema('system', ['sequences']);
+
+    // Create content.
+    $this->createContent();
+
+    $this->nodeStorage = $this->container->get('entity_type.manager')
+      ->getStorage('node');
+    $this->nodeStorage->delete($this->nodeStorage->loadMultiple());
+
+    $this->migrateUsers();
+    $this->migrateFields();
+    $this->executeMigrations([
+      'language',
+      'd7_language_content_settings',
+      'd7_comment_field',
+      'd7_comment_field_instance',
+      'd7_node_master',
+    ]);
+    $this->nodeStorage = $this->container->get('entity_type.manager')
+      ->getStorage('node');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFileMigrationInfo() {
+    return [
+      'path' => 'public://sites/default/files/cube.jpeg',
+      'size' => '3620',
+      'base_path' => 'public://',
+      'plugin_id' => 'd7_file',
+    ];
+  }
+
+  /**
+   * Tests the master node migration.
+   */
+  public function testNodeMasterMigration() {
+    $db = \Drupal::database();
+    $this->assertEquals($this->expectedNodeFieldRevisionTable(), $db->select('node_field_revision', 'nr')
+      ->fields('nr')
+      ->execute()
+      ->fetchAll(\PDO::FETCH_ASSOC));
+    $this->assertEquals($this->expectedNodeFieldDataTable(), $db->select('node_field_data', 'nr')
+      ->fields('nr')
+      ->execute()
+      ->fetchAll(\PDO::FETCH_ASSOC));
+
+    // Now load and test each revision, including the field 'field_text_long_plain'
+    // which has text reflecting the revision.
+    // Source node 1. This node uses entity translation which does not have a
+    // migrate. See https://www.drupal.org/project/drupal/issues/3076447.
+    $data = $this->expectedRevisionEntityData()[0];
+    foreach ($this->expectedNodeFieldRevisionTable() as $key => $revision) {
+      $this->assertRevision($revision, $data[$key]);
+    }
+  }
+
+  /**
+   * Asserts various aspects of a node revision.
+   *
+   * @param array $revision
+   *   An array of revision data matching database table node_field_revision.
+   * @param array $data
+   *   An array of revision data.
+   */
+  protected function assertRevision(array $revision, array $data) {
+    /* @var  \Drupal\node\NodeInterface $actual */
+    $actual = $this->nodeStorage->loadRevision($revision['vid'])
+      ->getTranslation($revision['langcode']);
+    $this->assertInstanceOf(NodeInterface::class, $actual);
+    $this->assertSame($revision['title'], $actual->getTitle(), sprintf("Title '%s' does not match actual '%s' for revision '%d' langcode '%s'", $revision['title'], $actual->getTitle(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($revision['revision_translation_affected'], $actual->get('revision_translation_affected')->value, sprintf("revision_translation_affected '%s' does not match actual '%s' for revision '%d' langcode '%s'", $revision['revision_translation_affected'], $actual->get('revision_translation_affected')->value, $revision['vid'], $revision['langcode']));
+
+    $this->assertSame($data['created'], $actual->getRevisionCreationTime(), sprintf("Creation time '%s' does not match actual '%s' for revision '%d' langcode '%s'", $data['created'], $actual->getRevisionCreationTime(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($data['changed'], $actual->getChangedTime(), sprintf("Changed time '%s' does not match actual '%s' for revision '%d' langcode '%s'", $data['changed'], $actual->getChangedTime(), $revision['vid'], $revision['langcode']));
+    $this->assertSame($data['log'], $actual->getRevisionLogMessage(), sprintf("Revision log '%s' does not match actual '%s' for revision '%d' langcode '%s'", var_export($data['log'], TRUE), $actual->getRevisionLogMessage(), $revision['vid'], $revision['langcode']));
+    if ($data['field_text_long_plain']) {
+      $this->assertSame($data['field_text_long_plain'], $actual->field_text_long_plain->value, sprintf("field_text_long_plain value '%s' does not match actual '%s' for revision '%d' langcode '%s'", var_export($data['field_text_long_plain'], TRUE), $actual->field_text_long_plain->value, $revision['vid'], $revision['langcode']));
+    }
+  }
+
+  /**
+   * Provides the expected node_field_data table.
+   *
+   * @return array
+   *   The table.
+   */
+  protected function expectedNodeFieldDataTable() {
+    return [
+      0 =>
+        [
+          'nid' => '1',
+          'vid' => '1',
+          'type' => 'test_content_type',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'An English Node',
+          'created' => '1421727515',
+          'changed' => '1441032132',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      1 =>
+        [
+          'nid' => '2',
+          'vid' => '12',
+          'type' => 'article',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'The thing about Deep Space 9',
+          'created' => '1441306772',
+          'changed' => '1564543637',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      2 =>
+        [
+          'nid' => '2',
+          'vid' => '12',
+          'type' => 'article',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Deep Space 9',
+          'created' => '1471428152',
+          'changed' => '1564543706',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      3 =>
+        [
+          'nid' => '4',
+          'vid' => '14',
+          'type' => 'article',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'en - The thing about Firefly',
+          'created' => '1478755314',
+          'changed' => '1564543929',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      4 =>
+        [
+          'nid' => '4',
+          'vid' => '14',
+          'type' => 'article',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Firefly',
+          'created' => '1478755274',
+          'changed' => '1564543810',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      5 =>
+        [
+          'nid' => '6',
+          'vid' => '6',
+          'type' => 'forum',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Comments are closed :-(',
+          'created' => '1504715414',
+          'changed' => '1504715414',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      6 =>
+        [
+          'nid' => '7',
+          'vid' => '7',
+          'type' => 'forum',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Comments are open :-)',
+          'created' => '1504715432',
+          'changed' => '1504715432',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      7 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'type' => 'blog',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The number 47',
+          'created' => '1551000341',
+          'changed' => '1552126247',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      8 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'type' => 'blog',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'fr - The number 47',
+          'created' => '1552126296',
+          'changed' => '1552126296',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      9 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'type' => 'blog',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The number 47',
+          'created' => '1552126363',
+          'changed' => '1552126363',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+    ];
+  }
+
+  /**
+   * Provides the expected node_field_revision table.
+   *
+   * @return array
+   *   The table.
+   */
+  protected function expectedNodeFieldRevisionTable() {
+    return [
+      0 =>
+        [
+          'nid' => '1',
+          'vid' => '1',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'An English Node',
+          'created' => '1421727515',
+          'changed' => '1441032132',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      1 =>
+        [
+          'nid' => '2',
+          'vid' => '2',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'The thing about Deep Space 9 (1st rev)',
+          'created' => '1441306772',
+          'changed' => '1564543588',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      2 =>
+        [
+          'nid' => '2',
+          'vid' => '3',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'The thing about Deep Space 9 (1st rev)',
+          'created' => '1441306772',
+          'changed' => '1564543588',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      3 =>
+        [
+          'nid' => '2',
+          'vid' => '3',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Deep Space 9 (1st rev)',
+          'created' => '1471428152',
+          'changed' => '1564543677',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      4 =>
+        [
+          'nid' => '4',
+          'vid' => '4',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Firefly (1st rev)',
+          'created' => '1478755274',
+          'changed' => '1478755274',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      5 =>
+        [
+          'nid' => '4',
+          'vid' => '5',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'en - The thing about Firefly (1st rev)',
+          'created' => '1478755314',
+          'changed' => '1564543887',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      6 =>
+        [
+          'nid' => '4',
+          'vid' => '5',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Firefly (1st rev)',
+          'created' => '1478755274',
+          'changed' => '1478755274',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      7 =>
+        [
+          'nid' => '6',
+          'vid' => '6',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Comments are closed :-(',
+          'created' => '1504715414',
+          'changed' => '1504715414',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      8 =>
+        [
+          'nid' => '7',
+          'vid' => '7',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'Comments are open :-)',
+          'created' => '1504715432',
+          'changed' => '1504715432',
+          'promote' => '0',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => NULL,
+          'content_translation_outdated' => '0',
+        ],
+      9 =>
+        [
+          'nid' => '8',
+          'vid' => '8',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The number 47',
+          'created' => '1551000341',
+          'changed' => '1552126247',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      10 =>
+        [
+          'nid' => '8',
+          'vid' => '9',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The number 47',
+          'created' => '1551000341',
+          'changed' => '1552126247',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      11 =>
+        [
+          'nid' => '8',
+          'vid' => '9',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'fr - The number 47',
+          'created' => '1552126296',
+          'changed' => '1552126296',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      12 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'The number 47',
+          'created' => '1551000341',
+          'changed' => '1552126247',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      13 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'langcode' => 'fr',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'fr - The number 47',
+          'created' => '1552126296',
+          'changed' => '1552126296',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      14 =>
+        [
+          'nid' => '8',
+          'vid' => '10',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The number 47',
+          'created' => '1552126363',
+          'changed' => '1552126363',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      15 =>
+        [
+          'nid' => '2',
+          'vid' => '11',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'The thing about Deep Space 9',
+          'created' => '1441306772',
+          'changed' => '1564543637',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      16 =>
+        [
+          'nid' => '2',
+          'vid' => '11',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Deep Space 9 (1st rev)',
+          'created' => '1471428152',
+          'changed' => '1564543637',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      17 =>
+        [
+          'nid' => '2',
+          'vid' => '12',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '2',
+          'title' => 'The thing about Deep Space 9',
+          'created' => '1441306772',
+          'changed' => '1564543637',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      18 =>
+        [
+          'nid' => '2',
+          'vid' => '12',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Deep Space 9',
+          'created' => '1471428152',
+          'changed' => '1564543706',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'en',
+          'content_translation_outdated' => '0',
+        ],
+      19 =>
+        [
+          'nid' => '4',
+          'vid' => '13',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'en - The thing about Firefly (1st rev)',
+          'created' => '1478755314',
+          'changed' => '1564543887',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      20 =>
+        [
+          'nid' => '4',
+          'vid' => '13',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Firefly',
+          'created' => '1478755274',
+          'changed' => '1564543810',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      21 =>
+        [
+          'nid' => '4',
+          'vid' => '14',
+          'langcode' => 'en',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'en - The thing about Firefly',
+          'created' => '1478755314',
+          'changed' => '1564543929',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '0',
+          'revision_translation_affected' => '1',
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+      22 =>
+        [
+          'nid' => '4',
+          'vid' => '14',
+          'langcode' => 'is',
+          'status' => '1',
+          'uid' => '1',
+          'title' => 'is - The thing about Firefly',
+          'created' => '1478755274',
+          'changed' => '1564543810',
+          'promote' => '1',
+          'sticky' => '0',
+          'default_langcode' => '1',
+          'revision_translation_affected' => NULL,
+          'content_translation_source' => 'is',
+          'content_translation_outdated' => '0',
+        ],
+    ];
+  }
+
+  /**
+   * Provides the expected node_field_revision table.
+   *
+   * @return array
+   *   Selected properties and fields on the revision.
+   */
+  protected function expectedRevisionEntityData() {
+    return [
+      $revision_data = [
+        // Node 1, revision 1, en.
+        0 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1441032132',
+            'changed' => '1441032132',
+          ],
+        // Node 2, revision 2, en.
+        1 =>
+          [
+            'log' => 'DS9 1st rev',
+            'field_text_long_plain' => 'DS9 1st rev',
+            'created' => '1564543588',
+            'changed' => '1564543588',
+          ],
+        // Node 2, revision 3, en.
+        2 =>
+          [
+            'log' => 'is - DS9 1st rev',
+            'field_text_long_plain' => 'DS9 1st rev',
+            'created' => '1564543677',
+            'changed' => '1564543588',
+          ],
+        // Node 2, revision 3, is.
+        3 =>
+          [
+            'log' => 'is - DS9 1st rev',
+            'field_text_long_plain' => 'is - DS9 1st rev',
+            'created' => '1564543677',
+            'changed' => '1564543677',
+          ],
+        // Node 4, revision 4, is.
+        4 =>
+          [
+            'log' => 'is - Firefly 1st rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1478755274',
+            'changed' => '1478755274',
+          ],
+        // Node 4, revision 5, en.
+        5 =>
+          [
+            'log' => 'Firefly 1st rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543887',
+            'changed' => '1564543887',
+          ],
+        // Node 4, revision 5, is.
+        6 =>
+          [
+            'log' => 'Firefly 1st rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543887',
+            'changed' => '1478755274',
+          ],
+        // Node 6, revision 6, en.
+        7 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1504715414',
+            'changed' => '1504715414',
+          ],
+        // Node 7, revision 7, en.
+        8 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1504715432',
+            'changed' => '1504715432',
+          ],
+        // Node 8, revision 8, en.
+        9 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126247',
+            'changed' => '1552126247',
+          ],
+        // Node 8, revision 9, en.
+        10 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126296',
+            'changed' => '1552126247',
+          ],
+        // Node 8, revision 9, fr.
+        11 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126296',
+            'changed' => '1552126296',
+          ],
+        // Node 8, revision 10, en.
+        12 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126363',
+            'changed' => '1552126247',
+          ],
+        // Node 8, revision 10, fr.
+        13 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126363',
+            'changed' => '1552126296',
+          ],
+        // Node 8, revision 10, is.
+        14 =>
+          [
+            'log' => NULL,
+            'field_text_long_plain' => NULL,
+            'created' => '1552126363',
+            'changed' => '1552126363',
+          ],
+        // Node 2, revision 11, en.
+        15 =>
+          [
+            'log' => 'DS9 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543637',
+            'changed' => '1564543637',
+          ],
+        // Node 2, revision 11, is.
+        16 =>
+          [
+            'log' => 'DS9 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543637',
+            'changed' => '1564543637',
+          ],
+        // Node 2, revision 12, en.
+        17 =>
+          [
+            'log' => 'is - DS9 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543706',
+            'changed' => '1564543637',
+          ],
+        // Node 2, revision 12, is.
+        18 =>
+          [
+            'log' => 'is - DS9 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543706',
+            'changed' => '1564543706',
+          ],
+        // Node 4, revision 13, en.
+        19 =>
+          [
+            'log' => 'is - Firefly 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543810',
+            'changed' => '1564543887',
+          ],
+        // Node 4, revision 13, is.
+        20 =>
+          [
+            'log' => 'is - Firefly 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543810',
+            'changed' => '1564543810',
+          ],
+        // Node 4, revision 14, en.
+        21 =>
+          [
+            'log' => 'Firefly 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543929',
+            'changed' => '1564543929',
+          ],
+        // Node 4, revision 14, is.
+        22 =>
+          [
+            'log' => 'Firefly 2nd rev',
+            'field_text_long_plain' => NULL,
+            'created' => '1564543929',
+            'changed' => '1564543810',
+          ],
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeRevisionTest.php b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeRevisionTest.php
index 563bcf9be2..8c04019bb0 100644
--- a/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeRevisionTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeRevisionTest.php
@@ -112,8 +112,8 @@ protected function assertRevision($id, $langcode, $title, $log, $timestamp) {
    */
   public function testNodeRevisions() {
     $this->assertRevision(1, 'en', 'An English Node', NULL, '1441032132');
-    $this->assertRevision(2, 'en', 'The thing about Deep Space 9', NULL, '1471428152');
-    $this->assertRevision(4, 'is', 'is - The thing about Firefly', NULL, '1478755314');
+    $this->assertRevision(2, 'en', 'The thing about Deep Space 9 (1st rev)', 'DS9 1st rev', '1564543588');
+    $this->assertRevision(4, 'is', 'is - The thing about Firefly (1st rev)', 'is - Firefly 1st rev', '1478755274');
     $this->assertRevision(6, 'en', 'Comments are closed :-(', NULL, '1504715414');
     $this->assertRevision(7, 'en', 'Comments are open :-)', NULL, '1504715432');
     $this->assertRevision(8, 'en', 'The number 47', NULL, '1552126363');
