diff --git a/commands/pm/pm.drush.inc b/commands/pm/pm.drush.inc
index 9534fab..54b36d8 100644
--- a/commands/pm/pm.drush.inc
+++ b/commands/pm/pm.drush.inc
@@ -182,6 +182,13 @@ function pm_drush_command() {
     'description' => 'Notify of pending db updates.',
     'hidden' => TRUE
   );
+  $items['pm-updatestatus-batch-process'] = array(
+    'description' => 'Callback to perform update status batch operations.',
+    'hidden' => TRUE,
+    'arguments' => array(
+      'batch-id' => 'The batch id that will be processed',
+    ),
+  );
   $items['pm-releasenotes'] = array(
     'description' => 'Print release notes for given projects.',
     'arguments' => array(
@@ -1620,6 +1627,14 @@ function drush_pm_updatecode_postupdate() {
   }
 }
 
+ /**
+ * Command callback. Execute pm-updatestatus-batch-process.
+ */
+function drush_pm_updatestatus_batch_process($id) {
+  drush_include_engine('update_info', 'drupal', NULL, DRUSH_BASE_PATH . '/commands/pm/update_info');
+  drush_batch_command($id);
+}
+
 /**
  * Determine a candidate destination directory for a particular site path and
  * return it if it exists, optionally attempting to create the directory.
diff --git a/commands/pm/update_info/drupal.inc b/commands/pm/update_info/drupal.inc
index b520bbb..b20c3b0 100644
--- a/commands/pm/update_info/drupal.inc
+++ b/commands/pm/update_info/drupal.inc
@@ -86,13 +86,13 @@ function _pm_get_update_info($projects) {
   // Set a batch to process all pending tasks.
   $batch = array(
     'operations' => array(
-      array('update_fetch_data_batch', array()),
+      array('_pm_update_fetch_data_batch', array()),
     ),
     'finished' => 'update_fetch_data_finished',
     'file' => drupal_get_path('module', 'update') . '/update.fetch.inc',
   );
   batch_set($batch);
-  drush_backend_batch_process();
+  drush_backend_batch_process('pm-updatestatus-batch-process');
 
   // Calculate update status data.
   $available = _update_get_cached_available_releases();
@@ -143,3 +143,49 @@ function pm_get_project_info($projects) {
   }
   return $data;
 }
+
+/**
+ * Process a step in the batch for fetching available update data.
+ *
+ * This is an adaptation of update_fetch_data_batch() to fit drush log.
+ */
+function _pm_update_fetch_data_batch(&$context) {
+  $queue = DrupalQueue::get('update_fetch_tasks');
+  if (empty($context['sandbox']['max'])) {
+    $context['finished'] = 0;
+    $context['sandbox']['max'] = $queue->numberOfItems();
+    $context['sandbox']['progress'] = 0;
+    $context['results']['updated'] = 0;
+    $context['results']['failures'] = 0;
+    $context['results']['processed'] = 0;
+  }
+
+  // Grab another item from the fetch queue.
+  for ($i = 0; $i < 5; $i++) {
+    if ($item = $queue->claimItem()) {
+      if (_update_process_fetch_task($item->data)) {
+        $context['results']['updated']++;
+        drush_log(dt('Checked available update data for !title.', array('!title' => $item->data['info']['name'])), 'ok');
+      }
+      else {
+        drush_log(dt('Failed to check available update data for !title.', array('!title' => $item->data['info']['name'])), 'error');
+        $context['results']['failures']++;
+      }
+      $context['sandbox']['progress']++;
+      $context['results']['processed']++;
+      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+      $queue->deleteItem($item);
+    }
+    else {
+      // If the queue is currently empty, we're done. It's possible that
+      // another thread might have added new fetch tasks while we were
+      // processing this batch. In that case, the usual 'finished' math could
+      // get confused, since we'd end up processing more tasks that we thought
+      // we had when we started and initialized 'max' with numberOfItems(). By
+      // forcing 'finished' to be exactly 1 here, we ensure that batch
+      // processing is terminated.
+      $context['finished'] = 1;
+      return;
+    }
+  }
+}
