diff --git a/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php b/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php
index c2416a3..b9fcb1a 100644
--- a/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/UI/DisplayTest.php
@@ -148,7 +148,26 @@ public function testCloneDisplay() {
 
     $this->drupalGet($path_prefix);
     $this->drupalPost(NULL, array(), 'clone Page');
-    $this->assertLinkByHref($path_prefix . '/page_1', 0, 'Make sure after cloning the new display appears in the UI');
+    $this->assertLinkByHref($path_prefix . '/page_2', 0, 'Make sure after cloning the new display appears in the UI');
+    $this->assertUrl($path_prefix . '/page_2', array(), 'The user got redirected to the new display.');
+
+    // Override the title.
+    $random_title = $this->randomName();
+    $this->drupalPost("admin/structure/views/nojs/display/{$view['name']}/page_2/title", array('title' => $random_title), t('Apply'));
+
+    // Clone as a different display type.
+    $this->drupalPost(NULL, array(), 'clone as Block');
+    $this->assertLinkByHref($path_prefix . '/block_1', 0, 'Make sure after cloning the new display appears in the UI');
+    $this->assertUrl($path_prefix . '/block_1', array(), 'The user got redirected to the new display.');
+
+    $this->drupalPost(NULL, array(), t('Save'));
+    $view = views_get_view($view['name']);
+    $view->initDisplay();
+
+    $displays = $view->displayHandlers;
+    $this->assertTrue($displays['page_2'], 'The new page display got saved.');
+    $this->assertTrue($displays['block_1'], 'The new block display got saved.');
+    $this->assertEqual($displays['block_1']->getOption('title'), $random_title, 'The overridden option from the display got copied into the clone');
   }
 
   /**
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
index c8a2c96..2d14e8c 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewEditFormController.php
@@ -421,6 +421,21 @@ public function getDisplayDetails($view, $display) {
             "#suffix" => '</li>',
           );
         }
+
+        foreach (views_fetch_plugin_names('display', NULL, array($view->get('storage')->get('base_table'))) as $type => $label) {
+          if ($type == $display['display_plugin']) {
+            continue;
+          }
+
+          $build['top']['actions']['clone_as'][$type] = array(
+            '#type' => 'submit',
+            '#value' => t('clone as @type', array('@type' => $label)),
+            '#limit_validation_errors' => array(),
+            '#submit' => array(array($this, 'submitCloneAsDisplay'), array($this, 'submitDelayDestination')),
+            '#prefix' => '<li class="duplicate">',
+            '#suffix' => '</li>',
+          );
+        }
       }
       else {
         $build['top']['actions']['undo_delete'] = array(
@@ -766,6 +781,13 @@ public function submitDisplayAdd($form, &$form_state) {
   }
 
   /**
+   * Submit handler to clone a display as another display type.
+   */
+  public function submitCloneAsDisplay($form, &$form_state) {
+    $this->submitDisplayAdd($form, $form_state);
+  }
+
+  /**
    * Build a renderable array representing one option on the edit form.
    *
    * This function might be more logical as a method on an object, if a suitable
