diff --git a/cacheaudit.drush.inc b/cacheaudit.drush.inc
index 7ba7e00..d1be802 100644
--- a/cacheaudit.drush.inc
+++ b/cacheaudit.drush.inc
@@ -91,6 +91,94 @@ function views_cacheaudit() {
   return array('views' => $results);
 }
 
+function panels_cacheaudit() {
+  $results = array();
+  $results[] = array('Panel', 'Pane', 'Region', 'Cache', 'Lifetime', 'Granulairty');
+
+  foreach (_cacheaudit_get_panels() as $name => $panes) {
+    foreach ($panes as $pane) {
+      $cache = isset($pane->cache['method']) ? $pane->cache['method'] : '';
+      $lifetime = isset($pane->cache['method']) ? $pane->cache['settings']['lifetime'] : '';
+      $granularity = isset($pane->cache['method']) ? var_export($pane->cache['settings']['granularity'], TRUE) : '<not set>';
+      $results[] = array($name, $pane->subtype, $pane->panel, $cache, $lifetime, $granularity);
+    }
+  }
+
+  return array('panels' => $results);
+}
+
+/**
+ * @see http://drupalcode.org/project/cache_actions.git/blob/refs/heads/7.x-2.x:/cache_actions.rules.inc#l138
+ */
+function _cacheaudit_get_panels() {
+  $available_handlers = array();
+  // First, get all tasks. This corresponds to all types of page manager pages
+  // that can be used, for for instance pages, node view, node edit...
+  $tasks = page_manager_get_tasks();
+  foreach ($tasks as $task) {
+    // Subtasks are tasks that are created under the primary tasks, for instance
+    // a custom page the user has created.
+    $subtasks = page_manager_get_task_subtasks($task);
+    // If we have subtasks, then that's what we're after.
+    if (count($subtasks)) {
+      foreach ($subtasks as $subtask) {
+        // Subtasks have handlers. These can for instance correspond to a panel
+        // variant.
+        $handlers = page_manager_load_task_handlers($task, $subtask['name']);
+        foreach ($handlers as $handler) {
+          // Handlers have plugins, in this case we need to get the plugin for
+          // this handler.
+          $plugin = page_manager_get_task_handler($handler->handler);
+          $title = page_manager_get_handler_title($plugin, $handler, $task, $subtask['name']);
+          $key = 'task:' . $handler->name . ':' . $handler->task;
+          // Fetch available panes.
+          $handler_panes = _cacheaudit_load_panes($handler, $title);
+          foreach ($handler_panes as $pane_key => $handler_pane) {
+            $available_handlers[$handler->name][$pane_key] = $handler_pane;
+          }
+        }
+      }
+    }
+    else {
+      // Otherwise let's use the task.
+      $handlers = page_manager_load_task_handlers($task);
+      if (count($handlers)) {
+        foreach ($handlers as $handler) {
+          $plugin = page_manager_get_task_handler($handler->handler);
+          $title = page_manager_get_handler_title($plugin, $handler, $task, $task['name']);
+          // If not, then we have an in-code display. Save off the name, so we
+          // can get it.
+          // Fetch available panes.
+          $handler_panes = _cacheaudit_load_panes($handler, $title);
+          foreach ($handler_panes as $pane_key => $handler_pane) {
+            $available_handlers[$handler->name][$pane_key] = $handler_pane;
+          }
+        }
+      }
+    }
+  }
+  // Otherwise just return the handlers.
+  return $available_handlers;
+}
+
+/**
+ * @see http://drupalcode.org/project/cache_actions.git/blob/refs/heads/7.x-2.x:/cache_actions.rules.inc#l231
+ */
+function _cacheaudit_load_panes($handler) {
+  ctools_include('plugins', 'panels');
+  ctools_include('content');
+
+  $available_panes = array();
+  if (isset($handler->conf['did'])) {
+    $display = panels_load_display($handler->conf['did']);
+  }
+  else {
+    $display = $handler->conf['display'];
+  }
+
+  return isset($display->content) ? $display->content : array();
+}
+
 function cacheaudit_get_cache_constant($constant_value) {
   switch ($constant_value) {
   case DRUPAL_CACHE_CUSTOM:
