diff --git a/core/modules/views/src/Form/ViewsForm.php b/core/modules/views/src/Form/ViewsForm.php
index cdf39eb..4951777 100644
--- a/core/modules/views/src/Form/ViewsForm.php
+++ b/core/modules/views/src/Form/ViewsForm.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Form\FormInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\UrlGeneratorInterface;
+use Drupal\Core\Url;
 use Drupal\views\ViewExecutable;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\RequestStack;
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index 11dce89..949a860 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -436,6 +436,23 @@ class ViewExecutable implements \Serializable {
   protected $routeProvider;
 
   /**
+   * If the view is currently being used for a live preview from the UI.
+   *
+   * @var bool
+   */
+  public $live_preview = FALSE;
+
+  /**
+   * If the view has been changed.
+   *
+   * @todo It is unclear whether this is actually used, both within the class
+   *   and outside.
+   *
+   * @var bool
+   */
+  public $changed = FALSE;
+
+  /**
    * Constructs a new ViewExecutable object.
    *
    * @param \Drupal\views\ViewEntityInterface $storage
@@ -1755,6 +1772,14 @@ public function hasUrl($args = NULL, $display_id = NULL) {
       return TRUE;
     }
 
+    if (!empty($this->live_preview)) {
+      return FALSE;
+    }
+
+    if (!empty($this->changed)) {
+      return FALSE;
+    }
+
     // If the display has a valid route available (either its own or for a
     // linked display), then we can provide a URL for it.
     $display_handler = $this->displayHandlers->get($display_id ?: $this->current_display)->getRoutedDisplay();
diff --git a/core/modules/views_ui/src/Tests/UITestBase.php b/core/modules/views_ui/src/Tests/UITestBase.php
index f8cef54..0638114 100644
--- a/core/modules/views_ui/src/Tests/UITestBase.php
+++ b/core/modules/views_ui/src/Tests/UITestBase.php
@@ -35,10 +35,18 @@
    */
   public static $modules = array('node', 'views_ui', 'block', 'taxonomy');
 
-  protected function setUp() {
+  /**
+   * Sets up a Drupal site for running functional and integration tests.
+   *
+   * @param boolean $enable_views_test_module
+   *   Whether views_test_data.module should be enabled or not.
+   */
+  protected function setUp($enable_views_test_module = TRUE) {
     parent::setUp();
 
-    $this->enableViewsTestModule();
+    if ($enable_views_test_module) {
+      $this->enableViewsTestModule();
+    }
 
     $this->adminUser = $this->drupalCreateUser(array('administer views'));
 
diff --git a/core/modules/views_ui/src/Tests/UnsavedPreviewTest.php b/core/modules/views_ui/src/Tests/UnsavedPreviewTest.php
new file mode 100644
index 0000000..78e940b
--- /dev/null
+++ b/core/modules/views_ui/src/Tests/UnsavedPreviewTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Contains of \Drupal\views_ui\Tests\UnsavedPreviewTest.
+ */
+
+namespace Drupal\views_ui\Tests;
+
+/**
+ * Tests covering Preview uf unsaved Views.
+ *
+ * @group views_ui
+ */
+class UnsavedPreviewTest extends UITestBase {
+
+  /**
+    * Views used by this test.
+    *
+    * @var array
+    */
+  public static $testViews = ['content'];
+
+  /**
+   * Sets up a Drupal site for running functional and integration tests.
+   */
+  protected function setUp() {
+    parent::setUp(FALSE);
+  }
+
+  /**
+   * Tests previews of unsaved new page displays.
+   */
+  public function testUsavedPageDisplayPreview() {
+    $this->drupalCreateContentType(['type' => 'page']);
+    for ($i = 0; $i < 5; $i++) {
+      $this->drupalCreateNode();
+    }
+
+    $this->drupalGet('admin/structure/views/view/content');
+    $this->assertResponse(200);
+
+    $this->drupalPostForm(NULL, [], t('Add Page'));
+    $this->assertResponse(200);
+
+    $this->drupalGet('admin/structure/views/nojs/display/content/page_2/path');
+    $this->assertResponse(200);
+
+    $this->drupalPostForm(NULL, ['path' => 'foo'], t('Apply'));
+    $this->assertResponse(200);
+
+    $this->drupalPostForm(NULL, [], t('Update preview'));
+    $this->assertResponse(200);
+  }
+
+}
diff --git a/core/modules/views_ui/src/ViewUI.php b/core/modules/views_ui/src/ViewUI.php
index 5aeac87..89c00fb 100644
--- a/core/modules/views_ui/src/ViewUI.php
+++ b/core/modules/views_ui/src/ViewUI.php
@@ -598,7 +598,7 @@ public function renderPreview($display_id, $args = array()) {
       $executable->setArguments($args);
 
       // Store the current view URL for later use:
-      if ($executable->display_handler->getOption('path')) {
+      if ($executable->hasUrl() && $executable->display_handler->getOption('path')) {
         $path = $executable->getUrl();
       }
 
