diff --git a/core/modules/node/migration_templates/d6_node.yml b/core/modules/node/migration_templates/d6_node.yml
index 56d0459..dcfae61 100644
--- a/core/modules/node/migration_templates/d6_node.yml
+++ b/core/modules/node/migration_templates/d6_node.yml
@@ -49,6 +49,7 @@ migration_dependencies:
     - d6_node_settings
     - d6_filter_format
   optional:
+    - d6_vocabulary_field_instance
     - d6_field_instance_widget_settings
     - d6_field_formatter_settings
     - d6_upload_field_instance
diff --git a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
index 536303e..904c2f8 100644
--- a/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
+++ b/core/modules/node/src/Plugin/migrate/D6NodeDeriver.php
@@ -14,6 +14,8 @@
 
 /**
  * Deriver for Drupal 6 node and node revision migrations based on node types.
+ *
+ * @internal
  */
 class D6NodeDeriver extends DeriverBase implements ContainerDeriverInterface {
   use MigrationDeriverTrait;
@@ -61,6 +63,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 +81,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 +98,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 +146,16 @@ 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) {
+      $source_plugin = static::getSourcePlugin('d6_vocabulary_field_instance');
+      $source_plugin->checkRequirements();
+
+      foreach ($source_plugin as $row) {
+        $fields[$row->getSourceProperty('bundle')][$row->getSourceProperty('field_name')] = $row->getSourceProperty('field_name');
+      }
+    }
+
     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..e92840b 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,6 +21,8 @@
  */
 class Node extends DrupalSqlBase {
 
+  use MigrationDeriverTrait;
+
   /**
    * The join options between the node and the node_revisions table.
    */
@@ -172,6 +175,20 @@ 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::JOIN);
+        $query->innerJoin('term_data', 'td', 'td.tid = tn.tid AND td.vid = :vid', [':vid' => $vocabulary->getSourceProperty('vid')]);
+        if ($tid = $query->execute()->fetchCol()) {
+          $row->setSourceProperty($vocabulary->getSourceProperty('vid'), $tid);
+        }
+      }
+    }
+
     return parent::prepareRow($row);
   }
 
