diff --git a/queue_ui.module b/queue_ui.module
index fceeafc..56139bd 100644
--- a/queue_ui.module
+++ b/queue_ui.module
@@ -290,3 +290,49 @@ function queue_ui_batch_finished($success, $results, $operations) {
   }
   drupal_set_message($message);
 }
+
+/**
+ * Batch operation callback for cron queues.
+ */
+function queue_ui_cron_queue_batch_process($queue_name, $cron_queue_info, &$context) {
+  $queue = DrupalQueue::get($queue_name);
+  $function = $cron_queue_info['worker callback'];
+
+  if (empty($context['sandbox'])) {
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['max'] = $queue->numberOfItems();
+  }
+
+  $end = time() + (isset($cron_queue_info['time']) ? $cron_queue_info['time'] : 15);
+  while (time() < $end && ($item = $queue->claimItem())) {
+    try {
+      $function($item->data);
+      $queue->deleteItem($item);
+    }
+    catch (Exception $e) {
+      // In case of exception log it and leave the item in the queue
+      // to be processed again later.
+      watchdog_exception('queue_ui', $e);
+    }
+
+    $context['sandbox']['progress']++;
+  }
+
+  // If the last attempt to get an item produced an empty result, then no more
+  // claimable items remain in the queue and we can tell Batch API we are done.
+  // Otherwise, items may remain in the queue and we should tell Batch API to
+  // call us again.
+  if (empty($item)) {
+    $context['finished'] = 1;
+  }
+  else {
+    // We can't use numberOfItems() to know how many items we must process,
+    // because that does not take claims on items into account.
+    $context['finished'] = 0;
+  }
+
+  $context['message'] = t('Processed !count items in queue @name.', array(
+    '!count' => $context['sandbox']['progress'],
+    '@name' => $queue_name,
+  ));
+}
diff --git a/queue_ui.pages.inc b/queue_ui.pages.inc
index 947d33b..cdea846 100644
--- a/queue_ui.pages.inc
+++ b/queue_ui.pages.inc
@@ -164,12 +164,17 @@ function queue_ui_overview_submit($form, &$form_state, $queues) {
       break;
     case $values['batch']:
       // Process queue(s) with batch.
-      // We can only run batch on queues using our hook_queue_info() that define batch.
+      // We can only run batch on either queues using our hook_queue_info() that
+      // define batch, or queues defined with hook_cron_queue_info().
+      // Get the queues defined with hook_queue_info().
       $defined_queues = queue_ui_defined_queues();
-      $intersect = array_intersect(array_keys($defined_queues), $queues);
-      foreach ($intersect as $name) {
-        // Only if queue_info implementation defined batch can we set it here.
-        if (isset($defined_queues[$name]['batch'])) {
+
+      // Get the cron queues.
+      $cron_queues = module_invoke_all('cron_queue_info');
+      drupal_alter('cron_queue_info', $cron_queues);
+
+      foreach ($queues as $name) {
+        if (isset($defined_queues[$name])) {
           $batch = $defined_queues[$name]['batch'];
           // Add queue as argument to operations by resetting the operations array.
           $operations = array();
@@ -181,6 +186,19 @@ function queue_ui_overview_submit($form, &$form_state, $queues) {
           $batch['operations'] = $operations;
           // Set.
           batch_set($batch);
+
+          continue;
+        }
+
+        if (isset($cron_queues[$name])) {
+          $batch = array(
+            'operations' => array(
+              array('queue_ui_cron_queue_batch_process', array($name, $cron_queues[$name])),
+            ),
+          );
+          batch_set($batch);
+
+          continue;
         }
       }
       break;
