diff --git a/panelizer.module b/panelizer.module
index b31fc06..5085970 100644
--- a/panelizer.module
+++ b/panelizer.module
@@ -469,20 +469,12 @@ function panelizer_default_page_manager_handlers() {
  * Implement CTools access form caching callback: get.
  */
 function panelizer_ctools_access_get($argument) {
-  list($entity_type, $bundle, $name) = explode(':', $argument);
-  $handler = panelizer_entity_plugin_get_handler($entity_type);
-  $panelizer = $handler->get_default_panelizer_object($bundle, $name);
-
-  if (empty($panelizer)) {
-    return;
-  }
-
-  if (!$handler->access_default_panelizer_object($panelizer)) {
+  if (!$objects = panelizer_ctools_access_get_objects_from_args($argument)) {
     return;
   }
+  list($panelizer, $handler) = $objects;
 
   // First, see if there's a cache
-  ctools_include('object-cache');
   $access = ctools_object_cache_get('panelizer_access', $argument);
   if (!$access) {
     $access = $panelizer->access;
@@ -497,40 +489,53 @@ function panelizer_ctools_access_get($argument) {
  * Implement CTools access form caching callback: set.
  */
 function panelizer_ctools_access_set($argument, $access) {
-  list($entity_type, $bundle, $name) = explode(':', $argument);
-  $handler = panelizer_entity_plugin_get_handler($entity_type);
-  $panelizer = $handler->get_default_panelizer_object($bundle, $name);
-
-  if (empty($panelizer)) {
-    return;
-  }
-
-  if (!$handler->access_default_panelizer_object($panelizer)) {
-    return;
+  if (panelizer_ctools_access_get_objects_from_args($argument)) {
+    ctools_object_cache_set('panelizer_access', $argument, $access);
   }
-
-  ctools_include('object-cache');
-  ctools_object_cache_set('panelizer_access', $argument, $access);
 }
 
 /**
  * Implement CTools access form caching callback: get.
  */
 function panelizer_ctools_access_clear($argument) {
-  list($entity_type, $bundle, $name) = explode(':', $argument);
-  $handler = panelizer_entity_plugin_get_handler($entity_type);
-  $panelizer = $handler->get_default_panelizer_object($bundle, $name);
+  if (panelizer_ctools_access_get_objects_from_args($argument)) {
+    ctools_object_cache_clear('panelizer', $argument);
+  }
+}
 
-  if (empty($panelizer)) {
-    return;
+/**
+ * Get the Panelizer and related entity Handler from the acces arguments.
+ *
+ * If all object instances are correctly retrieved, the ctools object cache file
+ * is also included.
+ *
+ * @param string $argument
+ *   The access plugin arguments, that should look like:
+ *   [entity_type]:[bundle]:[name]:[view_mode]
+ *
+ * @return array
+ *   If all objects have been successfully loaded, an array whose values are:
+ *   - 0: The Panelizer instance.
+ *   - 1: The related entity Handler instance.
+ */
+function panelizer_ctools_access_get_objects_from_args($argument) {
+  $objects = array();
+  list($entity_type, $bundle,, $view_mode) = explode(':', $argument, 4);
+
+  if (isset($view_mode)) {
+    $bundle .= '.' . $view_mode;
   }
 
-  if (!$handler->access_default_panelizer_object($panelizer)) {
-    return;
+  $handler = panelizer_entity_plugin_get_handler($entity_type);
+  $panelizer = $handler->get_default_panelizer_object($bundle, $argument);
+
+  if (!empty($panelizer) && $handler->access_default_panelizer_object($panelizer)) {
+    $objects[] = $panelizer;
+    $objects[] = $handler;
+    ctools_include('object-cache');
   }
 
-  ctools_include('object-cache');
-  ctools_object_cache_clear('panelizer', $argument);
+  return $objects;
 }
 
 // -----------------------------------------------------------------------
@@ -631,6 +636,7 @@ function panelizer_entity_plugin_get_handler($plugin) {
 
   // If a string was passed, turn it into a plugin.
   if (is_string($plugin)) {
+
     $plugin = panelizer_get_entity_plugin($plugin);
     if (!$plugin) {
       return FALSE;
diff --git a/plugins/entity/PanelizerEntityDefault.class.php b/plugins/entity/PanelizerEntityDefault.class.php
index a113f52..74aff17 100644
--- a/plugins/entity/PanelizerEntityDefault.class.php
+++ b/plugins/entity/PanelizerEntityDefault.class.php
@@ -1395,6 +1395,8 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
 
   // Entity specific Drupal hooks
   public function hook_entity_load(&$entities) {
+    static $recursion_prevention = array();
+
     ctools_include('export');
     $ids = array();
     $vids = array();
@@ -1408,8 +1410,12 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
       }
 
       list($entity_id, $revision_id, $bundle) = entity_extract_ids($this->entity_type, $entity);
+      if (!empty($recursion_prevention[$this->entity_type][$entity_id])) {
+        return;
+      }
       if ($this->is_panelized($bundle)) {
         $ids[] = $entity_id;
+        $recursion_prevention[$this->entity_type][$entity_id] = TRUE;
         if ($this->supports_revisions) {
           $vids[] = $revision_id;
         }
@@ -1462,9 +1468,35 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
         // Load the default display for this entity bundle / view_mode.
         $name = $this->get_default_display_name($bundles[$entity_id], $view_mode);
 
+        $argument = $bundles[$entity_id] . '.' . $view_mode;
+
         // If no panelizer was loaded for the view mode, queue up defaults.
-        if (empty($panelizers[$entity_id][$view_mode]) && $this->has_default_panel($bundles[$entity_id] . '.' . $view_mode)) {
-          $defaults[$name] = $name;
+        if (empty($panelizers[$entity_id][$view_mode])) {
+          // If there is panel choices, we need to select the correct one.
+          if ($this->has_panel_choice($argument)) {
+            ctools_include('context');
+            $panelizer_acces = FALSE;
+
+            foreach ($this->get_default_panelizer_objects($argument) as $panelizer) {
+              if ($panelizer_acces = ctools_access($panelizer->access, $this->get_contexts($panelizer, $entity))) {
+                $entity->panelizer[$view_mode] = clone $panelizer;
+                $entity->panelizer[$view_mode]->entity_id = $entity_id;
+                $entity->panelizer[$view_mode]->revision_id = $revision_id;
+
+                // make sure this entity can't write to the default display.
+                $entity->panelizer[$view_mode]->did = NULL;
+                break;
+              }
+            }
+
+            if (!$panelizer_acces) {
+              unset($entity->panelizer[$view_mode]);
+            }
+          }
+          // Otherwise we take defaults.
+          elseif ($this->has_default_panel($argument)) {
+            $defaults[$name] = $name;
+          }
         }
         // Otherwise unpack the loaded panelizer.
         else if (!empty($panelizers[$entity_id][$view_mode])) {
@@ -1472,7 +1504,7 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
           // If somehow we have no name AND no did, fill in the default.
           // This can happen if use of defaults has switched around maybe?
           if (empty($entity->panelizer[$view_mode]->did) && empty($entity->panelizer[$view_mode]->name)) {
-            if ($this->has_default_panel($bundles[$entity_id] . '.' . $view_mode)) {
+            if ($this->has_default_panel($argument)) {
               $entity->panelizer[$view_mode]->name = $name;
             }
             else {
@@ -1517,6 +1549,7 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
     foreach ($entities as $entity_id => $entity) {
       // Skip not panelized bundles.
       if (empty($bundles[$entity_id])) {
+        $recursion_prevention[$this->entity_type][$entity_id] = FALSE;
         continue;
       }
 
@@ -1559,6 +1592,8 @@ abstract class PanelizerEntityDefault implements PanelizerEntityInterface {
           }
         }
       }
+
+      $recursion_prevention[$this->entity_type][$entity_id] = FALSE;
     }
   }
 
