diff --git a/commands/core/rsync.core.inc b/commands/core/rsync.core.inc
index 885548e..60a134a 100644
--- a/commands/core/rsync.core.inc
+++ b/commands/core/rsync.core.inc
@@ -15,11 +15,13 @@
  *   the scope of this one call).
  */
 function drush_core_rsync($source, $destination, $additional_options = array()) {
-  // Preflight destination in case it defines aliases used by the source
-  _drush_sitealias_preflight_path($destination);
-  // After preflight, evaluate file paths
-  $source_settings = drush_sitealias_evaluate_path($source, $additional_options, FALSE, "rsync", 'source-');
+  // Preflight source in case it defines aliases used by the destination
+  _drush_sitealias_preflight_path($source);
+  // After preflight, evaluate file paths.  We evaluate destination paths first, because
+  // there is a first-one-wins policy with --exclude-paths, and we want --target-command-specific
+  // to take precidence over --source-command-specific.
   $destination_settings = drush_sitealias_evaluate_path($destination, $additional_options, FALSE, "rsync", 'target-');
+  $source_settings = drush_sitealias_evaluate_path($source, $additional_options, FALSE, "rsync", 'source-');
   $source_path = $source_settings['evaluated-path'];
   $destination_path = $destination_settings['evaluated-path'];
 
@@ -100,7 +102,7 @@ function drush_core_call_rsync($source, $destination, $additional_options = arra
   foreach (array('include', 'exclude') as $include_exclude) {
     // Get the option --include-path or --exclude-path and explode to an array of paths
     // that we will translate into an --include or --exclude option to pass to rsync
-    $inc_ex_path = explode(PATH_SEPARATOR, drush_get_option(array($include_exclude . '-path', $include_exclude . '-paths'), ''));
+    $inc_ex_path = explode(PATH_SEPARATOR, drush_get_option($include_exclude . '-paths', ''));
     foreach ($inc_ex_path as $one_path_to_inc_ex) {
       if (!empty($one_path_to_inc_ex)) {
         $options .= ' --' . $include_exclude . '="' . $one_path_to_inc_ex . '"';
diff --git a/includes/sitealias.inc b/includes/sitealias.inc
index 7caf5ef..635157d 100644
--- a/includes/sitealias.inc
+++ b/includes/sitealias.inc
@@ -1741,18 +1741,34 @@ function drush_sitealias_evaluate_path($path, &$additional_options, $local_only
   }
 
   // If the --exclude-other-sites option is specified, then
-  // convert that into --include-path='%site' and --exclude-sites.
+  // convert that into --include-paths='%site' and --exclude-sites.
   if (drush_get_option_override($additional_options, 'exclude-other-sites', FALSE) && !drush_get_option_override($additional_options, 'exclude-other-sites-processed', FALSE, 'process')) {
-    $additional_options['include-path'] = '%site,' . drush_get_option_override($additional_options, 'include-path', '');
+    $include_path_option = drush_get_option_override($additional_options, 'include-paths', '');
+    $additional_options['include-paths'] = '%site';
+    if (!empty($include_path_option)) {
+      // We use PATH_SEPARATOR here because we are later going to explicitly explode() this variable using PATH_SEPARATOR.
+      $additional_options['include-paths'] .= PATH_SEPARATOR . $include_path_option;
+    }
     $additional_options['exclude-sites'] = TRUE;
     $additional_options['exclude-other-sites-processed'] = TRUE;
   }
+  else {
+    unset($additional_options['include-paths']);
+  }
   // If the --exclude-files option is specified, then
-  // convert that into --exclude-path='%files'.
+  // convert that into --exclude-paths='%files'.
   if (drush_get_option_override($additional_options, 'exclude-files', FALSE) && !drush_get_option_override($additional_options, 'exclude-files-processed', FALSE, 'process')) {
-    $additional_options['exclude-path'] = '%files,' . drush_get_option_override($additional_options, 'exclude-path', '');
+    $exclude_path_option = drush_get_option_override($additional_options, 'exclude-paths', '');
+    $additional_options['exclude-paths'] = '%files';
+    if (!empty($exclude_path_option)) {
+      // We use PATH_SEPARATOR here because we are later going to explicitly explode() this variable using PATH_SEPARATOR.
+      $additional_options['exclude-paths'] .= PATH_SEPARATOR . $exclude_path_option;
+    }
     $additional_options['exclude-files-processed'] = TRUE;
   }
+  else {
+    unset($additional_options['exclude-paths']);
+  }
 
   // If there was no site specification given, and the
   // machine is local, then try to look
@@ -1770,8 +1786,8 @@ function drush_sitealias_evaluate_path($path, &$additional_options, $local_only
   // in it, so that resolution is only done if the path alias is referenced.
   // Therefore, we can concatenate without worrying too much about the structure of
   // this variable's contents.
-  $include_path = drush_get_option_override($additional_options, 'include-path', '');
-  $exclude_path = drush_get_option_override($additional_options, 'exclude-path', '');
+  $include_path = drush_get_option_override($additional_options, 'include-paths', '');
+  $exclude_path = drush_get_option_override($additional_options, 'exclude-paths', '');
   $resolve_path = $path . $include_path . $exclude_path;
   // Resolve path aliases such as %files, if any exist in the path
   if (!empty($resolve_path)) {
@@ -1811,10 +1827,10 @@ function drush_sitealias_evaluate_path($path, &$additional_options, $local_only
   // Fill in path aliases in the path, the include path and the exclude path.
   $path = str_replace(array_keys($full_path_aliases), array_values($full_path_aliases), $path);
   if (!empty($include_path)) {
-    drush_set_option('include-path', str_replace(array_keys($path_aliases), array_values($path_aliases), $include_path));
+    drush_set_option('include-paths', str_replace(array_keys($path_aliases), array_values($path_aliases), $include_path));
   }
   if (!empty($exclude_path)) {
-    drush_set_option('exclude-path', str_replace(array_keys($path_aliases), array_values($path_aliases), $exclude_path));
+    drush_set_option('exclude-paths', str_replace(array_keys($path_aliases), array_values($path_aliases), $exclude_path));
   }
   // Next make the rsync path, which includes the machine
   // and path components together.
diff --git a/tests/commandSpecificTest.php b/tests/commandSpecificTest.php
index 811a938..2c27bd3 100644
--- a/tests/commandSpecificTest.php
+++ b/tests/commandSpecificTest.php
@@ -31,6 +31,9 @@ class commandSpecificCase extends Drush_CommandTestCase {
           'exclude-paths' => 'excluded_by_target',
         ),
       ),
+      'path-aliases' => array(
+        '%files' => 'sites/default/files',
+      ),
     );
     $contents = $this->file_aliases($aliases);
     $return = file_put_contents($path, $contents);
@@ -40,6 +43,7 @@ class commandSpecificCase extends Drush_CommandTestCase {
     $options = array(
       'alias-path' => UNISH_SANDBOX,
       's' => NULL,
+      'include-vcs' => NULL,
     );
     $this->drush('core-rsync', array('/tmp', '@site1'), $options);
     $output = trim($this->getOutput());
@@ -50,5 +54,20 @@ class commandSpecificCase extends Drush_CommandTestCase {
     $this->drush('core-rsync', array('@site1', '@site1'), $options);
     $output = trim($this->getOutput());
     $this->assertContains('excluded_by_target', $output);
+    // Now do that all again with 'exclude-files'
+    $options['exclude-files'] = NULL;
+    $this->drush('core-rsync', array('/tmp', '@site1'), $options);
+    $output = trim($this->getOutput());
+    $this->assertContains('sites/default/files', $output);
+    $this->assertContains('excluded_by_target', $output);
+    $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->drush('core-rsync', array('@site1', '@site1'), $options);
+    $output = trim($this->getOutput());
+    $this->assertContains('sites/default/files', $output);
+    $this->assertContains('excluded_by_target', $output);
   }
 }
