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..1fa656b207
--- /dev/null
+++ b/core/modules/content_translation/migrations/d6_node_master.yml
@@ -0,0 +1,60 @@
+# 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.
+  # In D6, 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\d6\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
+  '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
+  #  unmapped d6 fields.
+  #  translate
+  #  moderate
+  #  comment
+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..ee663a25e8
--- /dev/null
+++ b/core/modules/content_translation/migrations/d7_node_master.yml
@@ -0,0 +1,50 @@
+# 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
+  #  unmapped d6 fields.
+  #  translate
+  #  comment
+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/Audit/NodeMasterIdAuditor.php b/core/modules/migrate/src/Audit/NodeMasterIdAuditor.php
new file mode 100644
index 0000000000..5ecfe815ea
--- /dev/null
+++ b/core/modules/migrate/src/Audit/NodeMasterIdAuditor.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Drupal\migrate\Audit;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+
+/**
+ * Audits the revision ID for the node master migration.
+ */
+class NodeMasterIdAuditor {
+
+  /**
+   * Audits master node migrations.
+   *
+   * @param \Drupal\migrate\Plugin\MigrationInterface[] $migrations
+   *   The migrations to audit.
+   *
+   * @return \Drupal\migrate\Audit\AuditResult[]
+   *   The audit results, keyed by migration ID.
+   */
+  public function auditMultiple(array $migrations) {
+    $results = [];
+    // 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) {
+        $max = static::getHighestMigratedNodeRevisionId($migration);
+
+        // Make a migration based on node_master but with an 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, [
+            t('The destination system contains data which was not created by a migration.'),
+          ]);
+        }
+        else {
+          $results[$migration_id . '-revision'] = AuditResult::pass($revision_migration);
+        }
+      }
+    }
+    return $results;
+  }
+
+  /**
+   * Gets highest migrated node revision ID.
+   *
+   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
+   *   A node_master migration.
+   *
+   * @return int
+   *   The highest migrated node revision ID.
+   *
+   * @throws \InvalidArgumentException
+   *   Thrown when the ID map table does not exist.
+   */
+  protected static function getHighestMigratedNodeRevisionId(MigrationInterface $migration) : int {
+    $map_table = $migration->getIdMap()->mapTableName();
+
+    $database = \Drupal::database();
+    if (!$database->schema()->tableExists($map_table)) {
+      throw new \InvalidArgumentException();
+    }
+
+    $query = $database->select($map_table, 'map')
+      ->fields('map', ['destid2'])
+      ->range(0, 1)
+      ->orderBy('destid2', 'DESC');
+    $ids[] = $query->execute()->fetchField();
+    $max = (int) (max($ids));
+
+    return $max;
+  }
+
+}
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..af0dc4ae1b
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/Derivative/MigrateEntityMaster.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\migrate\Plugin\Derivative;
+
+use Drupal\migrate\Plugin\migrate\destination\EntityContentMaster;
+
+/**
+ * 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' => EntityContentMaster::class,
+        'requirements_met' => 1,
+        'provider' => $entity_info->getProvider(),
+      ];
+    }
+    return $this->derivatives;
+  }
+
+}
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..f89dfa6864
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentMaster.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Drupal\migrate\Plugin\migrate\destination;
+
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityChangedInterface;
+use Drupal\migrate\EntityFieldDefinitionTrait;
+use Drupal\migrate\Row;
+
+/**
+ * Provides a node destination for migrating the entire entity revision table.
+ *
+ * @MigrateDestination(
+ *   id = "entity_master",
+ *   deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityMaster"
+ * )
+ */
+class EntityContentMaster extends EntityContentBase {
+
+  use EntityFieldDefinitionTrait;
+
+  /**
+   * {@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;
+  }
+
+  /**
+   * 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
+   *   The entity.
+   */
+  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);
+    }
+    elseif (($entity_id = $row->getDestinationProperty($this->getKey('id'))) && ($entity = $this->storage->load($entity_id))) {
+      $entity->enforceIsNew(FALSE);
+      $entity->setNewRevision(TRUE);
+    }
+    else {
+      // Attempt to set the 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_drupal/migrate_drupal.install b/core/modules/migrate_drupal/migrate_drupal.install
index 820bcdc870..d5e6fdefc1 100644
--- a/core/modules/migrate_drupal/migrate_drupal.install
+++ b/core/modules/migrate_drupal/migrate_drupal.install
@@ -5,6 +5,8 @@
  * Contains install and update functions for Migrate Drupal
  */
 
+use Drupal\Core\Database\Database;
+
 /**
  * Creates migrate_drupal.settings config object.
  */
@@ -31,3 +33,56 @@ function migrate_drupal_update_8502() {
 function migrate_drupal_update_8601() {
   \Drupal::service('module_installer')->install(['migrate_drupal_multilingual']);
 }
+
+/**
+ * Add revision ID to entity reference translation migrate_map tables..
+ */
+function migrate_drupal_update_8901(&$sandbox) {
+  $schema = Database::getConnection()->schema();
+  $table_expression = 'migrate_map%entity_reference_translation%node%';
+  $tables = $schema->findTables($table_expression);
+  foreach ($tables as $table) {
+    // Move language code to sourceid3.
+    $spec = [
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+    ];
+    $schema->changeField($table, 'sourceid2', 'sourceid3', $spec);
+
+    // Add revision ID.
+    $spec = [
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ];
+    $schema->addField($table, 'sourceid2', $spec);
+
+    // Add sourceid2 to index.
+    $spec = [
+      'fields' => [
+        'sourceid1' => [
+          'type' => 'int',
+          'not_null' => TRUE,
+        ],
+        'sourceid2' => [
+          'type' => 'int',
+          'not_null' => TRUE,
+        ],
+        'sourceid3' => [
+          'type' => 'varchar',
+          'length' => 12,
+          'not null' => TRUE,
+        ],
+      ],
+    ];
+    $fields = [
+      'sourceid1',
+      'sourceid2',
+      'sourceid3',
+    ];
+    $schema->dropIndex($table, 'source');
+    $schema->addIndex($table, 'source', $fields, $spec);
+  }
+}
diff --git a/core/modules/migrate_drupal/migrate_drupal.module b/core/modules/migrate_drupal/migrate_drupal.module
index 3f9439dd3b..e52997d3b6 100644
--- a/core/modules/migrate_drupal/migrate_drupal.module
+++ b/core/modules/migrate_drupal/migrate_drupal.module
@@ -11,6 +11,7 @@
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateExecutable;
 use Drupal\migrate\Plugin\RequirementsInterface;
+use Drupal\migrate_drupal\NodeMigrateType;
 
 /**
  * Implements hook_help().
@@ -46,7 +47,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 +91,164 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
       // When the definitions are loaded it is possible the tables will not
       // exist.
     }
+  }
+
+  // If the master node migrate_map tables have data then the any migration
+  // use a node migration in a migration_lookup needs to be altered to use
+  // both the classic and master node migration.
+  if ((new NodeMigrateType)->getNodeMigrateType($definitions) !== NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC) {
+
+    // Anonymous function to replace classic node migration plugin IDs with the
+    // master plugin ID.
+    $replace_with_master_migration = function (&$value) {
+      if (is_string($value)) {
+        $value = preg_replace('/d([67])_(node|node_translation|node_revision)($|:.*)/', 'd$1_node_master$3', $value);
+      }
+      return $value;
+    };
+    // Alter references to the classic node migration to the master node
+    // migration in all relevant core migrations. The references altered are
+    // those in migration_dependencies and in the process pipeline. In the
+    // process pipeline we are concerned with references to classic node
+    // migrations in a migration_lookup process.
+    //
+    // The process pipeline is altered so that the migration_lookup returns
+    // the correct IDs. For example, the classic d6_node_revision migration
+    // has a single ID, the revision ID, but the d6_node_master has three IDs,
+    // the node ID, the revision ID and the language. To ensure the pipeline
+    // works for both migrations we need to insert a process to return only
+    // the revision ID if the master node migration was used.
+    //
+    // Example: d6_term_node_revision
+    //
+    // Before
+    //  vid:
+    //    -
+    //      plugin: migration_lookup
+    //      migration: d6_node_revision
+    //      source: vid
+    //    -
+    //      plugin: skip_on_empty
+    //      method: row
+    // After
+    //  vid:
+    //    -
+    //      plugin: migration_lookup
+    //      migration:
+    //        - d6_node_revision
+    //        - d6_node_master
+    //      source: vid
+    //    -
+    //      plugin: skip_on_empty
+    //      method: row
+    //    -
+    //      plugin: node_master_node_lookup
+    //
+    // The classic node migrations are not altered.
+    //
+    // See \Drupal\migrate_drupal\Plugin\migrate\process\NodeMasterNodeLookup
+    // See \Drupal\migrate_drupal\Plugin\migrate\process\NodeMasterNodeRevisionLookup
+    // See \Drupal\migrate_drupal\Plugin\migrate\process\NodeMasterNodeTranslationLookup
+    foreach ($definitions as &$definition) {
+      $is_node_classic_migration = preg_match('/d([67])_(node|node_translation|node_revision)($|:.*)/', $definition['id']);
+      if (!$is_node_classic_migration && isset($definition['migration_dependencies'])) {
+        array_walk_recursive($definition['migration_dependencies'], $replace_with_master_migration);
+      }
+
+      // Alter the migration_lookup process so the node ID is returned.
+      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',
+        ];
+      }
+      // Alter the migration_lookup process so the revision ID is returned.
+      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',
+        ];
+      }
+      // Alter the migration_lookup process so the node ID and langcode are
+      // returned.
+      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',
+        ];
+      }
+    }
 
+    // Alter the migration_lookup process so the node ID is returned.
+    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',
+      ];
+    }
+    // Alter the migration_lookup process so the node ID and langcode are
+    // returned.
+    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',
+      ];
+    }
+    // Alter the migration_lookup process so the node ID is returned.
+    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',
+      ];
+    }
+    // Alter the migration_lookup process so the node ID and langcode are
+    // returned.
+    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',
+      ];
+    }
+    // Alter the migration_lookup process so the node ID is returned.
+    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',
+      ];
+    }
+    // Alter the migration_lookup process to include the master node migration.
+    // A node_master_node*_lookup process is not needed because the
+    // migration_lookup is followed by an extract process which will get the
+    // node ID.
+    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);
 }
diff --git a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
index 8cb60347bc..e9861f80ef 100644
--- a/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
+++ b/core/modules/migrate_drupal/src/MigrationConfigurationTrait.php
@@ -121,8 +121,34 @@ protected function createDatabaseStateSettings(array $database, $drupal_version)
    */
   protected function getMigrations($database_state_key, $drupal_version) {
     $version_tag = 'Drupal ' . $drupal_version;
-    /** @var \Drupal\migrate\Plugin\Migration[] $all_migrations */
+    /** @var \Drupal\migrate\Plugin\MigrationInterface[] $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->getNodeMigrateType($all_migrations, $drupal_version);
+    switch ($type) {
+      case NodeMigrateType::NODE_MIGRATE_TYPE_MASTER:
+        $patterns = '/(d' . $drupal_version . '_node:)|(d' . $drupal_version . '_node_translation:)|(d' . $drupal_version . '_node_revision:)|(entity_translation)/';
+        break;
+
+      case NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC:
+        $patterns = '/(d' . $drupal_version . '_node_master:)/';
+        break;
+
+      case NodeMigrateType::NODE_MIGRATE_TYPE_BOTH:
+        $patterns = '//';
+        break;
+    }
+    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 +299,62 @@ protected function getState() {
     return $this->state;
   }
 
+  /**
+   * Determines the type of node migration to be used.
+   *
+   * The node master migration is the default. It is not used when there are
+   * existing tables for dN_node.
+   *
+   * @param \Drupal\migrate\Plugin\MigrationInterface[] $migrations
+   *   An array of migrations keyed by migration ID.
+   * @param string $version
+   *   The Drupal version of the source database.
+   *
+   * @return string
+   *   One of NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC,
+   *   NodeMigrateType::NODE_MIGRATE_TYPE_MASTER, or
+   *   NodeMigrateType::NODE_MIGRATE_TYPE_BOTH
+   */
+  protected function getNodeMigrateType(array $migrations, $version) {
+    $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_MASTER;
+    $node_has_rows = FALSE;
+    $node_master_has_rows = FALSE;
+
+    $ids = ['node_master', 'node'];
+    foreach ($ids as $id) {
+      // Create the variable name, 'node_exists' or 'node_master_exists' and
+      // set it to the default value, FALSE.
+      $has_rows = $id . '_has_rows';
+      $$has_rows = FALSE;
+      $patterns = '/d' . $version . '_' . $id . ':/';
+      $matches = preg_grep($patterns, array_keys($migrations));
+      // When the migration has a map table set 'node_exists' or
+      // 'node_master_exists' to TRUE.
+      foreach ($matches as $match) {
+        $count = $migrations[$match]->getIdMap()->processedCount();
+        if ($count > 0) {
+          $$has_rows = TRUE;
+          break;
+        }
+      }
+    }
+
+    // Set the node migration type to use.
+    if ($node_has_rows && $node_master_has_rows) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_BOTH;
+    }
+    if ($node_has_rows && !$node_master_has_rows) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC;
+    }
+
+    // This might be a test environment.
+    if (\Drupal::service('module_handler')->moduleExists('node_migrate_classic')) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC;
+    }
+    if (\Drupal::service('module_handler')->moduleExists('node_migrate_master')) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_MASTER;
+    }
+    return $migrate_type;
+  }
+
 }
