diff --git a/commands/core/core.drush.inc b/commands/core/core.drush.inc
index 05276c3..675e08e 100644
--- a/commands/core/core.drush.inc
+++ b/commands/core/core.drush.inc
@@ -152,7 +152,7 @@ function core_drush_command() {
     'required-arguments' => TRUE,
     'allow-additional-options' => TRUE,
     'handle-remote-commands' => TRUE,
-    'mask-local-cli-options' => TRUE,
+    'strict-option-handling' => TRUE,
     'examples' => array(
       'drush core-execute git pull origin rebase' => 'Retrieve latest code from git',
     ),
@@ -178,7 +178,7 @@ function core_drush_command() {
       'exclude-paths' => 'List of paths to exclude, seperated by : (Unix-based systems) or ; (Windows).',
       'include-paths' => 'List of paths to include, seperated by : (Unix-based systems) or ; (Windows).',
     ),
-    'allow-additional-options' => TRUE,
+    'strict-option-handling' => TRUE,
     'examples' => array(
       'drush rsync @dev @stage' => 'Rsync Drupal root from dev to stage (one of which must be local).',
       'drush rsync ./ @stage:%files/img' => 'Rsync all files in the current directory to the \'img\' directory in the file storage folder on stage.',
@@ -1108,8 +1108,8 @@ function drush_core_find_project_path($target) {
  * that start with !.
  */
 function drush_core_execute() {
-  // The DRUSH_COMMAND_ARGS contain all args and options that appear after the command name.
-  $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
+  // Get all of the args and options that appear after the command name.
+  $args = drush_get_original_cli_args_and_options();
   for ($x = 0; $x < sizeof($args); $x++) {
     // escape all args except for command separators.
     if (!in_array($args[$x], array('&&', '||', ';'))) {
diff --git a/commands/core/rsync.core.inc b/commands/core/rsync.core.inc
index 60a134a..db25bb5 100644
--- a/commands/core/rsync.core.inc
+++ b/commands/core/rsync.core.inc
@@ -58,8 +58,18 @@ function drush_core_rsync($source, $destination, $additional_options = array())
     // destination contains a : or a /.
     $include_settings_is_default = (strpos($source . $destination, ':') !== FALSE) || (strpos($source . $destination, '/') !== FALSE);
 
+    $options = _drush_build_rsync_options($additional_options, $include_settings_is_default);
+
+    // Get all of the args and options that appear after the command name.
+    $original_args = drush_get_original_cli_args_and_options();
+    foreach ($original_args as $original_option) {
+      if ($original_option{0} == '-') {
+        $options .= ' ' . $original_option;
+      }
+    }
+    
     // Go ahead and call rsync with the paths we determined
-    return drush_core_call_rsync($source_path, $destination_path, $additional_options, $include_settings_is_default);
+    return drush_core_exec_rsync($source_path, $destination_path, $options);
   }
 }
 
@@ -88,8 +98,32 @@ function drush_core_rsync($source, $destination, $additional_options = array())
  *   TRUE on success, FALSE on failure.
  */
 function drush_core_call_rsync($source, $destination, $additional_options = array(), $include_settings_is_default = TRUE, $live_output = TRUE) {
-  // Exclude vcs reserved files.
+  $options = _drush_build_rsync_options($additional_options, $include_settings_is_default);  
+  return drush_core_exec_rsync($source, $destination, $options, $additional_options, $live_output);
+}
+
+function drush_core_exec_rsync($source, $destination, $options, $additional_options = array(), $live_output = TRUE) {
+  $ssh_options = drush_get_option_override($additional_options, 'ssh-options', '');
+  $exec = "rsync -e 'ssh $ssh_options' $options $source $destination";
+
+  if ($live_output) {
+    $exec_result = drush_op_system($exec);
+    $result = ($exec_result == 0);
+  }
+  else {
+    $result = drush_shell_exec($exec);
+  }
+
+  if (!$result) {
+    drush_set_error('DRUSH_RSYNC_FAILED', dt("Could not rsync from !source to !dest", array('!source' => $source, '!dest' => $destination)));
+  }
+
+  return $result;
+}
+
+function _drush_build_rsync_options($additional_options, $include_settings_is_default = TRUE) {
   $options = '';
+  // Exclude vcs reserved files.
   if (!_drush_rsync_option_exists('include-vcs', $additional_options)) {
     $vcs_files = drush_version_control_reserved_files();
     foreach ($vcs_files as $file) {
@@ -127,105 +161,11 @@ function drush_core_call_rsync($source, $destination, $additional_options = arra
     $mode .= 'v';
     $options .= ' --stats --progress';
   }
-  $rsync_available_options = array(
-    // unary options
-    'archive', // -a
-    'recursive', // -r
-    'relative', // -R
-    'backup', // -b
-    'update', // -u
-    'checksum', // -c
-    'dirs', // -d
-    'links', // -l
-    'copy-links', // -L
-    'copy-dirlinks', // -k
-    'keep-dirlinks', // -K
-    'hard-links', // -H
-    'perms', // -p
-    'executability', // -E
-    'acls', // -A
-    'xattrs', // -X
-    'owner', // -o
-    'group', // -g
-    'times', // -t
-    'omit-dir-times', // -O
-    'sparse', // -S
-    'dry-run', // -n
-    'whole-file', // -W
-    'one-file-system', // -x
-    'prune-empty-dirs', // -m
-    'ignore-times', // -I
-    'fuzzy', // -y
-    'cvs-exclude', // -C
-    'compress', // -Z
-    'protect-args', // -s
-    '8-bit-output', // -8
-    'human-readable', // -h
-    'itemize-changes', // -i
-    'copy-unsafe-links',
-    'safe-links',
-    'no-implied-dirs',
-    'inplace',
-    'append',
-    'append-verify',
-    'existing',
-    'remove-source-files',
-    'delete',
-    'delete-before',
-    'delete-during',
-    'delete-delay',
-    'delete-after',
-    'delete-excluded',
-    'ignore-errors',
-    'force',
-    'ignore-existing',
-    'partial',
-    'delay-updates',
-    'numeric-ids',
-    'size-only',
-    'blocking-io',
-    'stats',
-    'progress',
-    'list-only',
-    // options with values
-    'block-size',
-    'backup-dir',
-    'suffix',
-    'chmod',
-    'rsync-path',
-    'modify-window',
-    'compare-dest',
-    'copy-dest',
-    'link-dest',
-    'skip-compress',
-    'filter',
-    // filter out 'exclude'; consistency with --include. Use --exclude-paths.
-    'exclude-from',
-    // filter out 'include'; conflicts with global drush --include option. Use --include-paths.
-    'include-from',
-    'files-from',
-    'address',
-    'port',
-    'sockopts',
-    'out-format',
-    'bwlimit',
-    'iconv',
-    'checksum-seed',
-    'max-delete',
-    'max-size',
-    'min-size',
-    'partial-dir',
-    'timeout',
-    'temp-dir',
-    'compress-level',
-    'out-format',
-    'protocol',
-    );
+
   // Check if the user has set $options['rsync-version'] to enable rsync legacy version support.
   // Drush was written for rsync 2.6.9 or later, so assume that version if nothing was explicitly set.
   $rsync_version = drush_get_option(array('rsync-version','source-rsync-version','target-rsync-version'), '2.6.9');
-  foreach ($rsync_available_options as $test_option) {
-    $value = drush_get_option_override($additional_options, $test_option);
+  foreach ($additional_options as $test_option => $value) {
     // Downgrade some options for older versions of rsync
     if ($test_option == 'remove-source-files') {
       if (version_compare($rsync_version, '2.6.4', '<')) {
@@ -246,22 +186,7 @@ function drush_core_call_rsync($source, $destination, $additional_options = arra
     }
   }
 
-  $ssh_options = drush_get_option_override($additional_options, 'ssh-options', '');
-  $exec = "rsync -e 'ssh $ssh_options' $mode$options $source $destination";
-
-  if ($live_output) {
-    $exec_result = drush_op_system($exec);
-    $result = ($exec_result == 0);
-  }
-  else {
-    $result = drush_shell_exec($exec);
-  }
-
-  if (!$result) {
-    drush_set_error('DRUSH_RSYNC_FAILED', dt("Could not rsync from !source to !dest", array('!source' => $source, '!dest' => $destination)));
-  }
-
-  return $result;
+  return $mode . $options;
 }
 
 function _drush_rsync_option_exists($option, $additional_options) {
diff --git a/commands/core/ssh.drush.inc b/commands/core/ssh.drush.inc
index 6001598..324f73d 100644
--- a/commands/core/ssh.drush.inc
+++ b/commands/core/ssh.drush.inc
@@ -15,7 +15,7 @@ function ssh_drush_command() {
     ),
     'options' => drush_shell_exec_proc_build_options(),
     'handle-remote-commands' => TRUE,
-    'mask-local-cli-options' => TRUE,
+    'strict-option-handling' => TRUE,
     'examples' => array(
       'drush @mysite ssh' => 'Open an interactive shell on @mysite\'s server.',
       'drush @prod ssh \'ls /tmp\'' => 'Run "ls /tmp" on @prod site. If @prod is a site list, then ls will be executed on each site.',
@@ -31,8 +31,8 @@ function ssh_drush_command() {
  * Command callback.
  */
 function drush_ssh_site_ssh($command = NULL) {
-  // The DRUSH_COMMAND_ARGS contain all args and options that appear after the command name.
-  $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
+  // Get all of the args and options that appear after the command name.
+  $args = drush_get_original_cli_args_and_options();
   // n.b. we do not escape the first (0th) arg to allow `drush ssh 'ls /path'`
   // to work in addition to the preferred form of `drush ssh ls /path`.
   // Supporting the legacy form means that we cannot give the full path to an
diff --git a/includes/backend.inc b/includes/backend.inc
index eee283f..6a491a9 100644
--- a/includes/backend.inc
+++ b/includes/backend.inc
@@ -755,6 +755,7 @@ function _drush_backend_classify_options($site_record, $command_options, &$backe
   $post_options = array();
   $commandline_options = array();
   $drush_global_options = array();
+  $drush_local_options = array();
   $additional_backend_options = array();
   foreach ($site_record as $key => $value) {
     if (!in_array($key, drush_sitealias_site_selection_keys())) {
@@ -766,6 +767,10 @@ function _drush_backend_classify_options($site_record, $command_options, &$backe
       }
     }
   }
+  if (array_key_exists('drush-local-options', $backend_options)) {
+    $drush_local_options = $backend_options['drush-local-options'];
+    $command_options += $drush_local_options;
+  }
   foreach ($command_options as $key => $value) {
     $global = array_key_exists($key, $global_option_list);
     $propagate = TRUE;
diff --git a/includes/command.inc b/includes/command.inc
index f427e24..6e2ec1c 100644
--- a/includes/command.inc
+++ b/includes/command.inc
@@ -1029,7 +1029,7 @@ function drush_command_defaults($key, $commandfile, $path) {
     'drupal dependencies' => array(),
     'drush dependencies' => array(),
     'handle-remote-commands' => FALSE,
-    'mask-local-cli-options' => FALSE,
+    'strict-option-handling' => FALSE,
     'bootstrap_errors' => array(),
     'topics' => array(),
     'hidden' => FALSE,
@@ -1092,7 +1092,7 @@ function _drush_command_translate($source) {
  *   locally rather than remotely dispatched.  When this mode is set, the target site
  *   can be obtained via:
  *     drush_get_context('DRUSH_TARGET_SITE_ALIAS')
- * - mask-local-cli-options: set to TRUE if drush should strictly separate local command
+ * - strict-option-handling: set to TRUE if drush should strictly separate local command
  *   cli options from the global options.  Usually, drush allows global cli options and
  *   command cli options to be interspersed freely on the commandline.  For commands where
  *   this flag is set, options are separated, with global options comming before the
@@ -1100,9 +1100,10 @@ function _drush_command_translate($source) {
  *     drush --global-options command --command-options
  *   In this mode, the command options are no longer available via drush_get_option();
  *   instead, they can be retrieved via:
+ *     $args = drush_get_original_cli_args_and_options();
  *     $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
- *   In this case, $args will contain the command options literally, exactly as they
- *   were entered on the command line.
+ *   In this case, $args will contain the command args and options literally, exactly as they
+ *   were entered on the command line, and in the same order as they appeared.
  */
 function drush_parse_command() {
   $args = drush_get_arguments();
@@ -1541,6 +1542,24 @@ function _drush_command_set_default_options($command_default_options, $command)
 }
 
 /**
+ * Return the original cli args and options, exactly as they
+ * appeared on the command line, and in the same order.
+ * Any command-specific options that were set will also
+ * appear in this list, appended at the very end.
+ *
+ * The args and options returned are raw, and must be
+ * escaped as necessary before use.
+ */
+function drush_get_original_cli_args_and_options() {
+  $args = drush_get_context('DRUSH_COMMAND_ARGS', array());
+  $command_specific_options = drush_get_context('specific');
+  foreach ($command_specific_options as $key => $value) {
+    $args[] = "--$key=$value";
+  }
+  return $args;
+}
+
+/**
  * Determine whether a command file implements a hook.
  *
  * @param $module
diff --git a/includes/drush.inc b/includes/drush.inc
index 1fd0875..f841cdb 100644
--- a/includes/drush.inc
+++ b/includes/drush.inc
@@ -994,15 +994,36 @@ function drush_preflight_command_dispatch() {
   if (isset($command)) {
     drush_command_default_options($command);
   }
-  // If the command sets the 'mask-local-cli-options' flag, then we will remove
+  // If the command sets the 'strict-option-handling' flag, then we will remove
   // any cli options that appear after the command name form the 'cli' context.
   // The cli options that appear before the command name are stored in the
   // 'DRUSH_GLOBAL_CLI_OPTIONS' context, so we will just overwrite the cli context
   // with this, after doing the neccessary fixup from short-form to long-form options.
-  if (is_array($command) && !empty($command['mask-local-cli-options'])) {
-    $global_cli_options = drush_get_context('DRUSH_GLOBAL_CLI_OPTIONS', array());
-    drush_expand_short_form_options($global_cli_options);
-    drush_set_context('cli', $global_cli_options);
+  // After we do that, we put back any local drush options identified by $command['options'].
+  if (is_array($command) && !empty($command['strict-option-handling'])) {
+    $cli_options = drush_get_context('DRUSH_GLOBAL_CLI_OPTIONS', array());
+    // Now we are going to sort out any options that exist in $command['options'];
+    // we will remove these from DRUSH_COMMAND_ARGS and put them back into the
+    // cli options.
+    $cli_context = drush_get_context('cli');
+    $remove_from_command_args = array();
+    foreach ($command['options'] as $option => $info) {
+      if (array_key_exists($option, $cli_context)) {
+        $cli_options[$option] = $cli_context[$option];
+        $remove_from_command_args[$option] = $option;
+      }
+    }
+    if (!empty($remove_from_command_args)) {
+      $drush_command_args = array();
+      foreach (drush_get_context('DRUSH_COMMAND_ARGS') as $arg) {
+        if (!_drush_should_remove_command_arg($arg, $remove_from_command_args)) {
+          $drush_command_args[] = $arg;
+        }
+      }
+      drush_set_context('DRUSH_COMMAND_ARGS', $drush_command_args);
+    }
+    drush_expand_short_form_options($cli_options);
+    drush_set_context('cli', $cli_options);
     _drush_bootstrap_global_options();
   }
   // If the command sets the 'handle-remote-commands' flag, then we will short-circuit
@@ -1058,6 +1079,53 @@ function drush_preflight_command_dispatch() {
 }
 
 /**
+ * Determine whether or not an argument should be removed from the
+ * DRUSH_COMMAND_ARGS context.  This method is used when a Drush
+ * command has set the 'strict-option-handling' flag indicating
+ * that it will pass through all commandline arguments and any
+ * additional options (not known to Drush) to some shell command.
+ *
+ * Take as an example the following call to core-rsync:
+ *
+ *   drush --yes core-rsync -v -az --exclude-paths='.git:.svn' local-files/ @site:%files
+ *
+ * In this instance:
+ *
+ *   --yes is a global Drush option
+ *
+ *   -v is an rsync command.  It will make rsync run in verbose mode, 
+ *     but will not make Drush run in verbose mode due to the fact that
+ *     core-rsync sets the 'strict-option-handling' flag.
+ *
+ *   --exclude-paths is a local Drush option.  It will be converted by
+ *     Drush into --exclude='.git' and --exclude='.svn', and then passed
+ *     on to the rsync command.
+ *
+ * The parameter $arg passed to this function is one of the elements
+ * of DRUSH_COMMAND_ARGS.  It will have values such as:
+ *   -v
+ *   -az
+ *   --exclude-paths='.git:.svn'
+ *   local-files/
+ *   @site:%files
+ *
+ * Our job in this function is to determine if $arg should be removed
+ * by virtue of appearing in $removal_list.  $removal_list is an array
+ * that will contain values such as 'exclude-paths'.  Both the key and
+ * the value of $removal_list is the same.
+ */
+function _drush_should_remove_command_arg($arg, $removal_list) {
+  foreach ($removal_list as $candidate) {
+    if (($arg == "-$candidate") ||
+        ($arg == "--$candidate") ||
+        (substr($arg,0,strlen($candidate)+3) == "--$candidate=") ) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
  * Used by functions that operate on lists of sites, moving
  * information from the source to the destination.  Currenlty
  * this includes 'drush rsync' and 'drush sql sync'.
diff --git a/tests/commandSpecificTest.php b/tests/commandSpecificTest.php
index 2c27bd3..5dd6e55 100644
--- a/tests/commandSpecificTest.php
+++ b/tests/commandSpecificTest.php
@@ -42,7 +42,7 @@ class commandSpecificCase extends Drush_CommandTestCase {
   function testCommandSpecific() {
     $options = array(
       'alias-path' => UNISH_SANDBOX,
-      's' => NULL,
+      'simulate' => NULL,
       'include-vcs' => NULL,
     );
     $this->drush('core-rsync', array('/tmp', '@site1'), $options);
@@ -63,8 +63,7 @@ class commandSpecificCase extends Drush_CommandTestCase {
     $this->drush('core-rsync', array('@site1', '/tmp'), $options);
     $output = trim($this->getOutput());
     $this->assertContains('sites/default/files', $output);
-// This one fails: --exclude='excluded_by_source' is not included in output
-//    $this->assertContains('excluded_by_source', $output);
+    $this->assertContains('excluded_by_source', $output);
     $this->drush('core-rsync', array('@site1', '@site1'), $options);
     $output = trim($this->getOutput());
     $this->assertContains('sites/default/files', $output);
