diff --git a/core/modules/views/lib/Drupal/views/DisplayArray.php b/core/modules/views/lib/Drupal/views/DisplayArray.php
new file mode 100644
index 0000000..08bb2b6
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/DisplayArray.php
@@ -0,0 +1,157 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\views\DisplayArray.
+ */
+
+namespace Drupal\views;
+
+/**
+ * A class which wraps the displays of a view so you can lazy-initialize them.
+ */
+class DisplayArray implements \ArrayAccess, \Iterator, \Countable {
+
+  /**
+   * Stores a reference to the view which has this displays attached.
+   *
+   * @var \Drupal\views\ViewExecutable
+   */
+  protected $view;
+
+  /**
+   * Stores the actual display instances in an array.
+   *
+   * @var array
+   */
+  protected $displayHandlers = array();
+
+  /**
+   * Stores all display IDs, coming from $this->view->storage->display.
+   *
+   * @var array
+   */
+  protected $displayIDs;
+
+  /**
+   * Constructs a DisplayArray object.
+   *
+   * @param \Drupal\views\ViewExecutable
+   *   The view which has this displays attached.
+   */
+  public function __construct(ViewExecutable $view) {
+    $this->view = $view;
+
+    $this->initializeDisplay('default');
+
+    // Store all display IDs to access them easy and fast.
+    $this->displayIDs = drupal_map_assoc(array_keys($this->view->storage->display));
+  }
+
+  /**
+   * Destructs a DisplayArray object.
+   */
+  public function __destruct() {
+    foreach ($this->displayHandlers as $display_id => $display) {
+      $display->destroy();
+      unset($this->displayHandlers[$display_id]);
+    }
+  }
+
+  /**
+   * Initializes a single display and stores the result in $this->displayHandlers.
+   *
+   * @param string $display_id
+   *   The name of the display to initialize.
+   */
+  protected function initializeDisplay($display_id) {
+    // If the display was initialize before just return.
+    if (isset($this->displayHandlers[$display_id])) {
+      return;
+    }
+
+    // Retrieve and initialize the new display handler with data.
+    $this->displayHandlers[$display_id] = views_get_plugin('display', $this->view->storage->display[$display_id]['display_plugin']);
+    $this->displayHandlers[$display_id]->init($this->view, $this->view->storage->display[$display_id]);
+    // If this is not the default display handler, let it know which is since
+    // it may well utilize some data from the default.
+    if ($display_id != 'default') {
+      $this->displayHandlers[$display_id]->default_display = $this->displayHandlers['default'];
+    }
+  }
+
+  /**
+   * Implements \ArrayAccess::offsetExists().
+   */
+  public function offsetExists($offset) {
+    return isset($this->displayHandlers[$offset]) || isset($this->displayIDs[$offset]);
+  }
+
+  /**
+   * Implements \ArrayAccess::offsetGet().
+   */
+  public function offsetGet($offset) {
+    if (!isset($this->displayHandlers[$offset])) {
+      $this->initializeDisplay($offset);
+    }
+    return $this->displayHandlers[$offset];
+  }
+
+  /**
+   * Implements \ArrayAccess::offsetSet().
+   */
+  public function offsetSet($offset, $value) {
+    $this->displayHandlers[$offset] = $value;
+  }
+
+  /**
+   * Implements \ArrayAccess::offsetUnset().
+   */
+  public function offsetUnset($offset) {
+    unset($this->displayHandlers[$offset]);
+  }
+
+  /**
+   * Implements \Iterator::current().
+   */
+  public function current() {
+    return $this->offsetGet($this->key());
+  }
+
+  /**
+   * Implements \Iterator::next().
+   */
+  public function next() {
+    next($this->displayIDs);
+  }
+
+  /**
+   * Implements \Iterator::key().
+   */
+  public function key() {
+    return key($this->displayIDs);
+  }
+
+  /**
+   * Implements \Iterator::valid().
+   */
+  public function valid() {
+    $key = key($this->displayIDs);
+    return $key !== NULL && $key !== FALSE;
+  }
+
+  /**
+   * Implements \Iterator::rewind().
+   */
+  public function rewind() {
+    reset($this->displayIDs);
+  }
+
+  /**
+   * Implements \Countable::count().
+   */
+  public function count() {
+    return count($this->displayIDs);
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Core/Entity/View.php b/core/modules/views/lib/Drupal/views/Plugin/Core/Entity/View.php
index 409128e..eef9cc3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Core/Entity/View.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Core/Entity/View.php
@@ -342,7 +342,7 @@ protected function generateDisplayId($plugin_id) {
    * @return Drupal\views\Plugin\views\display\DisplayPluginBase
    *   A reference to the new handler object.
    */
-  public function &newDisplay($plugin_id = 'page', $title = NULL, $id = NULL) {
+  public function newDisplay($plugin_id = 'page', $title = NULL, $id = NULL) {
     $id = $this->addDisplay($plugin_id, $title, $id);
     return $this->getExecutable()->newDisplay($id);
   }
diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewExecutableTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewExecutableTest.php
index 9fb3fbc..a2d7f8a 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ViewExecutableTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewExecutableTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\views\Tests;
 
 use Drupal\views\ViewExecutable;
+use Drupal\views\DisplayArray;
 use Drupal\views\Plugin\views\display\DefaultDisplay;
 use Drupal\views\Plugin\views\display\Page;
 
@@ -120,8 +121,7 @@ public function testDisplays() {
 
     // Tests Drupal\views\ViewExecutable::initDisplay().
     $view->initDisplay();
-    $count = count($view->displayHandlers);
-    $this->assertEqual($count, 3, format_string('Make sure all display handlers got instantiated (@count of @count_expected)', array('@count' => $count, '@count_expected' => 3)));
+    $this->assertTrue($view->displayHandlers instanceof DisplayArray, 'The displayHandlers property has the right class.');
     // Tests the classes of the instances.
     $this->assertTrue($view->displayHandlers['default'] instanceof DefaultDisplay);
     $this->assertTrue($view->displayHandlers['page'] instanceof Page);
diff --git a/core/modules/views/lib/Drupal/views/ViewExecutable.php b/core/modules/views/lib/Drupal/views/ViewExecutable.php
index 0367905..32b1cc1 100644
--- a/core/modules/views/lib/Drupal/views/ViewExecutable.php
+++ b/core/modules/views/lib/Drupal/views/ViewExecutable.php
@@ -575,22 +575,8 @@ public function initDisplay() {
       return TRUE;
     }
 
-    // Instantiate all displays
-    foreach ($this->storage->get('display') as $id => $display) {
-      $this->displayHandlers[$id] = views_get_plugin('display', $display['display_plugin']);
-      if (!empty($this->displayHandlers[$id])) {
-        // Initialize the new display handler with data.
-        // @todo Refactor display to not need the handler data by reference.
-        $this->displayHandlers[$id]->init($this, $this->storage->getDisplay($id));
-        // If this is NOT the default display handler, let it know which is
-        // since it may well utilize some data from the default.
-        // This assumes that the 'default' handler is always first. It always
-        // is. Make sure of it.
-        if ($id != 'default') {
-          $this->displayHandlers[$id]->default_display =& $this->displayHandlers['default'];
-        }
-      }
-    }
+    // Initialize the display cache array.
+    $this->displayHandlers = new DisplayArray($this);
 
     $this->current_display = 'default';
     $this->display_handler = $this->displayHandlers['default'];
@@ -1829,12 +1815,7 @@ public function cloneView() {
    * collected.
    */
   public function destroy() {
-    foreach (array_keys($this->displayHandlers) as $display_id) {
-      if (isset($this->displayHandlers[$display_id])) {
-        $this->displayHandlers[$display_id]->destroy();
-        unset($this->displayHandlers[$display_id]);
-      }
-    }
+    unset($this->displayHandlers);
 
     foreach ($this::viewsHandlerTypes() as $type => $info) {
       if (isset($this->$type)) {
@@ -2210,7 +2191,7 @@ public function setItemOption($display_id, $type, $id, $option, $value) {
    * @return Drupal\views\Plugin\views\display\DisplayPluginBase
    *   A reference to the new handler object.
    */
-  public function &newDisplay($id) {
+  public function newDisplay($id) {
     // Create a handler.
     $display = $this->storage->get('display');
     $this->displayHandlers[$id] = views_get_plugin('display', $display[$id]['display_plugin']);
