diff --git a/includes/backend.inc b/includes/backend.inc
index 364d9d4..a474b88 100644
--- a/includes/backend.inc
+++ b/includes/backend.inc
@@ -266,8 +266,8 @@ function _drush_backend_integrate($data, $backend_options, $outputted) {
   if (is_array($data['log']) && $backend_options['log'] && !$outputted) {
     foreach($data['log'] as $log) {
       $message = is_array($log['message']) ? implode("\n", $log['message']) : $log['message'];
-      if (isset($backend_options['output-label'])) {
-        $message = $backend_options['output-label'] . $message;
+      if (isset($backend_options['#output-label'])) {
+        $message = $backend_options['#output-label'] . $message;
       }
       if (!is_null($log['error']) && $backend_options['integrate']) {
         drush_set_error($log['error'], $message);
@@ -292,8 +292,17 @@ function _drush_backend_integrate($data, $backend_options, $outputted) {
 /**
  * Call an external command using proc_open.
  *
- * @param cmd
- *    The command to execute. This command already needs to be properly escaped.
+ * @param cmds
+ *    An array of records containing the following elements:
+ *      'cmd' - The command to execute, already properly escaped
+ *      'post-options' - An associative array that will be JSON encoded 
+ *        and passed to the script being called. Objects are not allowed, 
+ *        as they do not json_decode gracefully.
+ *      'backend-options' - Options that control the operation of the backend invoke
+ *     - OR -
+ *    An array of commands to execute. These commands already need to be properly escaped.
+ *    In this case, post-options will default to empty, and a default output label will
+ *    be generated.
  * @param data
  *    An associative array that will be JSON encoded and passed to the script being called.
  *    Objects are not allowed, as they do not json_decode gracefully.
@@ -303,68 +312,113 @@ function _drush_backend_integrate($data, $backend_options, $outputted) {
  *   If it executed successfully, it returns an associative array containing the command
  *   called, the output of the command, and the error code of the command.
  */
-function _drush_proc_open($cmd, $post_options = NULL, $context = NULL, $backend_options = array()) {
-
+function _drush_proc_open($cmds, $context = NULL) {
   $descriptorspec = array(
-     0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
-     1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
-     2 => array("pipe", "w")   // stderr is a pipe the child will write to
+    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
+    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
+    2 => array("pipe", "w")   // stderr is a pipe the child will write to
   );
-  $process = proc_open($cmd, $descriptorspec, $pipes, null, null, array('context' => $context));
-  if (is_resource($process)) {
-    if ($post_options) {
-      fwrite($pipes[0], json_encode($post_options)); // pass the data array in a JSON encoded string
+  $open_processes = array();
+  $bucket = array();
+
+  $process_limit = 2;
+  // Loop through processes until they all close.
+  while (sizeof($open_processes) || sizeof($cmds)) {
+    if (sizeof($cmds) && (sizeof($open_processes) < $process_limit)) {
+      // Pop the site and command (key / value) from the cmds array
+      end($cmds);
+      list($site, $cmd) = each($cmds);
+      unset($cmds[$site]);
+      
+      if (is_array($cmd)) {
+        $c = $cmd['cmd'];
+        $post_options = $cmd['post-options'];
+        $backend_options = $cmd['backend-options'];
+      }
+      else {
+        $c = $cmd;
+        $post_options = array();
+        $backend_options = array();
+      }
+      $process = array();
+      drush_log($backend_options['#output-label'] . $c);
+      $process['process'] = proc_open($c, $descriptorspec, $process['pipes'], null, null, array('context' => $context));
+      if (is_resource($process['process'])) {
+        if ($post_options) {
+          fwrite($process['pipes'][0], json_encode($post_options)); // pass the data array in a JSON encoded string
+        }
+        // If we do not close stdin here, then we cause a deadlock;
+        // see: http://drupal.org/node/766080#comment-4309936
+        // If we reimplement interactive commands to also use
+        // _drush_proc_open, then clearly we would need to keep
+        // this open longer.
+        fclose($process['pipes'][0]);
+
+        foreach (array(1, 2) as $pipe) {
+          $process['info'] = stream_get_meta_data($process['pipes'][$pipe]);
+          stream_set_blocking($process['pipes'][$pipe], FALSE);
+          stream_set_timeout($process['pipes'][$pipe], 1);
+        }
+        $bucket[$site]['cmd'] = $c;
+        $bucket[$site]['output'] = '';
+        $bucket[$site]['backend-options'] = $backend_options;
+        $bucket[$site]['end_of_output'] = FALSE;
+        $bucket[$site]['outputted'] = FALSE;
+        $open_processes[$site] = $process;
+      }
     }
-    // If we do not close stdin here, then we cause a deadlock;
-    // see: http://drupal.org/node/766080#comment-4309936
-    // If we reimplement interactive commands to also use
-    // _drush_proc_open, then clearly we would need to keep
-    // this open longer.
-    fclose($pipes[0]);
-
-    $info = stream_get_meta_data($pipes[1]);
-    stream_set_blocking($pipes[1], TRUE);
-    stream_set_timeout($pipes[1], 1);
-    $output = '';
-    $end_of_output = FALSE;
-    $outputted = FALSE;
-    while (!feof($pipes[1]) && !$info['timed_out']) {
-      $string = fread($pipes[1], 4096);
-      $output_end_pos = strpos($string, 'DRUSH_BACKEND_OUTPUT_START>>>');
-      if ($output_end_pos !== FALSE) {
-        $trailing_string = substr($string, 0, $output_end_pos);
-        drush_backend_parse_packets($trailing_string, $backend_options);
-        _drush_backend_print_output($trailing_string, $backend_options);
-        $end_of_output = TRUE;
+    foreach ($open_processes as $site => &$current_process) {
+      if (isset($current_process['pipes'][1]) || isset($current_process['pipes'][2])) {
+        // Collect output from stdout and stderr
+        foreach (array(1, 2) as $pipe) {
+          if (isset($current_process['pipes'][$pipe])) {
+            $bucket[$site][$pipe] = '';
+            $info = stream_get_meta_data($current_process['pipes'][$pipe]);
+
+            if (!feof($current_process['pipes'][$pipe]) && !$info['timed_out']) {
+              $string = fread($current_process['pipes'][$pipe], 4096);
+              $output_end_pos = strpos($string, 'DRUSH_BACKEND_OUTPUT_START>>>');
+              if ($output_end_pos !== FALSE) {
+                $trailing_string = substr($string, 0, $output_end_pos);
+		if (!empty($trailing_string)) {
+                  drush_backend_parse_packets($trailing_string, $bucket[$site]['backend-options']);
+                  _drush_backend_print_output($trailing_string, $bucket[$site]['backend-options']);
+                  $bucket[$site]['outputted'] = TRUE;
+                }
+		$bucket[$site]['end_of_output'] = TRUE;
+              }
+              if (!$bucket[$site]['end_of_output']) {
+                drush_backend_parse_packets($string, $bucket[$site]['backend-options']);
+                // Pass output through.
+                _drush_backend_print_output($string, $bucket[$site]['backend-options']);
+                if (!empty($string)) {
+		  $bucket[$site]['outputted'] = TRUE;
+		}
+              }
+              $bucket[$site][$pipe] .= $string;
+              $bucket[$site]['output'] .= $string;
+              $info = stream_get_meta_data($current_process['pipes'][$pipe]);
+              flush();
+            }
+            else {
+              fclose($current_process['pipes'][$pipe]);
+              unset($current_process['pipes'][$pipe]);
+              // close the pipe , set a marker
+            }
+          }
+        }
       }
-      if (!$end_of_output) {
-        drush_backend_parse_packets($string, $backend_options);
-        // Pass output through.
-        _drush_backend_print_output($string, $backend_options);
-        $outputted = TRUE;
+      else {
+        // if both pipes are closed for the process, remove it from active loop and add a new process to open.
+        $bucket[$site]['code'] = proc_close($current_process['process']);
+        unset($open_processes[$site]);
       }
-      $output .= $string;
-      $info = stream_get_meta_data($pipes[1]);
-      flush();
-    };
-
-    $info = stream_get_meta_data($pipes[2]);
-    stream_set_blocking($pipes[2], TRUE);
-    stream_set_timeout($pipes[2], 1);
-    while (!feof($pipes[2]) && !$info['timed_out']) {
-      $string = fgets($pipes[2], 4096);
-      $output .= $string;
-      fwrite(STDERR, $string);
-      $info = stream_get_meta_data($pipes[2]);
-      flush();
-    };
-
-    fclose($pipes[1]);
-    fclose($pipes[2]);
-    $code = proc_close($process);
-    return array('cmd' => $cmd, 'output' => $output, 'code' => $code, 'outputted' => $outputted);
+    }
   }
-  return FALSE;
+  return $bucket;
+  // TODO: Handle bad proc handles
+  //}
+  //return FALSE;
 }
 
 /**
@@ -373,8 +427,8 @@ function _drush_proc_open($cmd, $post_options = NULL, $context = NULL, $backend_
  */
 function _drush_backend_print_output($output_string, $backend_options) {
   if ($backend_options['output'] && !empty($output_string)) {
-    $output_label = array_key_exists('output-label', $backend_options) ? $backend_options['output-label'] : FALSE;
-    if ($output_label) {
+    $output_label = array_key_exists('#output-label', $backend_options) ? $backend_options['#output-label'] : FALSE;
+    if (!empty($output_label)) {
       // Remove one, and only one newline from the end of the
       // string. Else we'll get an extra 'empty' line.
       foreach (explode("\n", preg_replace('/\\n$/', '', $output_string)) as $line) {
@@ -424,8 +478,8 @@ function drush_backend_packet_set_error($data, $backend_options) {
     return;
   }
   $output_label = "";
-  if (array_key_exists('output-label', $backend_options)) {
-    $output_label = $backend_options['output-label'];
+  if (array_key_exists('#output-label', $backend_options)) {
+    $output_label = $backend_options['#output-label'];
   }
   drush_set_error($data['error'], $data['message'], $output_label);
 }
@@ -461,90 +515,196 @@ function _drush_backend_adjust_options($site_record, $command, $command_options,
  *
  * n.b. Prefer drush_invoke_process() to this function.
  *
- * @param site_record
- *   An array containing information used to generate the command.
- *   'remote-host'
- *      Optional. A remote host to execute the drush command on.
- *   'remote-user'
- *      Optional. Defaults to the current user. If you specify this, you can choose which module to send.
- *   'ssh-options'
- *      Optional.  Defaults to "-o PasswordAuthentication=no"
- *   'path-aliases'
- *      Optional; contains paths to folders and executables useful to the command.
- *      '%drush-script'
- *        Optional. Defaults to the current drush.php file on the local machine, and
- *        to simply 'drush' (the drush script in the current PATH) on remote servers.
- *        You may also specify a different drush.php script explicitly.  You will need
- *        to set this when calling drush on a remote server if 'drush' is not in the
- *        PATH on that machine.
- * @param command
- *    A defined drush command such as 'cron', 'status' or any of the available ones such as 'drush pm'.
- * @param args
- *    An array of arguments for the command.
- * @param command_options
- *    Optional. An array containing options to pass to the remote script.
- *    Array items with a numeric key are treated as optional arguments to the
- *    command.  This parameter is a reference, as any options that have been
- *    represented as either an option, or an argument will be removed.  This
- *    allows you to pass the left over options as a JSON encoded string,
- *    without duplicating data.
+ * @param invocations
+ *   An array of command records to exacute. Each record should contain:
+ *     'site':
+ *       An array containing information used to generate the command.
+ *         'remote-host'
+ *            Optional. A remote host to execute the drush command on.
+ *         'remote-user'
+ *            Optional. Defaults to the current user. If you specify this, you can choose which module to send.
+ *         'ssh-options'
+ *            Optional.  Defaults to "-o PasswordAuthentication=no"
+ *         'path-aliases'
+ *            Optional; contains paths to folders and executables useful to the command.
+ *         '%drush-script'
+ *            Optional. Defaults to the current drush.php file on the local machine, and
+ *            to simply 'drush' (the drush script in the current PATH) on remote servers.
+ *            You may also specify a different drush.php script explicitly.  You will need
+ *            to set this when calling drush on a remote server if 'drush' is not in the
+ *            PATH on that machine.
+ *     'command':
+ *       A defined drush command such as 'cron', 'status' or any of the available ones such as 'drush pm'.
+ *     'args':
+ *       An array of arguments for the command.
+ *     'options'
+ *       Optional. An array containing options to pass to the remote script.
+ *       Array items with a numeric key are treated as optional arguments to the
+ *       command.
+ *     'backend-options':
+ *       Optional. Additional parameters that control the operation of the invoke.
+ *         'method'
+ *            Optional. Defaults to 'GET'.
+ *            If this parameter is set to 'POST', the $data array will be passed
+ *            to the script being called as a JSON encoded string over the STDIN
+ *            pipe of that process. This is preferable if you have to pass
+ *            sensitive data such as passwords and the like.
+ *            For any other value, the $data array will be collapsed down into a
+ *            set of command line options to the script.
+ *         'integrate'
+ *            Optional. Defaults to TRUE.
+ *            If TRUE, any error statuses will be integrated into the current
+ *            process. This might not be what you want, if you are writing a
+ *            command that operates on multiple sites.
+ *         'log'
+ *            Optional. Defaults to TRUE.
+ *            If TRUE, any log messages will be integrated into the current
+ *            process.
+ *         'output'
+ *            Optional. Defaults to TRUE.
+ *            If TRUE, output from the command will be synchronously printed to
+ *            stdout.
+ *         'drush-script'
+ *            Optional. Defaults to the current drush.php file on the local
+ *            machine, and to simply 'drush' (the drush script in the current
+ *            PATH) on remote servers.  You may also specify a different drush.php
+ *            script explicitly.  You will need to set this when calling drush on
+ *            a remote server if 'drush' is not in the PATH on that machine.
+ * @param common_options
+ *    Optional. Merged in with the options for each invocation.
  * @param backend_options
- *    Optional. An array of options for the invocation.
- *     'method'
- *        Optional. Defaults to 'GET'.
- *        If this parameter is set to 'POST', the $data array will be passed
- *        to the script being called as a JSON encoded string over the STDIN
- *        pipe of that process. This is preferable if you have to pass
- *        sensitive data such as passwords and the like.
- *        For any other value, the $data array will be collapsed down into a
- *        set of command line options to the script.
- *     'integrate'
- *        Optional. Defaults to TRUE.
- *        If TRUE, any error statuses will be integrated into the current
- *        process. This might not be what you want, if you are writing a
- *        command that operates on multiple sites.
- *     'log'
- *        Optional. Defaults to TRUE.
- *        If TRUE, any log messages will be integrated into the current
- *        process.
- *     'output'
- *        Optional. Defaults to TRUE.
- *        If TRUE, output from the command will be synchronously printed to
- *        stdout.
- *     'drush-script'
- *        Optional. Defaults to the current drush.php file on the local
- *        machine, and to simply 'drush' (the drush script in the current
- *        PATH) on remote servers.  You may also specify a different drush.php
- *        script explicitly.  You will need to set this when calling drush on
- *        a remote server if 'drush' is not in the PATH on that machine.
+ *    Optional. Merged in with the backend options for each invocation.
+ * @param default_command
+ *    Optional. Used as the 'command' for any invocation that does not
+ *    define a command explicitly.
+ * @param default_site
+ *    Optional. Used as the 'site' for any invocation that does not
+ *    define a site explicitly.
+ * @param context
+ *    Optional. Passed in to proc_open if provided.
  *
  * @return
  *   If the command could not be completed successfully, FALSE.
  *   If the command was completed, this will return an associative array containing the data from drush_backend_output().
  */
-function drush_backend_invoke_sitealias_command($site_record, $command, $args, $command_options = array(), $backend_options = array()) {
-  $backend_options = _drush_backend_adjust_options($site_record, $command, $command_options, $backend_options);
-  $os = drush_os($site_record);
+function drush_backend_invoke_concurrent($invocations, $common_options = array(), $common_backend_options = array(), $default_command = NULL, $default_site = NULL, $context = NULL) {
+  $index = 0;
 
-  $site_record += array( 'path-aliases' => array() );
-  $site_record['path-aliases'] += array(
-     '%drush-script' => NULL,
-  );
-  $drush_path = $site_record['path-aliases']['%drush-script'];
+  // Slice and dice our options in preparation to build a command string
+  $invocation_options = array();
+  foreach ($invocations as $invocation)  {
+    $site_record = isset($invocation['site']) ? $invocation['site'] : $default_site;
+    // NULL is a synonym to '@self', although the latter is preferred.
+    if (!isset($site_record)) {
+      $site_record = '@self';
+    }
+    // If the first parameter is not a site alias record,
+    // then presume it is an alias name, and try to look up
+    // the alias record.
+    if (!is_array($site_record)) {
+      $site_record = drush_sitealias_get_record($site_record);
+    }
+    $command = isset($invocation['command']) ? $invocation['command'] : $default_command;
+    $args = isset($invocation['args']) ? $invocation['args'] : array();
+    $command_options = isset($invocation['options']) ? $invocation['options'] : array();
+    $backend_options = isset($invocation['backend-options']) ? $invocation['backend-options'] : array();
+    // If $backend_options is passed in as a bool, interpret that as the value for 'integrate'
+    if (!is_array($common_backend_options)) {
+      $integrate = (bool)$common_backend_options;
+      $common_backend_options = array('integrate' => $integrate);
+    }
+
+    $command_options += $common_options;
+    $backend_options += $common_backend_options;
 
-  // If the caller did not pass in a specific path to drush, then we will
-  // use a default value.  For commands that are being executed on the same
-  // machine, we will use DRUSH_COMMAND, which is the path to the drush.php
-  // that is running right now.  For remote commands, we will run a wrapper
-  // script instead of drush.php -- drush.bat on Windows, or drush on Linux.
-  $drush_command_path = drush_build_drush_command($drush_path, array_key_exists('php', $command_options) ? $command_options['php'] : NULL, drush_os($site_record), array_key_exists('remote-host', $site_record));
+    $backend_options = _drush_backend_adjust_options($site_record, $command, $command_options, $backend_options);
 
-  // Insure that contexts such as DRUSH_SIMULATE and NO_COLOR are included.
-  $command_options += _drush_backend_get_global_contexts($site_record);
+    // Insure that contexts such as DRUSH_SIMULATE and NO_COLOR are included.
+    $command_options += _drush_backend_get_global_contexts($site_record);
 
-  list($post_options, $commandline_options, $drush_global_options) = _drush_backend_classify_options($command_options, $backend_options);
-  $cmd = _drush_backend_generate_command($site_record, $drush_command_path . " " . _drush_backend_argument_string($drush_global_options, $os) . " " . $command, $args, $commandline_options, $backend_options) . ' 2>&1';
-  return _drush_backend_invoke($cmd, $post_options, $backend_options);
+    list($post_options, $commandline_options, $drush_global_options) = _drush_backend_classify_options($site_record, $command_options, $backend_options);
+    $site_record += array('path-aliases' => array());
+    $site_record['path-aliases'] += array(
+      '%drush-script' => NULL,
+    );
+
+    $site = array_key_exists('#name', $site_record) ? $site_record['#name'] : $index++;
+    $invocation_options[$site] = array(
+      'site-record' => $site_record,
+      'command' => $command,
+      'args' => $args,
+      'post-options' => $post_options,
+      'drush-global-options' => $drush_global_options,
+      'commandline-options' => $commandline_options,
+      'command-options' => $command_options,
+      'backend-options' => $backend_options,
+    );
+  }
+
+  // Calculate the length of the longest output label
+  $max_name_length = 0;
+  $label_separator = '';
+  if (!array_key_exists('no-label', $common_options) && (count($invocation_options) > 1)) {
+    $label_separator = array_key_exists('#label-separator', $common_options) ? $common_options['#label-separator'] : ' >> ';
+    foreach ($invocation_options as $site => $item) {
+      $backend_options = $item['backend-options'];
+      if (!array_key_exists('#output-label', $backend_options)) {
+        if (is_numeric($site)) {
+          $backend_options['#output-label'] = ' * [@self.' . $site;
+          $label_separator = '] ';
+        }
+        else {
+          $backend_options['#output-label'] = $site;
+        }
+        $invocation_options[$site]['backend-options']['#output-label'] = $backend_options['#output-label'];
+      }
+      $name_len = strlen($backend_options['#output-label']);
+      if ($name_len > $max_name_length) {
+        $max_name_length = $name_len;
+      }
+      if (array_key_exists('#label-separator', $backend_options)) {
+        $label_separator = $backend_options['#label-separator'];
+      }
+    }
+  }
+  // Now pad out the output labels and add the label separator.
+  $reserve_margin = $max_name_length + strlen($label_separator);
+  foreach ($invocation_options as $site => $item) {
+    $backend_options = $item['backend-options'] + array('#output-label' => '');
+    $invocation_options[$site]['backend-options']['#output-label'] = str_pad($backend_options['#output-label'], $max_name_length, " ") . $label_separator;
+    if ($reserve_margin) {
+      $invocation_options[$site]['drush-global-options']['reserve-margin'] = $reserve_margin;
+    }
+  }
+
+  // Now take our prepared options and generate the command strings
+  $cmds = array();
+  foreach ($invocation_options as $site => $item) {
+    $site_record = $item['site-record'];
+    $command = $item['command'];
+    $args = $item['args'];
+    $post_options = $item['post-options'];
+    $commandline_options = $item['commandline-options'];
+    $command_options = $item['command-options'];
+    $drush_global_options = $item['drush-global-options'];
+    $backend_options = $item['backend-options'];
+    $os = drush_os($site_record);
+    // If the caller did not pass in a specific path to drush, then we will
+    // use a default value.  For commands that are being executed on the same
+    // machine, we will use DRUSH_COMMAND, which is the path to the drush.php
+    // that is running right now.  For remote commands, we will run a wrapper
+    // script instead of drush.php -- drush.bat on Windows, or drush on Linux.
+    $drush_path = $site_record['path-aliases']['%drush-script'];
+    $drush_command_path = drush_build_drush_command($drush_path, array_key_exists('php', $command_options) ? $command_options['php'] : NULL, $os, array_key_exists('remote-host', $site_record));
+    $cmd = _drush_backend_generate_command($site_record, $drush_command_path . " " . _drush_backend_argument_string($drush_global_options, $os) . " " .  $command, $args, $commandline_options, $backend_options) . ' 2>&1';
+    $cmds[$site] = array(
+      'cmd' => $cmd,
+      'post-options' => $post_options,
+      'backend-options' => $backend_options,
+    );
+  }
+
+  return _drush_backend_invoke($cmds, $common_backend_options, $context);
 }
 
 /**
@@ -564,7 +724,7 @@ function _drush_backend_get_global_contexts($site_record) {
         elseif ((array_key_exists('context', $global_metadata))) {
           // If the context is declared to be a 'local-context-only',
           // then only put it in if this is a local dispatch.
-          if (!array_key_exists('local-context-only', $global_metadata) || !array_key_exists('remot-host', $site_record)) {
+          if (!array_key_exists('local-context-only', $global_metadata) || !array_key_exists('remote-host', $site_record)) {
             $value = drush_get_context($global_metadata['context'], array());
           }
         }
@@ -587,8 +747,10 @@ function _drush_backend_get_global_contexts($site_record) {
  *       subprocess.
  *     - $drush_global_options: the drush global options also go on the command
  *       line, but appear before the drush command name rather than after it.
+ *
+ * Also, this function may modify $backend_options.
  */
-function _drush_backend_classify_options($command_options, $backend_options) {
+function _drush_backend_classify_options($site_record, $command_options, &$backend_options) {
   // In 'POST' mode (the default, remove everything (except the items marked 'never-post'
   // in the global option list) from the commandline options and put them into the post options.  
   // The post options will be json-encoded and sent to the command via stdin
@@ -597,6 +759,17 @@ function _drush_backend_classify_options($command_options, $backend_options) {
   $post_options = array();
   $commandline_options = array();
   $drush_global_options = array();
+  $additional_backend_options = array();
+  foreach ($site_record as $key => $value) {
+    if (!in_array($key, drush_sitealias_site_selection_keys())) {
+      if ($key[0] == '#') {
+        $backend_options[$key] = $value;
+      }
+      if (!isset($command_options[$key])) {
+        $command_options[$key] = $value;
+      }
+    }
+  }
   foreach ($command_options as $key => $value) {
     $global = array_key_exists($key, $global_option_list);
     $propagate = !is_array($value);
@@ -629,7 +802,7 @@ function _drush_backend_classify_options($command_options, $backend_options) {
       }
     }
   }
-  return array($post_options, $commandline_options, $drush_global_options);
+  return array($post_options, $commandline_options, $drush_global_options, $additional_backend_options);
 }
 
 /**
@@ -653,34 +826,53 @@ function _drush_backend_classify_options($command_options, $backend_options) {
  *   If the command could not be completed successfully, FALSE.
  *   If the command was completed, this will return an associative array containing the data from drush_backend_output().
  */
-function _drush_backend_invoke($cmd, $post_options = NULL, $backend_options = array()) {
-  if (drush_get_context('DRUSH_SIMULATE') && !array_key_exists('override-simulated', $backend_options)) {
-    drush_print(dt('Simulating backend invoke: !cmd', array('!cmd' => $cmd)));
+function _drush_backend_invoke($cmds, $common_backend_options = array(), $context = NULL) {
+  if (drush_get_context('DRUSH_SIMULATE') && !array_key_exists('override-simulated', $common_backend_options)) {
+    foreach ($cmds as $cmd) {
+      drush_print(dt('Simulating backend invoke: !cmd', array('!cmd' => $cmd['cmd'])));
+    }
     return FALSE;
   }
-  drush_log(dt('Backend invoke: !cmd', array('!cmd' => $cmd)), 'command');
-  if (array_key_exists('interactive', $backend_options)) {
-    drush_log(dt("executing !cmd", array('!cmd' => $cmd)));
-    return drush_shell_proc_open($cmd);
+  foreach ($cmds as $cmd) {
+    drush_log(dt('Backend invoke: !cmd', array('!cmd' => $cmd['cmd'])), 'command');
   }
-  else {
-    $proc = _drush_proc_open($cmd, $post_options, NULL, $backend_options);
-
-    if (($proc['code'] == DRUSH_APPLICATION_ERROR) && $backend_options['integrate']) {
-      drush_set_error('DRUSH_APPLICATION_ERROR', dt("The external command could not be executed due to an application error."));
+  if (array_key_exists('interactive', $common_backend_options)) {
+    foreach ($cmds as $cmd) {
+      drush_log(dt("executing !cmd", array('!cmd' => $cmd['cmd'])));
+      $ret = drush_shell_proc_open($cmd['cmd']);
     }
+    return $ret;
+  }
+  else {
+    $procs = _drush_proc_open($cmds, $context);
+    $procs = is_array($procs) ? $procs : array($procs);
 
-    if ($proc['output']) {
-      $values = drush_backend_parse_output($proc['output'], $backend_options, $proc['outputted']);
-      if (is_array($values)) {
-        return $values;
+    foreach ($procs as $proc) {
+      $ret = array();
+      if (($proc['code'] == DRUSH_APPLICATION_ERROR) && isset($common_backend_options['integrate'])) {
+        drush_set_error('DRUSH_APPLICATION_ERROR', dt("The external command could not be executed due to an application error."));
       }
-      else {
-        return drush_set_error('DRUSH_FRAMEWORK_ERROR', dt("The command could not be executed successfully (returned: !return, code: %code)", array("!return" => $proc['output'], "%code" =>  $proc['code'])));
+
+      if ($proc['output']) {
+        $values = drush_backend_parse_output($proc['output'], $proc['backend-options'], $proc['outputted']);
+        if (is_array($values)) {
+          if (empty($ret)) {
+	    $ret = $values;
+	  }
+	  elseif (!array_key_exists('multiple', $ret)) {
+	    $ret = array('multiple' => array($ret, $values));
+	  }
+	  else {
+	    $ret['multiple'][] = $values;
+	  }
+        }
+        else {
+          $ret = drush_set_error('DRUSH_FRAMEWORK_ERROR', dt("The command could not be executed successfully (returned: !return, code: %code)", array("!return" => $proc['output'], "%code" =>  $proc['code'])));
+        }
       }
     }
   }
-  return FALSE;
+  return empty($ret) ? FALSE : $ret;
 }
 
 /**
diff --git a/includes/command.inc b/includes/command.inc
index 8ee6b5b..7eee1ba 100644
--- a/includes/command.inc
+++ b/includes/command.inc
@@ -61,26 +61,36 @@ function drush_invoke($command, $arguments = array()) {
  * @param $backend_options
  *   TRUE - integrate errors
  *   FALSE - do not integrate errors
- *   array - @see drush_backend_invoke_sitealias_command
+ *   array - @see drush_backend_invoke_concurrent
  *
  * @return
  *   If the command could not be completed successfully, FALSE.
  *   If the command was completed, this will return an associative
  *   array containing the results of the API call.
  *   @see drush_backend_get_result()
+ *
+ * Do not change the signature of this function!  drush_invoke_process
+ * is one of the key Drush APIs.  See http://drupal.org/node/1152908
  */
 function drush_invoke_process($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = FALSE) {
-  // NULL is a synonym to '@self', although the latter is preferred.
-  if (!isset($site_alias_record)) {
-    $site_alias_record = '@self';
+  if (is_array($site_alias_record) && array_key_exists('site-list', $site_alias_record)) {
+    $site_alias_records = drush_sitealias_resolve_sitespecs($site_alias_record['site-list']);
+    $site_alias_records = drush_sitealias_simplify_names($site_alias_records);
+    foreach ($site_alias_records as $alias_name => $alias_record) {
+      $invocations[] = array(
+        'site' => $alias_record,
+        'command' => $command_name,
+        'args' => $commandline_args,
+      );
+    }
   }
-  // If the first parameter is not a site alias record,
-  // then presume it is an alias name, and try to look up
-  // the alias record.
-  if (!is_array($site_alias_record)) {
-    $site_alias_record = drush_sitealias_get_record($site_alias_record);
+  else {
+    $invocations[] = array(
+      'site' => $site_alias_record,
+      'command' => $command_name,
+      'args' => $commandline_args);
   }
-  return drush_do_site_command($site_alias_record, $command_name, $commandline_args, $commandline_options, $backend_options);
+  return drush_backend_invoke_concurrent($invocations, $commandline_options, $backend_options);
 }
 
 /**
diff --git a/includes/drush.inc b/includes/drush.inc
index 3490ad2..f9c8ef6 100644
--- a/includes/drush.inc
+++ b/includes/drush.inc
@@ -990,13 +990,12 @@ function drush_preflight_command_dispatch() {
     if (!is_array($site_list)) {
       $site_list = explode(',', $site_list);
     }
-    $site_list = drush_sitealias_resolve_sitespecs($site_list);
-    $site_list = drush_sitealias_simplify_names($site_list);
+    $site_record = array('site-list' => $site_list);
     $args = drush_get_arguments();
 
     if (!drush_get_context('DRUSH_SIMULATE') && !$interactive) {
       drush_print(dt("You are about to execute '!command' non-interactively (--yes forced) on all of the following targets:", array('!command' => implode(" ", $args))));
-      foreach ($site_list as $one_destination => $one_record) {
+      foreach ($site_list as $one_destination) {
         drush_print(dt('  !target', array('!target' => $one_destination)));
       }
 
@@ -1011,31 +1010,10 @@ function drush_preflight_command_dispatch() {
     if (drush_get_option('pipe')) {
       $backend_options['interactive'] = TRUE;
     }
-
-    if (!drush_get_option('no-label', FALSE) && !$interactive) {
-      $label_separator = ' >> ';
-      $max_name_length = 0;
-      foreach ($site_list as $alias_name => $alias_record) {
-        if (strlen($alias_name) > $max_name_length) {
-          $max_name_length = strlen($alias_name);
-        }
-      }
-      $multi_options['reserve-margin'] = $max_name_length + strlen($label_separator);
-      foreach ($site_list as $alias_name => $alias_record) {
-        $backend_options['output-label'] = str_pad($alias_name, $max_name_length, " ") . $label_separator;
-        $values = drush_do_site_command($alias_record, $command_name, $args, $multi_options, $backend_options);
-      }
-    }
-    else {
-      if ($interactive) {
-        $backend_options['interactive'] = TRUE;
-      }
-      foreach ($site_list as $alias_name => $alias_record) {
-        drush_print(dt("!site >> !command", array('!command' => $command_name . ' ' . implode(" ", $args), '!site' => $alias_name)));
-        $values = drush_do_site_command($alias_record, $command_name, $args, $multi_options, $backend_options);
-        drush_print($values['output']);
-      }
+    if (drush_get_option('no-label', FALSE)) {
+      $backend_options['no-label'] = TRUE;
     }
+    $values = drush_invoke_process($site_record, $command_name, $args, $multi_options, $backend_options);
     return TRUE;
   }
   return FALSE;
@@ -1106,30 +1084,17 @@ function drush_do_multiple_command($command, $source_record, $destination_record
  * Run a command on the site specified by the provided command record.
  *
  * The standard function that provides this service is called
- * drush_invoke_process.  Please call the standard function
- * unless you need to set $integrate = TRUE.
+ * drush_invoke_process.  Please call the standard function.
  *
  * @param backend_options
  *   TRUE - integrate errors
  *   FALSE - do not integrate errors
- *   array - @see drush_backend_invoke_sitealias_command
- */
+ *   array - @see drush_backend_invoke_concurrent
+ *
 function drush_do_site_command($site_record, $command, $args = array(), $command_options = array(), $backend_options = FALSE) {
-  $values = NULL;
-  if (!empty($site_record)) {
-    if (is_bool($backend_options)) {
-      $integrate = $backend_options;
-      $backend_options = array('integrate' => $integrate);
-    }
-    foreach ($site_record as $key => $value) {
-      if (!isset($command_options[$key]) && !in_array($key, drush_sitealias_site_selection_keys())) {
-        $command_options[$key] = $site_record[$key];
-      }
-    }
-    $values = drush_backend_invoke_sitealias_command($site_record, $command, $args, $command_options, $backend_options);
-  }
-  return $values;
+  return drush_invoke_process($site_record, $command, $args, $command_options, $backend_options);
 }
+ */
 
 /**
  * Redispatch the specified command using the same
@@ -1229,8 +1194,8 @@ function drush_backend_packet_log($entry, $backend_options) {
   // Yes, this looks odd, but we might in fact be a backend command
   // that ran another backend command.
   drush_backend_packet('log', $entry);
-  if (array_key_exists('output-label', $backend_options)) {
-    $entry['message'] = $backend_options['output-label'] . $entry['message'];
+  if (array_key_exists('#output-label', $backend_options)) {
+    $entry['message'] = $backend_options['#output-label'] . $entry['message'];
   }
 
   return $callback($entry);
diff --git a/includes/sitealias.inc b/includes/sitealias.inc
index 8d4c837..475bfe0 100644
--- a/includes/sitealias.inc
+++ b/includes/sitealias.inc
@@ -59,16 +59,33 @@ function drush_sitealias_simplify_names($site_list) {
  * it is preferable to simply call drush_sitealias_get_record directly.
  *
  * @param $site_specifications
- *   An array of site specifications.  @see drush_sitealias_get_record().
+ *   One of:
+ *     A comma-separated list of site specifications: '@site1,@site2'
+ *     An array of site specifications: array('@site1','@site2')
+ *     An array of alias records:
+ *       array(
+ *         'site1' => array('root' => ...),
+ *         'site2' => array('root' => ...)
+ *       )
+ *   An array of site specifications.  
+ *   @see drush_sitealias_get_record() for the format of site specifications.
  * @return
  *   An array of alias records
  */
 function drush_sitealias_resolve_sitespecs($site_specifications, $alias_path_context = NULL) {
   $result_list = array();
+  if (!is_array($site_specifications)) {
+    $site_specifications = explode(',', $site_specifications);
+  }
   if (!empty($site_specifications)) {
     foreach ($site_specifications as $site) {
-      $alias_record = drush_sitealias_get_record($site, $alias_path_context);
-      $result_list = array_merge($result_list, drush_sitealias_resolve_sitelist($alias_record));
+      if (is_array($site)) {
+        $result_list[] = $site;
+      }
+      else {
+        $alias_record = drush_sitealias_get_record($site, $alias_path_context);
+        $result_list = array_merge($result_list, drush_sitealias_resolve_sitelist($alias_record));
+      }
     }
   }
   return $result_list;
diff --git a/tests/shellAliasTest.php b/tests/shellAliasTest.php
index e5446db..842a384 100644
--- a/tests/shellAliasTest.php
+++ b/tests/shellAliasTest.php
@@ -83,7 +83,8 @@ class shellAliasesCase extends Drush_CommandTestCase {
     );
     $this->drush('glopts', array(), $options, 'user@server/path/to/drupal#sitename');
     // $expected might be different on non unix platforms. We shall see.
-    $expected = "Simulating backend invoke: ssh user@server 'drush  --simulate --nocolor --uri=sitename --root=/path/to/drupal --config=" . UNISH_SANDBOX . " topic core-global-options --invoke 2>&1' 2>&1";
+    // n.b. --config is not included in calls to remote systems.
+    $expected = "Simulating backend invoke: ssh user@server 'drush  --simulate --nocolor --uri=sitename --root=/path/to/drupal topic core-global-options --invoke 2>&1' 2>&1";
     $output = $this->getOutput();
     $this->assertEquals($expected, $output, 'Expected remote shell alias to a drush command was built');
   }
diff --git a/tests/siteAliasTest.php b/tests/siteAliasTest.php
index 6aee530..9fe4c63 100644
--- a/tests/siteAliasTest.php
+++ b/tests/siteAliasTest.php
@@ -22,12 +22,17 @@ class saCase extends Drush_CommandTestCase {
       $dirs[] = "#$dir";
     }
     $this->drush('php-eval', array($eval), $options, implode(',', $dirs));
-    $expected = "You are about to execute 'php-eval print \"bon\";' non-interactively (--yes forced) on all of the following targets:
-  #dev
+    $output = $this->getOutputAsList();
+    // We sort the output, producing a screwy display, because we cannot
+    // predict the order of the #dev >> and #stage >> lines, since they
+    // are executed concurrently, and emitted in a non-deterministic order.
+    sort($output);
+    $expected = "  #dev
   #stage
-Continue?  (y/n): y
 #dev   >> bon
-#stage >> bon";
-    $this->assertEquals($expected, $this->getOutput());
+#stage >> bon
+Continue?  (y/n): y
+You are about to execute 'php-eval print \"bon\";' non-interactively (--yes forced) on all of the following targets:";
+    $this->assertEquals($expected, implode("\n", $output));
   }
-}
\ No newline at end of file
+}
