diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index cf22ad1..1f13e16 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -95,14 +95,14 @@ function make_drush_command() {
     'aliases' => array('generate-makefile'),
   );
 
-  // Hidden command to build a single project.
+  // Hidden command to build a group of projects.
   $items['make-process'] = array(
     'hidden' => TRUE,
     'arguments' => array(
       'directory' => 'The temporary working directory to use',
     ),
     'options' => array(
-      'project' => 'The project array as generated by make_projects()',
+      'projects' => 'An array of projects generated by make_projects()',
     ),
     'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
     'engines' => array('release_info'),
@@ -208,13 +208,15 @@ function drush_make($makefile = NULL, $build_path = NULL) {
 function drush_make_process($directory) {
   // Set the temporary directory.
   make_tmp(TRUE, $directory);
-  $project = drush_get_option('project', FALSE);
+  $projects = drush_get_option('projects', FALSE);
 
-  if ($instance = DrushMakeProject::getInstance($project['type'], $project)) {
-    $instance->make();
-  }
-  else {
-    make_error('PROJECT-TYPE', dt('Non-existent project type %type on project %project', array('%type' => $project['type'], '%project' => $project['name'])));
+  foreach ($projects as $project) {
+    if ($instance = DrushMakeProject::getInstance($project['type'], $project)) {
+      $instance->make();
+    }
+    else {
+      make_error('PROJECT-TYPE', dt('Non-existent project type %type on project %project', array('%type' => $project['type'], '%project' => $project['name'])));
+    }
   }
 }
 
@@ -402,22 +404,30 @@ function make_projects($recursion, $contrib_destination, $info, $build_path, $ma
 
   // Process all projects concurrently using make-process.
   if (isset($projects['contrib'])) {
+    // Generate drush_get_option('concurrency', 4) sub-processes to do the actual work.
     $invocations = array();
+    $thread = 0;
     foreach ($projects['contrib'] as $project) {
-      $invocations[] = array(
-        'args' => array(
-          make_tmp(),
-        ),
-        'options' => array(
-          'project' => $project,
-        ),
-        'site' => array(),
-      );
+      $thread = ++$thread % drush_get_option('concurrency', 4);
+      // Ensure that we've set this sub-process up.
+      if (!isset($invocations[$thread])) {
+        $invocations[$thread] = array(
+          'args' => array(
+            make_tmp(),
+          ),
+          'options' => array(
+            'projects' => array(),
+          ),
+          'site' => array(),
+        );
+      }
+      // Add the project to this sub-process.
+      $invocations[$thread]['options']['projects'][] = $project;
     }
     if (!empty($invocations)) {
       // Backend options.
       $backend_options = array(
-        'concurrency' => drush_get_option('concurrency', 1),
+        'concurrency' => drush_get_option('concurrency', 4),
         'method' => 'POST',
       );
 
