diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index e9ccb3e..87c6e4b 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -14,6 +14,7 @@
 use Drupal\Core\Extension\Extension;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\node\NodeInterface;
 use Drupal\taxonomy\Entity\Vocabulary;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 use Drupal\user\Entity\User;
@@ -150,7 +151,7 @@ function forum_entity_bundle_field_info_alter(&$fields, \Drupal\Core\Entity\Enti
  *
  * Assigns the forum taxonomy when adding a topic from within a forum.
  */
-function forum_node_presave(EntityInterface $node) {
+function forum_node_presave(NodeInterface $node) {
   if (\Drupal::service('forum_manager')->checkNodeType($node)) {
     // Make sure all fields are set properly:
     $node->icon = !empty($node->icon) ? $node->icon : '';
@@ -161,6 +162,7 @@ function forum_node_presave(EntityInterface $node) {
         $old_tid = \Drupal::service('forum.index_storage')->getOriginalTermId($node);
         if ($old_tid && isset($node->forum_tid) && ($node->forum_tid != $old_tid) && !empty($node->shadow)) {
           // A shadow copy needs to be created. Retain new term and add old term.
+          $node->setNewRevision(TRUE);
           $node->taxonomy_forums[count($node->taxonomy_forums)] = array('target_id' => $old_tid);
         }
       }
@@ -334,6 +336,7 @@ function forum_form_node_form_alter(&$form, FormStateInterface $form_state, $for
       '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'),
     );
     $form['forum_tid'] = array('#type' => 'value', '#value' => $node->forum_tid);
+    $form['#entity_builders'][] = 'forum_node_form_entity_builder';
   }
 
   if (isset($form['taxonomy_forums'])) {
@@ -352,6 +355,15 @@ function forum_form_node_form_alter(&$form, FormStateInterface $form_state, $for
 }
 
 /**
+ * Entity builder for the node edit form.
+ *
+ * @see forum_form_node_form_alter()
+ */
+function forum_node_form_entity_builder($entity_type, NodeInterface $node, &$form, FormStateInterface $form_state) {
+  $node->shadow = $form_state->getValue('shadow');
+}
+
+/**
  * Implements hook_preprocess_HOOK() for block templates.
  */
 function forum_preprocess_block(&$variables) {
diff --git a/core/modules/forum/src/ForumIndexStorage.php b/core/modules/forum/src/ForumIndexStorage.php
index b50f29b..22921cb 100644
--- a/core/modules/forum/src/ForumIndexStorage.php
+++ b/core/modules/forum/src/ForumIndexStorage.php
@@ -85,10 +85,23 @@ public function deleteRevision(NodeInterface $node) {
    * {@inheritdoc}
    */
   public function update(NodeInterface $node) {
-    $this->database->update('forum')
-      ->fields(array('tid' => $node->forum_tid))
-      ->condition('vid', $node->getRevisionId())
-      ->execute();
+    if (count($node->forum_tid) > 1) {
+      // If there is more than one value, we're leaving a shadow.
+      // Create a new record.
+      $this->database->insert('forum')
+        ->fields(array(
+          'tid' => $node->forum_tid,
+          'vid' => $node->getRevisionId(),
+          'nid' => $node->id(),
+        ))
+        ->execute();
+    }
+    else {
+      $this->database->update('forum')
+        ->fields(array('tid' => $node->forum_tid))
+        ->condition('vid', $node->getRevisionId())
+        ->execute();
+    }
   }
 
   /**
diff --git a/core/modules/forum/src/Tests/ForumTest.php b/core/modules/forum/src/Tests/ForumTest.php
index 9440179..357b1da 100644
--- a/core/modules/forum/src/Tests/ForumTest.php
+++ b/core/modules/forum/src/Tests/ForumTest.php
@@ -623,11 +623,16 @@ private function verifyForums(EntityInterface $node, $admin, $response = 200) {
       $this->assertRaw(t('Forum topic %title has been updated.', array('%title' => $edit['title[0][value]'])), 'Forum node was edited');
 
       // Verify topic was moved to a different forum.
-      $forum_tid = db_query("SELECT tid FROM {forum} WHERE nid = :nid AND vid = :vid", array(
+      $forum_tids = db_query("SELECT tid FROM {forum} WHERE nid = :nid", array(
         ':nid' => $node->id(),
-        ':vid' => $node->getRevisionId(),
-      ))->fetchField();
-      $this->assertTrue($forum_tid == $this->rootForum['tid'], 'The forum topic is linked to a different forum');
+      ))->fetchCol();
+      $expected = [$this->rootForum['tid'], $this->forum['tid']];
+      $difference = array_diff($expected, $forum_tids);
+      $this->assertTrue(empty($difference), 'The forum topic is linked to a different forum and the shadow remains');
+
+      // Verify the shadow topic title is shown.
+      $this->drupalGet('forum/' . $this->forum['tid']);
+      $this->assertRaw($edit['title[0][value]'], 'Shadow topic title is shown');
 
       // Delete forum node.
       $this->drupalPostForm('node/' . $node->id() . '/delete', array(), t('Delete'));
