diff --git a/panels_mini/panels_mini.module b/panels_mini/panels_mini.module
index 231079a..b2bea69 100644
--- a/panels_mini/panels_mini.module
+++ b/panels_mini/panels_mini.module
@@ -145,6 +145,20 @@ function panels_mini_block_list_alter(&$blocks) {
   if (module_exists('page_manager')) {
     $current_page = page_manager_get_current_page();
   }
+
+  $count = 0;
+  foreach ($blocks as $key => $block) {
+    if ($block->module != 'panels_mini') {
+      // This block was added by a contrib module, leave it in the list.
+      continue;
+    }
+    $count++;
+  }
+  if ($count > 15) {
+    // Load add at once to save time.
+    panels_mini_load_all();
+  }
+
   foreach ($blocks as $key => $block) {
     if ($block->module != 'panels_mini') {
       // This block was added by a contrib module, leave it in the list.
@@ -253,23 +267,31 @@ function panels_mini_load($name) {
   // We use array_key_exists because failed loads will be NULL and
   // isset() will try to load it again.
   if (!array_key_exists($name, $cache)) {
-    ctools_include('export');
-    $result = ctools_export_load_object('panels_mini', 'names', array($name));
-    if (isset($result[$name])) {
-      if (empty($result[$name]->display)) {
-        $result[$name]->display = panels_load_display($result[$name]->did);
-        if (!empty($result[$name]->title) && empty($result[$name]->display->title)) {
-          $result[$name]->display->title = $result[$name]->title;
+    $cid = 'panels_mini_load:' . $name;
+    $result = cache_get($cid);
+    if (!empty($result->data)) {
+      $cache[$name] = $result->data;
+    }
+    else {
+      ctools_include('export');
+      $result = ctools_export_load_object('panels_mini', 'names', array($name));
+      if (isset($result[$name])) {
+        if (empty($result[$name]->display)) {
+          $result[$name]->display = panels_load_display($result[$name]->did);
+          if (!empty($result[$name]->title) && empty($result[$name]->display->title)) {
+            $result[$name]->display->title = $result[$name]->title;
+          }
+        }
+        $cache[$name] = $result[$name];
+        if (!empty($result[$name]->title) && empty($result[$name]->admin_title)) {
+          $cache[$name]->admin_title = $result[$name]->title;
         }
+        cache_set($cid, $cache[$name], 'cache', CACHE_TEMPORARY);
       }
-      $cache[$name] = $result[$name];
-      if (!empty($result[$name]->title) && empty($result[$name]->admin_title)) {
-        $cache[$name]->admin_title = $result[$name]->title;
+      else {
+        $cache[$name] = NULL;
       }
     }
-    else {
-      $cache[$name] = NULL;
-    }
   }
 
   if (isset($cache[$name])) {
@@ -291,6 +313,25 @@ function panels_mini_load_all($reset = FALSE) {
     if ($reset) {
       $cache = array();
     }
+    else {
+      $panel_names = db_select('panels_mini', 'pm')
+        ->fields('pm', array('name'))
+        ->execute();
+      $cids = array();
+      foreach ($panel_names as $name) {
+        $cids[] = 'panels_mini_load:' . $name->name;
+      }
+      $output = cache_get_multiple($cids);
+      foreach ($output as $mini) {
+        if (!empty($mini->data)) {
+          $mini = $mini->data;
+          $cache[$mini->name] = $mini;
+        }
+      }
+      if (empty($cids)) {
+        return array_filter($cache);
+      }
+    }
 
     ctools_include('export');
     $minis = ctools_export_load_object('panels_mini');
