diff --git a/commands/make/make.download.inc b/commands/make/make.download.inc
index 927133e..bc8afb5 100644
--- a/commands/make/make.download.inc
+++ b/commands/make/make.download.inc
@@ -319,7 +319,11 @@ function make_download_get($name, $download, $download_location) {
  */
 function make_download_git($name, $download, $download_location) {
   $tmp_path = make_tmp();
-  $wc = drush_get_option('working-copy');
+  if ( _make_is_override_allowed('working-copy') && isset ( $download['working-copy'] ) ) {
+    $wc = $download['working-copy'];
+  } else {
+    $wc = drush_get_option('working-copy');
+  }
   // If no download URL specified, assume anonymous clone from git.drupal.org.
   $download['url'] = isset($download['url']) ? $download['url'] : "http://git.drupal.org/project/$name.git";
   // If no working-copy download URL specified, assume it is the same.
@@ -493,10 +497,15 @@ function make_download_git($name, $download, $download_location) {
 function make_download_bzr($name, $download, $download_location) {
   $tmp_path = make_tmp();
   $tmp_location = drush_tempdir() . '/' . basename($download_location);
+  if ( _make_is_override_allowed('working-copy') && isset ( $download['working-copy'] ) ) {
+    $wc = $download['working-copy'];
+  } else {
+    $wc = drush_get_option('working-copy');
+  }
   if (!empty($download['url'])) {
     $args = array();
     $command = 'bzr';
-    if (drush_get_option('working-copy')) {
+    if ($wc) {
       $command .= ' branch  --use-existing-dir';
     }
     else {
@@ -507,7 +516,7 @@ function make_download_bzr($name, $download, $download_location) {
       $args[] = $download['revision'];
     }
     $command .= ' %s %s';
-    if (drush_get_option('working-copy')) {
+    if ($wc) {
       $args[] = $download['url'];
       $args[] = $tmp_location;
     }
@@ -537,6 +546,11 @@ function make_download_bzr($name, $download, $download_location) {
  *   The download location on success, FALSE otherwise.
  */
 function make_download_svn($name, $download, $download_location) {
+  if ( _make_is_override_allowed('working-copy') && isset ( $download['working-copy'] ) ) {
+    $wc = $download['working-copy'];
+  } else {
+    $wc = drush_get_option('working-copy');
+  }
   if (!empty($download['url'])) {
     if (!empty($download['interactive'])) {
       $function = 'drush_shell_exec_interactive';
@@ -548,7 +562,7 @@ function make_download_svn($name, $download, $download_location) {
     if (!isset($download['force']) || $download['force']) {
       $options = ' --force';
     }
-    if (drush_get_option('working-copy')) {
+    if ($wc) {
       $command = 'svn' . $options . ' checkout';
     }
     else {
diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index 2583f2c..88fe793 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -282,6 +282,7 @@ function make_projects($recursion, $contrib_destination, $info, $build_path) {
       'location'            => drush_get_option('make-update-default-url', RELEASE_INFO_DEFAULT_URL),
       'subdir'              => '',
       'directory_name'      => '',
+      'options'             => array(),
     );
     // If download components are specified, but not the download
     // type, default to git. Additionally, if the 'revision' parameter is
diff --git a/commands/make/make.project.inc b/commands/make/make.project.inc
index 28b2140..9ae8aa5 100644
--- a/commands/make/make.project.inc
+++ b/commands/make/make.project.inc
@@ -39,6 +39,9 @@ class DrushMakeProject {
     foreach ($project as $key => $value) {
       $this->{$key} = $value;
     }
+    if ($this->options['working-copy']) {
+      $this->download['working-copy'] = TRUE;
+    }
   }
 
   /**
@@ -394,15 +397,27 @@ class DrushMakeProject {
     }
     drush_log(dt("Found makefile: %makefile", array("%makefile" => basename($makefile))), 'ok');
 
-    $info = make_parse_info_file($makefile);
+    // Save the original state of the 'custom' context
+    $custom_context =& drush_get_context('custom');
+    $original_custom_context_values = $custom_context;
+
+    $info = make_parse_info_file($makefile, TRUE, $this->options);
     if (!($info = make_validate_info_file($info))) {
-      return FALSE;
+      $result = FALSE;
+    }
+    else {
+      $build_path = $this->buildPath($this->name);
+      make_projects(TRUE, trim($build_path, '/'), $info, $this->build_path);
+      make_libraries(trim($build_path, '/'), $info, $this->build_path);
+
+      $result = TRUE;
     }
-    $build_path = $this->buildPath($this->name);
-    make_projects(TRUE, trim($build_path, '/'), $info, $this->build_path);
-    make_libraries(trim($build_path, '/'), $info, $this->build_path);
 
-    return TRUE;
+    // Restore original 'custom' context so that any
+    // settings changes made
+    $custom_context = $original_custom_context_values;
+
+    return $result;
   }
 }
 
diff --git a/commands/make/make.utilities.inc b/commands/make/make.utilities.inc
index b2fb9bf..8879382 100644
--- a/commands/make/make.utilities.inc
+++ b/commands/make/make.utilities.inc
@@ -11,13 +11,25 @@
  *
  * @see drupal_parse_info_file
  */
-function make_parse_info_file($makefile, $parsed = TRUE) {
+function make_parse_info_file($makefile, $parsed = TRUE, $makefile_options = array()) {
   if (!($data = make_get_data($makefile))) {
     return drush_set_error(dt('Invalid or empty make file: %makefile', array('%makefile' => $makefile)));
   }
   if (!($info = _drush_drupal_parse_info_file($data))) {
     return FALSE;
   }
+  // $makefile_options are from projects[projectname][options][...] = value in the makefile that included us,
+  // whereas $info['options'] is from options[...] = value in this makefile.
+  $makefile_options = array_merge($makefile_options, empty($info['options']) ? array() : $info['options']);
+  if(!empty($makefile_options)) {
+    foreach( $makefile_options as $key => $value) {
+      if(_make_is_override_allowed($key)) {
+        // n.b. 'custom' context has lower priority than 'cli', so
+        // options entered on the command line will "mask" makefile options.
+        drush_set_option($key, $value, 'custom');
+      }
+    }
+  }
   if (!empty($info['includes'])) {
     $include_path = dirname($makefile);
     $includes = array();
@@ -492,3 +504,19 @@ if (!function_exists('sys_get_temp_dir')) {
     }
   }
 }
+
+function _make_is_override_allowed ( $option ) {
+  $allow_override = drush_get_option('allow-override', 'all');
+  if ($allow_override == 'none') {
+    return FALSE;
+  } else if ($allow_override == 'all') {
+    $allow_override = array();
+  } else if (!is_array($allow_override)) {
+    $allow_override = explode(',', $allow_override);
+  }
+
+  if((empty($allow_override)) || (in_array($option, $allow_override))) {
+    return TRUE;
+  }
+  return FALSE;
+}
\ No newline at end of file
diff --git a/tests/makeTest.php b/tests/makeTest.php
index b60ad5b..2f9656e 100644
--- a/tests/makeTest.php
+++ b/tests/makeTest.php
@@ -58,6 +58,46 @@ class makeMakefileCase extends Drush_CommandTestCase {
     $this->runMakefileTest('no-patch-txt');
   }
 
+  /**
+   * Test no-core and working-copy in options array.
+   */
+  function testMakeOptionsArray() {
+    // Use the goptions-array.make file.
+    $config = $this->getMakefile('options-array');
+
+    $makefile_path = dirname(__FILE__) . '/makefiles';
+    $makefile = $makefile_path . '/' . $config['makefile'];
+    $this->drush('make', array($makefile, UNISH_SANDBOX . '/test-build'), $options);
+
+    // Test cck_signup .git/HEAD file.
+    $this->assertFileExists(UNISH_SANDBOX . '/test-build/sites/all/modules/cck_signup/.git/HEAD');
+    $contents = file_get_contents(UNISH_SANDBOX . '/test-build/sites/all/modules/cck_signup/.git/HEAD');
+    $this->assertContains('2fe932c', $contents);
+
+    // Test context_admin .git/HEAD file.
+    $this->assertFileExists(UNISH_SANDBOX . '/test-build/sites/all/modules/context_admin/.git/HEAD');
+    $contents = file_get_contents(UNISH_SANDBOX . '/test-build/sites/all/modules/context_admin/.git/HEAD');
+    $this->assertContains('eb9f05e', $contents);
+  }
+
+  /**
+   * Test per project working-copy option.
+   */
+  function testMakeOptionsProject() {
+    // Use the options-project.make file.
+    $config = $this->getMakefile('options-project');
+
+    $makefile_path = dirname(__FILE__) . '/makefiles';
+    $options = array('no-core' => NULL);
+    $makefile = $makefile_path . '/' . $config['makefile'];
+    $this->drush('make', array($makefile, UNISH_SANDBOX . '/test-build'), $options);
+
+    // Test context_admin .git/HEAD file.
+    $this->assertFileExists(UNISH_SANDBOX . '/test-build/sites/all/modules/context_admin/.git/HEAD');
+    $contents = file_get_contents(UNISH_SANDBOX . '/test-build/sites/all/modules/context_admin/.git/HEAD');
+    $this->assertContains('eb9f05e', $contents);
+  }
+
   function testMakePatch() {
     $this->runMakefileTest('patch');
   }
@@ -415,6 +455,18 @@ class makeMakefileCase extends Drush_CommandTestCase {
         'md5' => '7c10e6fc65728a77a2b0aed4ec2a29cd',
         'options'  => array('no-core' => NULL, 'libraries' => 'drush_make,token'),
       ),
+      'options-array' => array(
+        'name'     => 'Test global options array',
+        'makefile' => 'options-array.make',
+        'build'    => TRUE,
+        'options'  => array(),
+      ),
+      'options-project' => array(
+        'name'     => 'Test per-project options array',
+        'makefile' => 'options-project.make',
+        'build'    => TRUE,
+        'options'  => array(),
+      ),
     );
     return $tests[$key];
   }
diff --git a/tests/makefiles/options-array.make b/tests/makefiles/options-array.make
new file mode 100644
index 0000000..c19d4bb
--- /dev/null
+++ b/tests/makefiles/options-array.make
@@ -0,0 +1,14 @@
+core = 6.x
+api = 2
+
+; Test that make preserves VCS directories.
+options[working-copy] = TRUE
+; Test that make does not require a Drupal core project.
+options[no-core] = TRUE
+
+; Test that make defaults to download type of git if any download
+; parameters are present.
+projects[cck_signup][download][revision] = "2fe932c"
+
+; Test that revision passed in main level works as shorthand for download revision.
+projects[context_admin][revision] = "eb9f05e"
diff --git a/tests/makefiles/options-project.make b/tests/makefiles/options-project.make
new file mode 100644
index 0000000..9d4c5a9
--- /dev/null
+++ b/tests/makefiles/options-project.make
@@ -0,0 +1,11 @@
+core = 6.x
+api = 2
+
+; Test that revision passed in main level works as shorthand for download revision.
+projects[context_admin][revision] = "eb9f05e"
+; Test that make preserves VCS directories.
+projects[context_admin][options][working-copy] = TRUE
+
+; Test that make defaults to download type of git if any download
+; parameters are present.
+projects[cck_signup][download][revision] = "2fe932c"
