diff --git a/queue_ui.module b/queue_ui.module
index e1f8014..33e5e56 100644
--- a/queue_ui.module
+++ b/queue_ui.module
@@ -172,18 +172,19 @@ function queue_ui_queue_names() {
 /**
  * Get queues.
  *
- * @return Array of queues indexed by name and containing queue object and number
+ * @return
+ *   Array of queues indexed by name and containing queue object and number
  * of items.
  */
 function queue_ui_queues() {
   $queues = array();
-  $queue_names = queue_ui_queue_names();
+  $queue_names = array_keys(queue_ui_defined_queues());
   if (!empty($queue_names)) {
     // Build array of queues indexed by name with number of items.
     foreach ($queue_names as $name) {
-      $queue = DrupalQueue::get($name->name);
+      $queue = DrupalQueue::get($name);
       $class = get_class($queue);
-      $queues[$class][$name->name] = array(
+      $queues[$class][$name] = array(
         'queue' => $queue,
         'items' => $queue->numberOfItems(),
       );
@@ -193,41 +194,54 @@ function queue_ui_queues() {
 }
 
 /**
- * Get queues defined with hook_queue_info().
+ * Get queues defined with hook_queue_info() or hook_cron_queue_info().
  *
- * @return Array of queues indexed by name and containing
+ * @param boolean $include_cron
+ *  Include queues defined in hook_cron_queue_info(). Defaults to TRUE.
+ * @return
+ *   Array of queues indexed by name.
  */
-function queue_ui_defined_queues() {
-  $queues = &drupal_static(__FUNCTION__);
-  if (!isset($queues)) {
+function queue_ui_defined_queues($include_cron = TRUE) {
+  $queues = &drupal_static(__FUNCTION__, array());
+  $key = $include_cron ? 'include' : 'exclude';
+  if (!isset($queues[$key])) {
     // Invoke hook_queue_info().
-    $queues = module_invoke_all('queue_info');
+    $queues[$key] = module_invoke_all('queue_info');
+
+    if ($include_cron) {
+      // Merge in queues from modules that implement hook_cron_queue_info().
+      $cron_queues = module_invoke_all('cron_queue_info');
+      drupal_alter('cron_queue_info', $cron_queues);
+      foreach($cron_queues as $name => $queue) {
+        if (!isset($queues[$key][$name])) {
+          $queues[$key][$name] = array();
+        }
+        $queues[$key][$name] += array(
+          'cron' => array(
+            'callback' => $queue['worker callback'],
+            'time' => $queue['time'],
+          )
+        );
+      }
+    }
   }
-  return $queues;
+  return $queues[$key];
 }
 
 /**
- * Implements hook_cron().
+ * Implements hook_cron_queue_info().
  */
-function queue_ui_cron() {
-  // Retrieve queues set for cron processing.
-  $defs = queue_ui_defined_queues();
-  if (!empty($defs)) {
-    foreach ($defs as $name => $definition) {
-      $queue = DrupalQueue::get($name);
-      // A cron callback must be defined and there must be items in the queue.
-      if (isset($definition['cron']) && is_object($queue) && $queue->numberOfItems()) {
-        $active = variable_get('queue_ui_cron_' . $name, FALSE);
-        if ($active) {
-          // Pass $queue to cron callback for processing.
-          $function = $definition['cron']['callback'];
-          // Definitions can define arguments.
-          $args = isset($definition['cron']['callback']) ? $definition['cron']['callback'] : NULL;
-          $function($queue, $args);
-        }
-      }
-    }
+function queue_ui_cron_queue_info() {
+  $queues = queue_ui_defined_queues(FALSE);
+  $cron_queues = array();
+  foreach ($queues as $queue_name => $queue) {
+    if (isset($queue['cron']) && variable_get('queue_ui_cron_' . $queue_name, FALSE))
+    $cron_queues[$queue_name] = array(
+      'worker callback' => $queue['cron']['callback'],
+      'time' => isset($queue['cron']['time']) ? $queue['cron']['time'] : NULL,
+    );
   }
+  return $cron_queues;
 }
 
 // @todo remove before prod
@@ -247,16 +261,8 @@ function queue_ui_queue_info() {
   );
 }
 
-function queue_ui_test_process($queue) {
-  $count = $queue->numberOfItems();
-  for ($i = 0; $i < 20 && $count > 0; $i++) {
-    $item = $queue->claimItem(20); // Lease time.
-    if ($item) {
-      // We would do some processing, if this were REAL.
-      $queue->deleteItem($item);
-      $count--;
-    }
-  }
+function queue_ui_test_process($item) {
+  // We would do some processing, if this were REAL.
 }
 
 function queue_ui_batch_test($queue, &$context) {
diff --git a/queue_ui.pages.inc b/queue_ui.pages.inc
index 947d33b..5795d2d 100644
--- a/queue_ui.pages.inc
+++ b/queue_ui.pages.inc
@@ -79,7 +79,7 @@ function queue_ui_overview_form() {
       $inspect = FALSE;
 
       if (isset($defined_queues[$name])) {
-        $title = $defined_queues[$name]['title'];
+        $title = isset($defined_queues[$name]['title']) ? $defined_queues[$name]['title'] : '';
       }
       if (isset($defined_queues[$name]['batch'])) {
         $operations = 'batch';
