diff --git a/core/modules/node/src/Form/NodePreviewForm.php b/core/modules/node/src/Form/NodePreviewForm.php
index d28b6b2..784d36f 100644
--- a/core/modules/node/src/Form/NodePreviewForm.php
+++ b/core/modules/node/src/Form/NodePreviewForm.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Routing\RedirectDestinationInterface;
 
 /**
  * Contains a form for switching the view mode of a node during preview.
@@ -31,10 +32,21 @@ class NodePreviewForm extends FormBase implements ContainerInjectionInterface {
   protected $configFactory;
 
   /**
+   * The redirect destination.
+   *
+   * @var \Drupal\Core\Routing\RedirectDestinationInterface
+   */
+  protected $redirectDestination;
+
+  /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
-    return new static($container->get('entity.manager'), $container->get('config.factory'));
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('config.factory'),
+      $container->get('redirect.destination')
+    );
   }
 
   /**
@@ -45,9 +57,10 @@ public static function create(ContainerInterface $container) {
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The configuration factory.
    */
-  public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory) {
+  public function __construct(EntityManagerInterface $entity_manager, ConfigFactoryInterface $config_factory, RedirectDestinationInterface $redirect_destination) {
     $this->entityManager = $entity_manager;
     $this->configFactory = $config_factory;
+    $this->redirectDestination = $redirect_destination;
   }
 
   /**
@@ -73,7 +86,14 @@ public function getFormId() {
   public function buildForm(array $form, FormStateInterface $form_state, EntityInterface $node = NULL) {
     $view_mode = $node->preview_view_mode;
 
-    $query_options = $node->isNew() ? array('query' => array('uuid' => $node->uuid())) : array();
+    $query_options = [];
+    if ($node->isNew()) {
+      $query_options['query']['uuid'] = $node->uuid();
+    }
+    if ($destination = $this->redirectDestination->get()) {
+      $query_options['query']['destination'] = $destination;
+    }
+
     $form['backlink'] = array(
       '#type' => 'link',
       '#title' => $this->t('Back to content editing'),
@@ -117,10 +137,16 @@ public function buildForm(array $form, FormStateInterface $form_state, EntityInt
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $form_state->setRedirect('entity.node.preview', array(
+    $route_params = [
       'node_preview' => $form_state->getValue('uuid'),
       'view_mode_id' => $form_state->getValue('view_mode'),
-    ));
+    ];
+    $options = $this->getRequest()->query->all();
+    if ($destination = $this->redirectDestination->get()) {
+      $this->getRequest()->query->remove('destination');
+      $options['query']['destination'] = $destination;
+    }
+    $form_state->setRedirect('entity.node.preview', $route_params, $options);
   }
 
 }
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 0e0f1a9..f82f266 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\user\PrivateTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Routing\RedirectDestinationInterface;
 
 /**
  * Form handler for the node edit forms.
@@ -21,9 +22,11 @@ class NodeForm extends ContentEntityForm {
   protected $tempStoreFactory;
 
   /**
-   * Whether this node has been previewed or not.
+   * The redirect destination.
+   *
+   * @var \Drupal\Core\Routing\RedirectDestinationInterface
    */
-  protected $hasBeenPreviewed = FALSE;
+  protected $redirectDestination;
 
   /**
    * Constructs a ContentEntityForm object.
@@ -33,9 +36,10 @@ class NodeForm extends ContentEntityForm {
    * @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
    *   The factory for the temp store object.
    */
-  public function __construct(EntityManagerInterface $entity_manager, PrivateTempStoreFactory $temp_store_factory) {
+  public function __construct(EntityManagerInterface $entity_manager, PrivateTempStoreFactory $temp_store_factory, RedirectDestinationInterface $redirect_destination) {
     parent::__construct($entity_manager);
     $this->tempStoreFactory = $temp_store_factory;
+    $this->redirectDestination = $redirect_destination;
   }
 
   /**
@@ -44,7 +48,8 @@ public function __construct(EntityManagerInterface $entity_manager, PrivateTempS
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('entity.manager'),
-      $container->get('user.private_tempstore')
+      $container->get('user.private_tempstore'),
+      $container->get('redirect.destination')
     );
   }
 
@@ -82,8 +87,10 @@ public function form(array $form, FormStateInterface $form_state) {
         $form_state->setValue($name, $value);
       }
 
-      // Rebuild the form.
-      $form_state->setRebuild();
+      // Cache the form state for submission request.
+      $form_state->setRequestMethod('POST');
+      $form_state->setCached();
+
       $this->entity = $preview->getFormObject()->getEntity();
       $this->entity->in_preview = NULL;
 
@@ -92,7 +99,7 @@ public function form(array $form, FormStateInterface $form_state) {
         $store->delete($uuid);
       }
 
-      $this->hasBeenPreviewed = TRUE;
+      $form_state->set('has_been_previewed', TRUE);
     }
 
     /** @var \Drupal\node\NodeInterface $node */
@@ -234,7 +241,7 @@ protected function actions(array $form, FormStateInterface $form_state) {
     $node = $this->entity;
     $preview_mode = $node->type->entity->getPreviewMode();
 
-    $element['submit']['#access'] = $preview_mode != DRUPAL_REQUIRED || $this->hasBeenPreviewed;
+    $element['submit']['#access'] = $preview_mode != DRUPAL_REQUIRED || $form_state->get('has_been_previewed');
 
     // If saving is an option, privileged users get dedicated form submit
     // buttons to adjust the publishing status while saving in one go.
@@ -341,10 +348,18 @@ public function preview(array $form, FormStateInterface $form_state) {
     $store = $this->tempStoreFactory->get('node_preview');
     $this->entity->in_preview = TRUE;
     $store->set($this->entity->uuid(), $form_state);
-    $form_state->setRedirect('entity.node.preview', array(
+
+    $route_params = [
       'node_preview' => $this->entity->uuid(),
       'view_mode_id' => 'default',
-    ));
+    ];
+
+    $options = [];
+    if ($destination = $this->redirectDestination->get()) {
+      $this->getRequest()->query->remove('destination');
+      $options['query']['destination'] = $destination;
+    }
+    $form_state->setRedirect('entity.node.preview', $route_params, $options);
   }
 
   /**
diff --git a/core/modules/node/src/Tests/PagePreviewTest.php b/core/modules/node/src/Tests/PagePreviewTest.php
index 2bfd2e7..e69035a 100644
--- a/core/modules/node/src/Tests/PagePreviewTest.php
+++ b/core/modules/node/src/Tests/PagePreviewTest.php
@@ -180,7 +180,7 @@ function testPagePreview() {
     $this->assertFieldByName('field_image[0][alt]', 'Picture of llamas');
 
     // Return to page preview to check everything is as expected.
-    $this->drupalPostForm(NULL, array(), t('Preview'));
+    $this->drupalPostForm(NULL, [], t('Preview'));
     $this->assertTitle(t('@title | Drupal', array('@title' => $edit[$title_key])), 'Basic page title is preview.');
     $this->assertEscaped($edit[$title_key], 'Title displayed and escaped.');
     $this->assertText($edit[$body_key], 'Body displayed.');
@@ -257,9 +257,19 @@ function testPagePreview() {
     $node_type->save();
     $this->drupalGet('node/add/page');
     $this->assertNoRaw('edit-submit');
-    $this->drupalPostForm('node/add/page', array($title_key => 'Preview'), t('Preview'));
+    $this->drupalPostForm('node/add/page', [$title_key => 'Preview'], t('Preview'));
     $this->clickLink(t('Back to content editing'));
     $this->assertRaw('edit-submit');
+
+    // Check that destination is remembered when clicking on preview. When
+    // going back to the edit form and clicking save, we should go back to
+    // the original destination, if set.
+    $destination = 'node';
+    $this->drupalPostForm('node/' . $node->id() . '/edit', [], t('Preview'), array('query' => array('destination' => $destination)));
+    $this->assertUrl($this->getUrl(), ['node_preview' => $node->uuid(), 'view_mode_id' => 'default'], ['absolute' => TRUE, 'query' => array('destination' => $destination)]);
+    $this->clickLink(t('Back to content editing'));
+    $this->drupalPostForm(NULL, [], t('Save'));
+    $this->assertUrl($destination);
   }
 
   /**
