diff --git a/core/lib/Drupal/Core/Form/FormHelper.php b/core/lib/Drupal/Core/Form/FormHelper.php
index 2cb9974..feae0b1 100644
--- a/core/lib/Drupal/Core/Form/FormHelper.php
+++ b/core/lib/Drupal/Core/Form/FormHelper.php
@@ -72,4 +72,25 @@ protected static function processStatesArray(array &$conditions, $search, $repla
     }
   }
 
+  /**
+   * Helper function to pass on the current request destination.
+   *
+   * @param array $options
+   *   An options array to pass the destination into.
+   *
+   * @return array
+   *   Options array with current destination for
+   *   FormStateInterface::setRedirect()
+   *
+   * @see \Drupal\Core\Form\FormStateInterface::setRedirect()
+   */
+  public static function redirectOptionsPassThroughDestination($options = []) {
+    if ($destination = \Drupal::request()->query->get('destination')) {
+      \Drupal::request()->query->remove('destination');
+      $options['query']['destination'] = $destination;
+    }
+
+    return $options;
+  }
+
 }
diff --git a/core/modules/node/src/Form/NodePreviewForm.php b/core/modules/node/src/Form/NodePreviewForm.php
index a126c9e..95075ca 100644
--- a/core/modules/node/src/Form/NodePreviewForm.php
+++ b/core/modules/node/src/Form/NodePreviewForm.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -78,7 +79,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->getRequest()->query->get('destination')) {
+      $query_options['query']['destination'] = $destination;
+    }
+
     $form['backlink'] = array(
       '#type' => 'link',
       '#title' => $this->t('Back to content editing'),
@@ -122,10 +130,12 @@ 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 = FormHelper::redirectOptionsPassThroughDestination();
+    $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 bb6c49d..f28e8ca 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Form\FormHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\user\PrivateTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -346,10 +347,13 @@ 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 = FormHelper::redirectOptionsPassThroughDestination();
+    $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 903636a..3b7121f 100644
--- a/core/modules/node/src/Tests/PagePreviewTest.php
+++ b/core/modules/node/src/Tests/PagePreviewTest.php
@@ -40,12 +40,17 @@ class PagePreviewTest extends NodeTestBase {
    */
   protected $fieldName;
 
+  /**
+   * The user account used in this test.
+   */
+  protected $webUser;
+
   protected function setUp() {
     parent::setUp();
     $this->addDefaultCommentField('node', 'page');
 
-    $web_user = $this->drupalCreateUser(array('edit own page content', 'create page content'));
-    $this->drupalLogin($web_user);
+    $this->webUser = $this->drupalCreateUser(array('edit own page content', 'create page content'));
+    $this->drupalLogin($this->webUser);
 
     // Add a vocabulary so we can test different view modes.
     $vocabulary = entity_create('taxonomy_vocabulary', array(
@@ -263,6 +268,17 @@ function testPagePreview() {
     $this->drupalPostForm('node/add/page', array($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, if set.
+    $this->drupalPostForm('node/' . $node->id() . '/edit', array(), t('Preview'), array('query' => array('destination' => 'user')));
+    $expected_url = \Drupal::url('entity.node.preview', array('node_preview' => $node->uuid(), 'view_mode_id' => 'default'), array('absolute' => TRUE));
+    $this->assertEqual($this->getUrl(), $expected_url);
+    $this->clickLink(t('Back to content editing'));
+    $this->drupalPostForm(NULL, array(), t('Save'));
+    $expected_url = \Drupal::url('entity.user.canonical', array('user' => $this->webUser->id()), array('absolute' => TRUE));
+    $this->assertEqual($this->getUrl(), $expected_url);
   }
 
   /**
