diff --git a/includes/view.inc b/includes/view.inc
index d948b64..b0a1d69 100644
--- a/includes/view.inc
+++ b/includes/view.inc
@@ -449,29 +449,8 @@ class view extends views_db_object {
 
     // Instantiate all displays
     foreach (array_keys($this->display) as $id) {
-      // Correct for shallow cloning
-      // Often we'll have a cloned view so we don't mess up each other's
-      // displays, but the clone is pretty shallow and doesn't necessarily
-      // clone the displays. We can tell this by looking to see if a handler
-      // has already been set; if it has, but $this->current_display is not
-      // set, then something is dreadfully wrong.
-      if (!empty($this->display[$id]->handler)) {
-        $this->display[$id] = clone $this->display[$id];
-        unset($this->display[$id]->handler);
-      }
-      $this->display[$id]->handler = views_get_plugin('display', $this->display[$id]->display_plugin);
-      if (!empty($this->display[$id]->handler)) {
-        $this->display[$id]->handler->localization_keys = array($id);
-        // Initialize the new display handler with data.
-        $this->display[$id]->handler->init($this, $this->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.
-        // This assumes that the 'default' handler is always first. It always
-        // is. Make sure of it.
-        if ($id != 'default') {
-          $this->display[$id]->handler->default_display = &$this->display['default']->handler;
-        }
-      }
+      // To allow lazy initialization of the displays set the initialize all the displays with the main view object.
+      $this->display[$id]->init_view($this);
     }
 
     $this->current_display = 'default';
@@ -1419,10 +1398,8 @@ class view extends views_db_object {
 
     $this->is_attachment = TRUE;
     // Give other displays an opportunity to attach to the view.
-    foreach ($this->display as $id => $display) {
-      if (!empty($this->display[$id]->handler)) {
-        $this->display[$id]->handler->attach_to($this->current_display);
-      }
+    foreach ($this->display_handler->get_attached_displays() as $display_id) {
+      $this->display[$display_id]->handler->attach_to($this->current_display);
     }
     $this->is_attachment = FALSE;
   }
@@ -1777,6 +1754,7 @@ class view extends views_db_object {
 
       foreach ($result as $data) {
         $object = new $object_name(FALSE);
+        $object->init_view($view);
         $object->load_row($data);
 
         // Because it can get complicated with this much indirection,
@@ -1964,9 +1942,7 @@ class view extends views_db_object {
     $displays = array();
     foreach ($clone->display as $id => $display) {
       $displays[$id] = clone $display;
-      if (isset($displays[$id]->handler)) {
-        unset($displays[$id]->handler);
-      }
+      unset($displays[$id]->handler);
     }
     $clone->display = $displays;
 
@@ -1979,7 +1955,7 @@ class view extends views_db_object {
    */
   function destroy() {
     foreach (array_keys($this->display) as $display_id) {
-      if (isset($this->display[$display_id]->handler)) {
+      if ($this->display[$display_id]->handler_inited) {
         $this->display[$display_id]->handler->destroy();
         unset($this->display[$display_id]->handler);
       }
@@ -2407,7 +2383,7 @@ class views_db_object {
    * @return views_plugin_display
    *   A reference to the new handler object.
    */
-  function &new_display($type = 'page', $title = NULL, $id = NULL) {
+  function new_display($type = 'page', $title = NULL, $id = NULL) {
     $id = $this->add_display($type, $title, $id);
 
     // Create a handler
@@ -2546,9 +2522,13 @@ class views_display extends views_db_object {
   /**
    * The display handler itself, which has all the methods.
    *
+   * There is no actual property on the object to allow lazy initialization.
+   *
    * @var views_plugin_display
+   *
+   * @see views_display::__get()
    */
-  var $handler;
+  // var $handler;
 
   /**
    * Stores all options of the display, like fields, filters etc.
@@ -2558,15 +2538,97 @@ class views_display extends views_db_object {
   var $display_options;
 
   var $db_table = 'views_display';
+
+  /**
+   * Stores the view to which this display is attached to.
+   *
+   * @var View
+   */
+  protected $view;
+
+  /**
+   * Stores the display plugin of this display, for example 'page' or 'block'.
+   *
+   * @var string
+   */
+  public $display_plugin;
+
+  /**
+   * Stores the display_id of this display, for example 'page_1' or 'default'.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * Stores the title of this display, for example 'Page 1' or 'Master'.
+   *
+   * @var string
+   */
+  public $display_title;
+
+  public $handler_inited = FALSE;
+
   function views_display($init = TRUE) {
     parent::init($init);
   }
 
+  function init_view(View $view) {
+    $this->view = $view;
+  }
+
   function options($type, $id, $title) {
     $this->display_plugin = $type;
     $this->id = $id;
     $this->display_title = $title;
   }
+
+  /**
+   * Overrides the magic __get function to lazy initialize the display handler.
+   */
+  function &__get($name) {
+
+    // Lazy initialize the handler.
+    if ($name == 'handler') {
+      if ($this->handler_inited) {
+        $this->handler = views_get_plugin('display', $this->display_plugin);
+        $this->handler_inited = TRUE;
+        if (!empty($this->handler)) {
+          $this->handler->localization_keys = array($this->id);
+          // Initialize the new display handler with data.
+          $this->handler->init($this->view, $this);
+          // 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 ($this->id != 'default') {
+            $this->handler->default_display = &$this->view->display['default']->handler;
+          }
+        }
+      }
+      return $this->handler;
+    }
+    if (isset($this->{$name})) {
+      return $this->{$name};
+    }
+    else {
+      return NULL;
+    }
+  }
+
+  function __isset($name) {
+    if ($name == 'handler') {
+      if (!$this->handler_inited) {
+       $foo = 123;
+      }
+      return TRUE;
+    }
+    else {
+      return TRUE;
+    }
+  }
+
+
 }
 
 /**
diff --git a/plugins/views_plugin_display.inc b/plugins/views_plugin_display.inc
index 6be3dcc..e7d9af0 100644
--- a/plugins/views_plugin_display.inc
+++ b/plugins/views_plugin_display.inc
@@ -749,6 +749,32 @@ class views_plugin_display extends views_plugin {
   function uses_exposed_form_in_block() { return $this->has_path(); }
 
   /**
+   * Find out all displays which are attached to this display.
+   *
+   * The method is just using the pure storage object to avoid loading of the
+   * sub displays which would kill lazy loading.
+   *
+   * @return array
+   *  All display IDs that has this display attached.
+   */
+  public function get_attached_displays() {
+    $current_display_id = $this->display->id;
+    $attached_displays = array();
+
+    // Go through all displays and search displays which link to this one.
+    foreach ($this->view->display as $display_id => $display) {
+      if (isset($display->display_options['displays'])) {
+        $displays = $display->display_options['displays'];
+        if (isset($displays[$current_display_id])) {
+          $attached_displays[] = $display_id;
+        }
+      }
+    }
+
+    return $attached_displays;
+  }
+
+  /**
    * Check to see which display to use when creating links within
    * a view using this display.
    */