diff --git a/core/modules/migrate_drupal/src/NodeMigrateType.php b/core/modules/migrate_drupal/src/NodeMigrateType.php
new file mode 100644
index 0000000000..2086364f03
--- /dev/null
+++ b/core/modules/migrate_drupal/src/NodeMigrateType.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace Drupal\migrate_drupal;
+
+/**
+ * Provides a class to determine the type of migration.
+ */
+final class NodeMigrateType {
+
+  use MigrationConfigurationTrait;
+
+  /**
+   * Only the master node migration map tables are in use.
+   */
+  const NODE_MIGRATE_TYPE_MASTER = 'MASTER';
+
+  /**
+   * Only the classic node migration map tables are in use.
+   */
+  const NODE_MIGRATE_TYPE_CLASSIC = 'CLASSIC';
+
+  /**
+   * Both the classic and master node migration map tables are in use.
+   */
+  const NODE_MIGRATE_TYPE_BOTH = 'BOTH';
+
+  /**
+   * Determines the type of node migration to be used.
+   *
+   * The node master migration is the default. It is not used when there
+   * are existing tables for dN_node.
+   *
+   * @param array[] $definitions
+   *   An associative array of migrations. The array is normally keyed by
+   *   migration ID. However, the followup migrations are keyed by
+   *   'entity_type__bundle'. 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().
+   */
+  public function getNodeMigrateType(array $definitions) {
+    $version = '';
+
+    // We need to get the version of the source database in order to check
+    // if the classic or master node tables have been used in a migration.
+    if (isset($definitions['system_site'])) {
+      // Use the source plugin of the system_site migration to get the database
+      // connection.
+      $migration = $definitions['system_site'];
+      /** @var \Drupal\migrate\Plugin\migrate\source\SqlBase $source_plugin */
+      $source_plugin = \Drupal::service('plugin.manager.migration')
+        ->createStubMigration($migration)
+        ->getSourcePlugin();
+      $connection = NULL;
+
+      try {
+        $connection = $source_plugin->getDatabase();
+      }
+      catch (\Exception $e) {
+        // @todo: do something useful.
+      }
+      $version_string = FALSE;
+
+      if ($connection) {
+        $version = $this->getLegacyDrupalVersion($connection);
+      }
+    }
+
+    return $this->migrateType($version);
+  }
+
+  /**
+   * Helper to determine what node migrate map tables have data.
+   *
+   * @param string $version
+   *   The Drupal version of the source database.
+   *
+   * @return string
+   *   The migrate type.
+   */
+  protected function migrateType($version) {
+    $migrate_type = static::NODE_MIGRATE_TYPE_MASTER;
+    if ($version) {
+      $node_has_rows = FALSE;
+      $node_master_has_rows = FALSE;
+      $connection = \Drupal::database();
+
+      // Find out what migrate map tables have rows for the node migrations.
+      // It is either the classic, 'dN_node', or the master, 'dN_node_master',
+      // or both. This is used to determine which migrations are run and
+      // if migrations using the node migrations in a migration_lookup are
+      // altered.
+      $bases = ['node', 'node_master'];
+      $tables = $connection->schema()
+        ->findTables('migrate_map_d' . $version . '_node%');
+      foreach ($bases as $base) {
+        // Create the variable name, 'node_exists' or 'node_master_exists' and
+        // set it the default value, FALSE.
+        $has_rows = $base . '_has_rows';
+        $$has_rows = FALSE;
+        $base_tables = preg_grep('/^migrate_map_d' . $version . '_' . $base . '_{2}.*$/', $tables);
+        // Set the existence flag True when a map table exists for the matched
+        // migration.
+        foreach ($base_tables as $base_table) {
+          if ($connection->schema()->tableExists($base_table)) {
+            $count = $connection->select($base_table)->countQuery()
+              ->execute()->fetchField();
+            if ($count > 0) {
+              $$has_rows = TRUE;
+              break;
+            }
+          }
+        }
+      }
+
+      // Set the node migration type to use.
+      if ($node_has_rows && $node_master_has_rows) {
+        $migrate_type = static::NODE_MIGRATE_TYPE_BOTH;
+      }
+      if ($node_has_rows && !$node_master_has_rows) {
+        $migrate_type = static::NODE_MIGRATE_TYPE_CLASSIC;
+      }
+    }
+
+    // This might be a test environment.
+    if (\Drupal::service('module_handler')
+      ->moduleExists('node_migrate_classic')) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_CLASSIC;
+    }
+    if (\Drupal::service('module_handler')
+      ->moduleExists('node_migrate_master')) {
+      $migrate_type = NodeMigrateType::NODE_MIGRATE_TYPE_MASTER;
+    }
+    return $migrate_type;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php b/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php
index bc33695860..ecdebc8463 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php
@@ -186,7 +186,6 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         }
       }
     }
