diff --git a/lib/Drupal/views/Tests/ViewTest.php b/lib/Drupal/views/Tests/ViewTest.php
index 17ee4f3c4c3889c44d270e78ced1b2d8bb44a840..3197734136cfdf28b3678123e8abf246148a0dd1 100644
--- a/lib/Drupal/views/Tests/ViewTest.php
+++ b/lib/Drupal/views/Tests/ViewTest.php
@@ -105,6 +105,45 @@ function testValidate() {
     // - Multiple displays are validating and the errors are merged together.
   }
 
+  /**
+   * Tests the createDuplicate() View method.
+   */
+  public function testCreateDuplicate() {
+    $view = views_get_view('archive');
+    $copy = $view->createDuplicate();
+
+    $this->assertTrue($copy instanceof View, 'The copied object is a View.');
+
+    // Check that the original view and the copy have different uuids.
+    $this->assertNotIdentical($view->uuid(), $copy->uuid(), 'The copied view has a new uuid.');
+
+    // Check the 'name' (id) is using the View objects default value ('') as it
+    // gets unset.
+    $this->assertIdentical($copy->id(), '', 'The ID has been reset.');
+
+    // Check the other properties.
+    // @todo Create a reusable property on the base test class for these?
+    $config_properties = array(
+      'disabled',
+      'api_version',
+      'description',
+      'tag',
+      'base_table',
+      'human_name',
+      'core',
+    );
+
+    foreach ($config_properties as $property) {
+      $this->assertIdentical($view->{$property}, $copy->{$property}, format_string('@property property is identical.', array('@property' => $property)));
+    }
+
+    // Check the displays are the same.
+    foreach ($view->display as $id => $display) {
+      // assertIdentical will not work here.
+      $this->assertEqual($display, $copy->display[$id], format_string('The @display display has been copied correctly.', array('@display' => $id)));
+    }
+  }
+
   /**
    * Overrides Drupal\views\Tests\ViewTestBase::getBasicView().
    */
diff --git a/lib/Drupal/views/View.php b/lib/Drupal/views/View.php
index 7247c08be6527e7b31b1577c91ddb9940695e1f1..1d9aadbcb9a92fd9954a874ef32ee002f1c7b4d0 100644
--- a/lib/Drupal/views/View.php
+++ b/lib/Drupal/views/View.php
@@ -1907,15 +1907,19 @@ public function endQueryCapture() {
   }
 
   /**
-   * Make a copy of this view that has been sanitized of all database IDs
-   * and handlers and other stuff.
+   * Overrides Drupal\entity\Entity::createDuplicate().
    *
-   * I'd call this clone() but it's reserved.
+   * Makes a copy of this view that has been sanitized of handlers, any runtime
+   *  data, ID, and UUID.
    */
-  public function copy() {
-    $code = $this->export();
-    eval($code);
-    return $view;
+  public function createDuplicate() {
+    $data = config('views.view.' . $this->id())->get();
+
+    // Reset the name and UUID.
+    unset($data['name']);
+    unset($data['uuid']);
+
+    return entity_create('view', $data);
   }
 
   /**