diff --git a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
index 536303e..2120311 100644
--- a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
+++ b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
@@ -14,8 +14,11 @@
 
 /**
  * Deriver for Drupal 6 node and node revision migrations based on node types.
+ *
+ * @internal
  */
 class D6NodeDeriver extends DeriverBase implements ContainerDeriverInterface {
+
   use MigrationDeriverTrait;
 
   /**
@@ -61,6 +64,13 @@ class D6NodeDeriver extends DeriverBase implements ContainerDeriverInterface {
   protected $includeTranslations;
 
   /**
+   * Whether or not to include terms.
+   *
+   * @var bool
+   */
+  protected $includeTerms;
+
+  /**
    * D6NodeDeriver constructor.
    *
    * @param string $base_plugin_id
@@ -72,11 +82,12 @@ class D6NodeDeriver extends DeriverBase implements ContainerDeriverInterface {
    * @param bool $translations
    *   Whether or not to include translations.
    */
-  public function __construct($base_plugin_id, MigrateCckFieldPluginManagerInterface $cck_manager, MigrateFieldPluginManagerInterface $field_manager, $translations) {
+  public function __construct($base_plugin_id, MigrateCckFieldPluginManagerInterface $cck_manager, MigrateFieldPluginManagerInterface $field_manager, $translations, $terms) {
     $this->basePluginId = $base_plugin_id;
     $this->cckPluginManager = $cck_manager;
     $this->fieldPluginManager = $field_manager;
     $this->includeTranslations = $translations;
+    $this->includeTerms = $terms;
   }
 
   /**
@@ -88,7 +99,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
       $base_plugin_id,
       $container->get('plugin.manager.migrate.cckfield'),
       $container->get('plugin.manager.migrate.field'),
-      $container->get('module_handler')->moduleExists('content_translation')
+      $container->get('module_handler')->moduleExists('content_translation'),
+      $container->get('module_handler')->moduleExists('taxonomy')
     );
   }
 
@@ -135,6 +147,22 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       // below we'll create a migration just for the node properties.
     }
 
+    // If the taxonomy module does not exist, then we do not have any terms.
+    if ($this->includeTerms) {
+      try {
+        $source_plugin = static::getSourcePlugin('d6_taxonomy_vocabulary_per_type');
+        $source_plugin->checkRequirements();
+
+        foreach ($source_plugin as $row) {
+          $fields[$row->getSourceProperty('type')][$row->getSourceProperty('vid')] = $row->getSourceProperty('vid');
+        }
+      }
+      catch (RequirementsException $e) {
+        // If checkRequirements() failed then the taxonomy module did not exist
+        // and we do not have any taxonomy reference fields.
+      }
+    }
+
     try {
       foreach ($node_types as $row) {
         $node_type = $row->getSourceProperty('type');
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/Node.php b/core/modules/node/src/Plugin/migrate/source/d6/Node.php
index ffa2659..54a1784 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/Node.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/Node.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Extension\ModuleHandler;
 use Drupal\Core\State\StateInterface;
+use Drupal\migrate\Plugin\MigrationDeriverTrait;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
@@ -20,12 +21,19 @@
  */
 class Node extends DrupalSqlBase {
 
+  use MigrationDeriverTrait;
+
   /**
    * The join options between the node and the node_revisions table.
    */
   const JOIN = 'n.vid = nr.vid';
 
   /**
+   * The join options between the node and the term node table.
+   */
+  const TERM_JOIN = 'n.vid = nr.vid';
+
+  /**
    * The default filter format.
    *
    * @var string
@@ -172,6 +180,18 @@ public function prepareRow(Row $row) {
       $row->setSourceProperty('tnid', $row->getSourceProperty('nid'));
     }
 
+    if ($this->moduleExists('taxonomy')) {
+      // Select the terms belonging to the revision selected.
+      foreach (static::getSourcePlugin('d6_taxonomy_vocabulary') as $vocabulary) {
+        $query = $this->select('term_node', 'tn')
+          ->fields('tn', ['tid'])
+          ->condition('n.nid', $vocabulary->getSourceProperty('nid'));
+        $query->join('node', 'n', static::TERM_JOIN);
+        $query->innerJoin('term_data', 'td', 'td.tid = tn.tid AND td.vid = :vid', [':vid' => $vocabulary->getSourceProperty('vid')]);
+        $row->setSourceProperty($vocabulary->getSourceProperty('vid'), $query->execute()->fetchCol());
+      }
+    }
+
     return parent::prepareRow($row);
   }
 
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php b/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
index f3296c2..b15bf03 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
@@ -13,13 +13,18 @@
 class NodeRevision extends Node {
 
   /**
-   * The join options between the node and the node_revisions_table.
+   * {@inheritdoc}
    */
   const JOIN = 'n.nid = nr.nid AND n.vid <> nr.vid';
 
   /**
    * {@inheritdoc}
    */
+  const TERM_JOIN = 'tn.nid = n.nid AND tn.vid != n.vid';
+
+  /**
+   * {@inheritdoc}
+   */
   public function fields() {
     // Use all the node fields plus the vid that identifies the version.
     return parent::fields() + [