-
     return $this->derivatives;
   }
 
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..894a28b82f
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeLookup.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 only the nid from migration_lookup on node_master migration.
+ *
+ * It is possible that migration_lookups that use the classic node migrations
+ * in the migration key have been altered to include the master node migration.
+ * The classic node migration and master node migration have a different
+ * number of destination keys. This process plugin will ensure that when the
+ * master node migration is used in the lookup the nid value is returned. This
+ * keeps the behaviour the same as the classic node migration.
+ *
+ * @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..2b42bf244a
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeRevisionLookup.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 only the vid from migration_lookup on node_master migration.
+ *
+ * It is possible that migration_lookups that use the classic node migrations
+ * in the migration key have been altered to include the master node migration.
+ * The classic node migration and master node migration have a different
+ * number of destination keys. This process plugin will ensure that when the
+ * master node migration is used in the lookup the vid value is returned.  This
+ * keeps the behaviour the same as the classic node migration.
+ *
+ * @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..a2902b182d
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/NodeMasterNodeTranslationLookup.php
@@ -0,0 +1,38 @@
+<?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.
+ *
+ * It is possible that migration_lookups that use the classic node migrations
+ * in the migration key have been altered to include the master node migration.
+ * The classic node migration and master node migration have a different
+ * number of destination keys. This process plugin will ensure that when the
+ * master node migration is used in the lookup the nid and langcode values are
+ * returned. This keeps the behaviour the same as the classic node migration.
+ *
+ * @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/src/Plugin/migrate/source/ContentEntity.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/ContentEntity.php
index e80de1b7f8..a2f38d180c 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/ContentEntity.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/ContentEntity.php
@@ -265,6 +265,10 @@ public function fields() {
   public function getIds() {
     $id_key = $this->entityType->getKey('id');
     $ids[$id_key] = $this->getDefinitionFromEntity($id_key);
+    if ($this->entityType->isRevisionable()) {
+      $revision_key = $this->entityType->getKey('revision');
+      $ids[$revision_key] = $this->getDefinitionFromEntity($revision_key);
+    }
     if ($this->entityType->isTranslatable()) {
       $langcode_key = $this->entityType->getKey('langcode');
       $ids[$langcode_key] = $this->getDefinitionFromEntity($langcode_key);
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 fafbed003a..37984eddd9 100644
--- a/core/modules/migrate_drupal/tests/fixtures/drupal7.php
+++ b/core/modules/migrate_drupal/tests/fixtures/drupal7.php
@@ -5161,7 +5161,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.",
@@ -5173,7 +5173,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.",
@@ -7140,23 +7140,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();
@@ -7768,7 +7768,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '5',
@@ -7778,7 +7778,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '4',
@@ -7788,7 +7788,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '4',
-  'revision_id' => '4',
+  'revision_id' => '13',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '3',
@@ -7798,7 +7798,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '5',
-  'revision_id' => '5',
+  'revision_id' => '14',
   'language' => 'und',
   'delta' => '0',
   'field_reference_target_id' => '2',
@@ -7904,7 +7904,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '5',
@@ -7914,7 +7914,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '4',
@@ -7924,7 +7924,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '4',
-  'revision_id' => '4',
+  'revision_id' => '13',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '3',
@@ -7934,7 +7934,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '5',
-  'revision_id' => '5',
+  'revision_id' => '14',
   'language' => 'und',
   'delta' => '0',
   'field_reference_2_target_id' => '2',
@@ -8129,7 +8129,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_tags_tid' => '9',
@@ -8139,7 +8139,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_tags_tid' => '9',
@@ -8149,7 +8149,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '1',
   'field_tags_tid' => '14',
@@ -8159,7 +8159,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '1',
   'field_tags_tid' => '14',
@@ -8169,7 +8169,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '2',
   'field_tags_tid' => '17',
@@ -8179,7 +8179,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '2',
   'field_tags_tid' => '17',
@@ -8837,6 +8837,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(
@@ -9037,7 +9094,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_text_plain_value' => 'Kai Opaka',
@@ -9048,7 +9105,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_text_plain_value' => 'Kai Opaka',
@@ -9752,7 +9809,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_fixed_tid' => '24',
@@ -9858,7 +9915,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
@@ -9868,7 +9925,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_localize_tid' => '20',
@@ -9974,7 +10031,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_translate_tid' => '21',
@@ -9984,7 +10041,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_vocab_translate_tid' => '23',
@@ -10634,6 +10691,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',
@@ -10650,11 +10719,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',
 ))
@@ -10662,11 +10731,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',
 ))
@@ -12642,8 +12711,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',
@@ -12657,6 +12738,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(
@@ -13287,6 +13380,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',
@@ -13297,6 +13400,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',
@@ -13307,6 +13420,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',
@@ -13317,6 +13440,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(
@@ -13424,6 +13557,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',
@@ -13434,6 +13577,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',
@@ -13444,6 +13597,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',
@@ -13454,6 +13617,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_sector', array(
   'fields' => array(
@@ -13641,6 +13814,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',
@@ -13651,6 +13834,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',
@@ -13661,6 +13854,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',
@@ -13671,6 +13874,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',
@@ -13691,6 +13904,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',
@@ -13701,6 +13924,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(
@@ -14361,6 +14594,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(
@@ -14563,7 +14886,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '2',
-  'revision_id' => '2',
+  'revision_id' => '11',
   'language' => 'und',
   'delta' => '0',
   'field_text_plain_value' => 'Kai Opaka',
@@ -14574,7 +14897,7 @@
   'bundle' => 'article',
   'deleted' => '0',
   'entity_id' => '3',
-  'revision_id' => '3',
+  'revision_id' => '12',
   'language' => 'und',
   'delta' => '0',
   'field_text_plain_value' => 'Kai Opaka',
@@ -15279,6 +15602,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(
@@ -15386,6 +15719,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',
@@ -15396,6 +15739,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(
@@ -15503,6 +15856,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',
@@ -15513,6 +15876,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(
@@ -41439,14 +41812,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',
@@ -41455,14 +41828,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',
@@ -41471,14 +41844,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',
@@ -41487,14 +41860,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',
@@ -41956,9 +42329,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',
@@ -41968,9 +42341,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',
@@ -41980,8 +42353,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',
@@ -41992,9 +42365,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',
@@ -42060,6 +42433,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/modules/node_migrate_classic/node_migrate_classic.info.yml b/core/modules/migrate_drupal/tests/modules/node_migrate_classic/node_migrate_classic.info.yml
new file mode 100644
index 0000000000..1cfac5fbcf
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/modules/node_migrate_classic/node_migrate_classic.info.yml
@@ -0,0 +1,7 @@
+name: Node migrate classic
+type: module
+description: Use the classic node migrations.
+package: Testing
+version: VERSION
+core: 8.x
+hidden: true
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/MigrateDrupalTestBase.php b/core/modules/migrate_drupal/tests/src/Kernel/MigrateDrupalTestBase.php
index f361fb16ef..7c9c7b6fa5 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/MigrateDrupalTestBase.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/MigrateDrupalTestBase.php
@@ -15,7 +15,15 @@ abstract class MigrateDrupalTestBase extends MigrateTestBase {
    *
    * @var array
    */
-  public static $modules = ['system', 'user', 'field', 'migrate_drupal', 'options', 'file'];
+  public static $modules = [
+    'system',
+    'user',
+    'field',
+    'migrate_drupal',
+    'options',
+    'file',
+    'node_migrate_classic',
+  ];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/MigrationPluginAlterTest.php b/core/modules/migrate_drupal/tests/src/Kernel/MigrationPluginAlterTest.php
index 335c44cab7..9120620931 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/MigrationPluginAlterTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/MigrationPluginAlterTest.php
@@ -5,7 +5,7 @@
 use Drupal\Tests\migrate\Kernel\MigrateTestBase;
 
 /**
- * Tests migrate_drupal_migrations_plugin_alter for d6 term node migrations.
+ * Tests migrate_drupal_migrations_plugin_alter.
  *
  * @group migrate_drupal
  */
@@ -25,12 +25,24 @@ protected function setUp() {
   }
 
   /**
-   * Tests migrate_drupal_migrations_plugin_alter without content_translation.
+   * Tests migrate_drupal_migrations_plugin_alter.
+   *
+   * @param array $modules
+   *   An array of modules to install.
+   * @param array $migration_definitions
+   *   An array of migration definitions.
+   * @param array $expected
+   *   The expected results.
    *
    * @dataProvider providerMigrationPluginAlter
+   *
+   * @throws \Drupal\Core\Extension\MissingDependencyException
    */
-  public function testMigrationPluginAlterNoTranslation($source, $expected) {
-    $definitions = $source;
+  public function testMigrationPluginAlter(array $modules, array $migration_definitions, array $expected) {
+    /** @var \Drupal\Core\Extension\ModuleInstaller $module_installer */
+    $module_installer = \Drupal::service('module_installer');
+    $module_installer->install($modules);
+    $definitions = $migration_definitions;
     migrate_drupal_migration_plugins_alter($definitions);
     // Ensure the results have an 'id' key.
     foreach ($definitions as $definition) {
@@ -45,19 +57,16 @@ public function testMigrationPluginAlterNoTranslation($source, $expected) {
   public function providerMigrationPluginAlter() {
     $tests = [];
 
-    // Test without a d6_taxonomy_vocabulary definition.
-    $tests[0]['source_data'] = [
+    // Tests migrations that should never be altered, once without an extra
+    // module installed, then with content_translation installed and finally
+    // with 'node_migrate_master' installed.
+    $migrations = [
       'test' => [
         'id' => 'test',
         'process' => [
           'nid' => 'nid',
         ],
       ],
-    ];
-    $tests[0]['expected_data'] = $tests[0]['source_data'];
-
-    // Test with a d6_taxonomy_vocabulary definition.
-    $tests[1]['source_data'] = [
       'd6_taxonomy_vocabulary' => [
         'id' => 'd6_taxonomy_vocabulary',
         'process' => [
@@ -66,116 +75,124 @@ public function providerMigrationPluginAlter() {
           ],
         ],
       ],
-      'test' => [
-        'id' => 'test',
+    ];
+    $tests[0]['modules'] = [];
+    $tests[0]['migrations'] = $migrations;
+    $tests[0]['expected_data'] = $tests[0]['migrations'];
+    $tests[1] = $tests[0];
+    $tests[1]['modules'] = ['content_translation'];
+    $tests[2] = $tests[0];
+    $tests[2]['modules'] = ['node_migrate_master'];
+
+    // Test d6_term_node and d6_term_node revisions are not altered without
+    // d6_taxonomy_vocabulary. d6_term_node_translation is not changed.
+    $migrations_src = [
+      'd6_term_node:2' => [
+        'id' => 'd6_term_node:2',
         'process' => [
-          'nid' => 'nid',
+          'nid' => [
+            [
+              'plugin' => 'migration_lookup',
+              'migration' => 'd6_node',
+              'source' => 'nid',
+            ],
+          ],
+        ],
+        'destination' => [
+          'plugin' => 'entity:node',
         ],
       ],
-    ];
-    $tests[1]['expected_data'] = $tests[1]['source_data'];
-
-    // Test with a d6_taxonomy_vocabulary and term_node definitions.
-    $tests[2] = $tests[1];
-    $tests[2]['source_data']['d6_term_node:2'] = [
-      'id' => 'd6_term_node:2',
-      'process' => [
-        'vid' => [
-          'plugin' => 'machine_name',
+      'd6_term_node_revision:4' => [
+        'id' => 'd6_term_node_revision:4',
+        'process' => [
+          'vid' => [
+            [
+              'plugin' => 'migration_lookup',
+              'migration' => 'd6_node_revision',
+              'source' => 'vid',
+            ],
+          ],
         ],
       ],
-    ];
-    $tests[2]['source_data']['d6_term_node_revision:4'] = [
-      'id' => 'd6_term_node_revision:4',
-      'process' => [
-        'vid' => [
-          'plugin' => 'machine_name',
+      'd6_term_node_translation:2' => [
+        'id' => 'd6_term_node_translation:2',
+        'process' => [
+          'dest_nid' => [
+            [
+              'plugin' => 'migration_lookup',
+              'migration' => 'd6_node_translation',
+              'source' => 'nid',
+            ],
+          ],
         ],
       ],
     ];
+    $tests[3]['modules'] = ['node_migrate_classic'];
+    $tests[3]['migrations'] = $migrations_src;
+    $tests[3]['expected_data'] = $migrations_src;
 
-    $tests[2]['expected_data'] = $tests[2]['source_data'];
-    $tests[2]['expected_data']['d6_term_node:2']['process']['taxonomy_forums'] = 'tid';
-    $tests[2]['expected_data']['d6_term_node_revision:4']['process']['field_'] = 'tid';
-
-    // Test with a d6_taxonomy_vocabulary and term_node_translation definition.
-    $tests[3] = $tests[1];
-    $tests[3]['source_data']['d6_term_node_translation:2'] = [
-      'id' => 'd6_term_node_translation:2',
+    // d6_term_node and d6_term_node revisions altered with
+    // d6_taxonomy_vocabulary. d6_term_node_translation is not altered.
+    $migrations_src['d6_taxonomy_vocabulary'] = [
+      'id' => 'd6_taxonomy_vocabulary',
       'process' => [
         'vid' => [
           'plugin' => 'machine_name',
         ],
       ],
     ];
+    $tests[4]['modules'] = ['node_migrate_classic'];
+    $tests[4]['migrations'] = $migrations_src;
+    $tests[4]['expected_data'] = $migrations_src;
+    $tests[4]['expected_data']['d6_term_node:2']['process']['taxonomy_forums'] = 'tid';
+    $tests[4]['expected_data']['d6_term_node_revision:4']['process']['field_'] = 'tid';
 
-    $tests[3]['expected_data'] = $tests[3]['source_data'];
-    return $tests;
-  }
+    // d6_term_node and d6_term_node revisions altered with
+    // d6_taxonomy_vocabulary. d6_term_node_translation is also altered
+    // when content_translation is enabled.
+    $tests[5]['modules'] = ['content_translation', 'node_migrate_classic'];
+    $tests[5]['migrations'] = $migrations_src;
+    $tests[5]['expected_data'] = $tests[4]['expected_data'];
+    $tests[5]['expected_data']['d6_term_node_translation:2']['process']['taxonomy_forums'] = 'tid';
 
-  /**
-   * Tests migrate_drupal_migrations_plugin_alter.
-   *
-   * @dataProvider providerMigrationPluginAlterTranslation
-   */
-  public function testMigrationPluginAlterTranslation($source, $expected) {
-    /** @var \Drupal\Core\Extension\ModuleInstaller $module_installer */
-    $module_installer = \Drupal::service('module_installer');
-    $module_installer->install(['content_translation']);
-    $definitions = $source;
-    migrate_drupal_migration_plugins_alter($definitions);
-    // Ensure the results have an 'id' key.
-    foreach ($definitions as $definition) {
-      $this->assertArrayHasKey('id', $definition);
-    }
-    $this->assertSame($expected, $definitions);
-
-  }
-
-  /**
-   * Data provider for providerMigrationPluginAlterTranslation().
-   */
-  public function providerMigrationPluginAlterTranslation() {
-    $tests = [];
-
-    // Test with a d6_taxonomy_vocabulary definition and
-    // d6_term_node_translation definitions.
-    $tests[0]['source_data'] = [
-      'd6_taxonomy_vocabulary' => [
-        'id' => 'd6_taxonomy_vocabulary',
-        'process' => [
-          'vid' => [
-            'plugin' => 'machine_name',
-          ],
-        ],
+    // Tests term node migrations when node_migrate_master is installed.
+    $tests[6] = $tests[2];
+    $tests[6]['modules'] = ['content_translation', 'node_migrate_master'];
+    $tests[6]['migrations'] = $migrations_src;
+    $tests[6]['expected_data'] = $tests[5]['expected_data'];
+    $tests[6]['expected_data']['d6_term_node:2']['process']['nid'][0] = [
+      'plugin' => 'migration_lookup',
+      'migration' => [
+        'd6_node_master',
+        'd6_node',
       ],
-      'test' => [
-        'id' => 'test',
-        'process' => [
-          'nid' => 'nid',
-        ],
-      ],
-      'd6_term_node_translation:2' => [
-        'id' => 'd6_term_node_translation:2',
-        'process' => [
-          'vid' => [
-            'plugin' => 'machine_name',
-          ],
-        ],
+      'source' => 'nid',
+    ];
+    $tests[6]['expected_data']['d6_term_node:2']['process']['nid'][2] = [
+      'plugin' => 'node_master_node_lookup',
+    ];
+    $tests[6]['expected_data']['d6_term_node_revision:4']['process']['vid'][0] = [
+      'plugin' => 'migration_lookup',
+      'migration' => [
+        'd6_node_master',
+        'd6_node_revision',
       ],
-      'd6_term_node_translation:4' => [
-        'id' => 'd6_term_node_translation:4',
-        'process' => [
-          'vid' => [
-            'plugin' => 'machine_name',
-          ],
-        ],
+      'source' => 'vid',
+    ];
+    $tests[6]['expected_data']['d6_term_node_revision:4']['process']['vid'][2] = [
+      'plugin' => 'node_master_node_revision_lookup',
+    ];
+    $tests[6]['expected_data']['d6_term_node_translation:2']['process']['dest_nid'][0] = [
+      'plugin' => 'migration_lookup',
+      'migration' => [
+        'd6_node_master',
+        'd6_node_translation',
       ],
+      'source' => 'nid',
+    ];
+    $tests[6]['expected_data']['d6_term_node_translation:2']['process']['dest_nid'][2] = [
+      'plugin' => 'node_master_node_translation_lookup',
     ];
-
-    $tests[0]['expected_data'] = $tests[0]['source_data'];
-    $tests[0]['expected_data']['d6_term_node_translation:2']['process']['taxonomy_forums'] = 'tid';
-    $tests[0]['expected_data']['d6_term_node_translation:4']['process']['field_'] = 'tid';
     return $tests;
   }
 
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php b/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php
index 84bb7cae3b..2bcf11ff03 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/Plugin/migrate/source/ContentEntityTest.php
@@ -321,6 +321,7 @@ public function testNodeSource() {
     $values = $node_source->current()->getSource();
     $this->assertEquals($this->bundle, $values['type'][0]['target_id']);
     $this->assertEquals(1, $values['nid']);
+    $this->assertEquals(1, $values['vid']);
     $this->assertEquals('en', $values['langcode']);
     $this->assertEquals(1, $values['status'][0]['value']);
     $this->assertEquals('Apples', $values['title'][0]['value']);
@@ -330,6 +331,7 @@ public function testNodeSource() {
     $values = $node_source->current()->getSource();
     $this->assertEquals($this->bundle, $values['type'][0]['target_id']);
     $this->assertEquals(1, $values['nid']);
+    $this->assertEquals(1, $values['vid']);
     $this->assertEquals('fr', $values['langcode']);
     $this->assertEquals(1, $values['status'][0]['value']);
     $this->assertEquals('Pommes', $values['title'][0]['value']);
@@ -369,11 +371,13 @@ public function testMediaSource() {
     $fields = $media_source->fields();
     $this->assertArrayHasKey('bundle', $fields);
     $this->assertArrayHasKey('mid', $fields);
+    $this->assertArrayHasKey('vid', $fields);
     $this->assertArrayHasKey('name', $fields);
     $this->assertArrayHasKey('status', $fields);
     $media_source->rewind();
     $values = $media_source->current()->getSource();
     $this->assertEquals(1, $values['mid']);
+    $this->assertEquals(1, $values['vid']);
     $this->assertEquals('Foo media', $values['name'][0]['value']);
     $this->assertNull($values['thumbnail'][0]['title']);
     $this->assertEquals(1, $values['uid'][0]['target_id']);
@@ -402,9 +406,11 @@ public function testTermSource() {
     $this->assertEquals(2, $term_source->count());
     $ids = $term_source->getIds();
     $this->assertArrayHasKey('langcode', $ids);
+    $this->assertArrayHasKey('revision_id', $ids);
     $this->assertArrayHasKey('tid', $ids);
     $fields = $term_source->fields();
     $this->assertArrayHasKey('vid', $fields);
+    $this->assertArrayHasKey('revision_id', $fields);
     $this->assertArrayHasKey('tid', $fields);
     $this->assertArrayHasKey('name', $fields);
     $term_source->rewind();
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsMasterTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsMasterTest.php
new file mode 100644
index 0000000000..9bbf82c3a6
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/FollowUpMigrationsMasterTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal\Kernel\d6;
+
+use Drupal\Tests\node\Kernel\Migrate\d6\MigrateNodeTestBase;
+
+/**
+ * Tests follow-up migrations.
+ *
+ * @group migrate_drupal
+ */
+class FollowUpMigrationsMasterTest extends FollowUpMigrationsTest {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'content_translation',
+    'language',
+    'menu_ui',
+    // A requirement for d6_node_translation.
+    'migrate_drupal_multilingual',
+    // Ensure master type migration.
+    'node_migrate_master',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    MigrateNodeTestBase::setUp();
+    $this->executeMigrations([
+      'language',
+      'd6_language_content_settings',
+      'd6_node_master',
+    ]);
+  }
+
+}
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 3620f0c3bf..9d98fc1287 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6AuditIdsTest.php
@@ -138,6 +138,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/FollowUpMigrationsMasterTest.php b/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsMasterTest.php
new file mode 100644
index 0000000000..da189a8d0a
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d7/FollowUpMigrationsMasterTest.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal\Kernel\d7;
+
+/**
+ * Tests follow-up migrations.
+ *
+ * @group migrate_drupal
+ */
+class FollowUpMigrationsMasterTest extends FollowUpMigrationsTest {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'content_translation',
+    'comment',
+    'datetime',
+    'image',
+    'language',
+    'link',
+    'menu_ui',
+    // A requirement for translation migrations.
+    'migrate_drupal_multilingual',
+    'node',
+    // Ensure master type migration.
+    'node_migrate_master',
+    'taxonomy',
+    'telephone',
+    'text',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    MigrateDrupal7TestBase::setUp();
+
+    $this->fileMigrationSetup();
+
+    $this->installEntitySchema('comment');
+    $this->installSchema('node', ['node_access']);
+
+    $this->migrateUsers();
+    $this->migrateFields();
+    $this->executeMigrations([
+      'language',
+      'd7_language_content_settings',
+      'd7_taxonomy_vocabulary',
+      'd7_node_master',
+    ]);
+  }
+
+}
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 b53ffa4d78..96a640cea2 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d7/MigrateDrupal7AuditIdsTest.php
@@ -138,6 +138,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..a628e8440c 100644
--- a/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/IdConflictForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\migrate\Audit\IdAuditor;
+use Drupal\migrate\Audit\NodeMasterIdAuditor;
 use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
 
 /**
@@ -39,6 +40,8 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $translated_content_conflicts = $content_conflicts = [];
 
     $results = (new IdAuditor())->auditMultiple($migrations);
+    $node_master_results = (new NodeMasterIdAuditor())->auditMultiple($migrations);
+    $results += $node_master_results;
 
     /** @var \Drupal\migrate\Audit\AuditResult $result */
     foreach ($results as $result) {
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
index 204e02314f..cda640e7a3 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/IdConflictTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/IdConflictTest.php
@@ -26,6 +26,7 @@ class IdConflictTest extends MigrateUpgradeExecuteTestBase {
     'statistics',
     // Required for translation migrations.
     'migrate_drupal_multilingual',
+    'node_migrate_master',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MultilingualReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MultilingualReviewPageTest.php
index dc3a6d68eb..b31fd9008a 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MultilingualReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MultilingualReviewPageTest.php
@@ -40,6 +40,7 @@ class MultilingualReviewPageTest extends MultilingualReviewPageTestBase {
     'migrate_state_no_file_test',
     // Test missing migrate_drupal.yml.
     'migrate_state_no_upgrade_path',
+    'node_migrate_master',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualReviewPageTest.php
index 469a73ca89..864f2dc839 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualReviewPageTest.php
@@ -35,6 +35,7 @@ class NoMultilingualReviewPageTest extends NoMultilingualReviewPageTestBase {
     'migrate_state_not_finished_test',
     // Test missing migrate_drupal.yml.
     'migrate_state_no_file_test',
+    'node_migrate_master',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualTest.php
index 20f7098bd3..2f28cd5271 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/NoMultilingualTest.php
@@ -26,6 +26,7 @@ class NoMultilingualTest extends MigrateUpgradeExecuteTestBase {
     'book',
     'forum',
     'statistics',
+    'node_migrate_master',
   ];
 
   /**
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..3cdb417679 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,31 @@ 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();
+
+    // Delete the existing content made to test the ID Conflict form. Migrations
+    // are to be done on a site without content. The test of the ID Conflict
+    // form is being moved to its own issue which will remove the deletion
+    // of the created nodes.
+    // See https://www.drupal.org/project/drupal/issues/3087061.
+    $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
index 4c923e8532..5d23dc14ad 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/IdConflictTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/IdConflictTest.php
@@ -28,6 +28,7 @@ class IdConflictTest extends MigrateUpgradeExecuteTestBase {
     'statistics',
     // Required for translation migrations.
     'migrate_drupal_multilingual',
+    'node_migrate_master',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MultilingualReviewPageTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MultilingualReviewPageTest.php
index b5fdc0239b..a439d4270e 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MultilingualReviewPageTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MultilingualReviewPageTest.php
@@ -37,6 +37,7 @@ class MultilingualReviewPageTest extends MultilingualReviewPageTestBase {
     'migrate_state_not_finished_test',
     // Test missing migrate_drupal.yml.
     'migrate_state_no_file_test',
+    'node_migrate_master',
   ];
 
   /**
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/NoMultilingualTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/NoMultilingualTest.php
index 46421a69f9..aa4bd4f029 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/NoMultilingualTest.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/NoMultilingualTest.php
@@ -27,6 +27,7 @@ class NoMultilingualTest extends MigrateUpgradeExecuteTestBase {
     'book',
     'forum',
     'statistics',
+    'node_migrate_master',
   ];
 
   /**
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 ba16905e72..9dab987ee9 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,31 @@ 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();
+
+    // Delete the existing content made to test the ID Conflict form. Migrations
+    // are to be done on a site without content. The test of the ID Conflict
+    // form is being moved to its own issue which will remove the deletion
+    // of the created nodes.
+    // See https://www.drupal.org/project/drupal/issues/3087061.
+    $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 +97,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 +108,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_classic/node_migrate_classic.info.yml b/core/modules/node/tests/modules/node_migrate_classic/node_migrate_classic.info.yml
new file mode 100644
index 0000000000..1cfac5fbcf
--- /dev/null
+++ b/core/modules/node/tests/modules/node_migrate_classic/node_migrate_classic.info.yml
@@ -0,0 +1,7 @@
+name: Node migrate classic
+type: module
+description: Use the classic node migrations.
+package: Testing
+version: VERSION
+core: 8.x
+hidden: true
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..915f38915b
--- /dev/null
+++ b/core/modules/node/tests/src/Kernel/Migrate/d6/MigrateNodeMasterTest.php
@@ -0,0 +1,1253 @@
+<?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();
+
+    $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() {
+    $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 a node_field_revision table row.
+   * @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 expected table rows.
+   */
+  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..1cd32f50a8
--- /dev/null
+++ b/core/modules/node/tests/src/Kernel/Migrate/d7/MigrateNodeMasterTest.php
@@ -0,0 +1,930 @@
+<?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']);
+
+    $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. Note that source node 1, uses entity translation which does
+    // not have a migration for revisions of translations.
+    // 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 a node_field_revision table row.
+   * @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 expected table rows.
+   */
+  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');
diff --git a/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeMaster.php b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeMaster.php
new file mode 100644
index 0000000000..d7b3ac1919
--- /dev/null
+++ b/core/modules/taxonomy/tests/src/Kernel/Migrate/d6/MigrateTermNodeMaster.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\Tests\taxonomy\Kernel\Migrate\d6;
+
+use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
+use Drupal\node\Entity\Node;
+
+/**
+ * Upgrade taxonomy term node associations.
+ *
+ * @group migrate_drupal_6
+ */
+class MigrateTermNodeMaster extends MigrateDrupal6TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'content_translation',
+    'language',
+    'menu_ui',
+    // A requirement for d6_node_translation.
+    'migrate_drupal_multilingual',
+    // Ensure master type migration.
+    'node_migrate_master',
+    'taxonomy',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('node', ['node_access']);
+    $this->installEntitySchema('node');
+
+    $this->executeMigration('language');
+    $this->migrateUsers(FALSE);
+    $this->migrateFields();
+    $this->executeMigrations(['d6_node_settings', 'd6_node_master']);
+    $this->migrateTaxonomy();
+    // This is a base plugin ID and we want to run all derivatives.
+    $this->executeMigrations(['d6_term_node']);
+  }
+
+  /**
+   * Tests the Drupal 6 term-node association to Drupal 8 migration.
+   */
+  public function testTermNode() {
+    $this->container->get('entity_type.manager')
+      ->getStorage('node')
+      ->resetCache([1, 2]);
+
+    $nodes = Node::loadMultiple([1, 2]);
+    $node = $nodes[1];
+    $this->assertSame(1, count($node->field_vocabulary_1_i_0_));
+    $this->assertSame('1', $node->field_vocabulary_1_i_0_[0]->target_id);
+    $node = $nodes[2];
+    $this->assertSame(2, count($node->field_vocabulary_2_i_1_));
+    $this->assertSame('2', $node->field_vocabulary_2_i_1_[0]->target_id);
+    $this->assertSame('3', $node->field_vocabulary_2_i_1_[1]->target_id);
+  }
+
+}
