diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index 2004d63..9222210 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -41,7 +41,7 @@ function make_drush_command() {
         'description' => 'Limits the number of concurrent projects that will be processed at the same time. The default is 4.',
         'example-value' => '1',
       ),
-      'contrib-destination' => 'Specify a path under which modules and themes should be placed. Defaults to sites/all.',
+      'contrib-destination' => 'Specify a path under which modules and themes should be placed. Defaults to sites/all for Drupal 6,7 and the corresponding directory in the Drupal root for Drupal 8 and above.',
       'force-complete' => 'Force a complete build even if errors occur.',
       'ignore-checksums' => 'Ignore md5 checksums for downloads.',
       'md5' => array(
@@ -184,10 +184,11 @@ function drush_make($makefile = NULL, $build_path = NULL) {
   if ($info === FALSE || ($info = make_validate_info_file($info)) === FALSE) {
     return FALSE;
   }
-  $make_dir = realpath(dirname($makefile));
-  if (make_projects(FALSE, drush_get_option('contrib-destination', 'sites/all'), $info, $build_path, $make_dir)) {
-    make_libraries(drush_get_option('contrib-destination', 'sites/all'), $info, $build_path, $make_dir);
 
+  $make_dir = realpath(dirname($makefile));
+  $sitewide = drush_drupal_sitewide_directory($includes['core'][0]);
+  if (make_projects(FALSE, drush_get_option('contrib-destination', $sitewide), $info, $build_path, $make_dir)) {
+    make_libraries(drush_get_option('contrib-destination', $sitewide), $info, $build_path, $make_dir);
 
     if (drush_get_option('prepare-install')) {
       make_prepare_install($build_path);
diff --git a/commands/pm/download.pm.inc b/commands/pm/download.pm.inc
index 833a1fc..d56fe42 100644
--- a/commands/pm/download.pm.inc
+++ b/commands/pm/download.pm.inc
@@ -262,28 +262,29 @@ function pm_drush_pm_download_destination_alter(&$project, $release) {
 }
 
 /**
- * Determine a candidate destination directory for a particular site path and
- * return it if it exists, optionally attempting to create the directory.
+ * Determines a candidate destination directory for a particular site path.
+ *
+ * Optionally attempts to create the directory.
+ *
+ * @return String the candidate destination if it exists.
  */
 function _pm_download_destination_lookup($type, $drupal_root, $sitepath, $create = FALSE) {
-  switch ($type) {
-    case 'module':
-      // Prefer sites/all/modules/contrib if it exists.
-      $destination = $sitepath . '/modules';
-      $contrib = $destination . '/contrib';
-      if (is_dir($contrib)) {
-        $destination = $contrib;
-      }
-      break;
-    case 'theme':
-      $destination = $sitepath . '/themes';
-      break;
-    case 'theme engine':
-      $destination = $sitepath . '/themes/engines';
-      break;
-    case 'profile':
-      $destination = $drupal_root . '/profiles';
-      break;
+  if ($type == 'theme engine') {
+    $directory = 'themes/engines';
+  }
+  // Profiles in Drupal < 8
+  elseif (($type == 'profile') && (drush_drupal_major_version() < 8)) {
+    $directory = 'profiles';
+  }
+  // Type: module, theme or profile.
+  else {
+    $directory = $type . 's';
+    // Prefer /contrib if it exists.
+    $destination = $sitepath . '/' . $directory;
+    $contrib = $destination . '/contrib';
+    if (is_dir($contrib)) {
+      $destination = $contrib;
+    }
   }
   if ($create) {
     drush_log(dt('Attempting to create destination directory at !dir', array('!dir' => $destination)));
@@ -306,7 +307,7 @@ function _pm_download_destination($type) {
   $drupal_root = drush_get_context('DRUSH_DRUPAL_ROOT');
   $site_root = drush_get_context('DRUSH_DRUPAL_SITE_ROOT', FALSE);
   $full_site_root = $drupal_root .'/'. $site_root;
-  $sites_all = $drupal_root . '/sites/all';
+  $sitewide = drush_drupal_sitewide_directory();
 
   $in_site_directory = FALSE;
   // Check if we are running within the site directory.
@@ -322,24 +323,23 @@ function _pm_download_destination($type) {
       $create_dir = drush_get_option('use-site-dir', FALSE);
       $destination = _pm_download_destination_lookup($type, $drupal_root, $full_site_root, $create_dir);
     }
-    // Attempt 2: If the destination directory already exists for sites/all,
-    // then we use that.
+    // Attempt 2: If the destination directory already exists for
+    // the sitewide directory, use that.
     if (empty($destination) && $drupal_root) {
-      $destination = _pm_download_destination_lookup($type, $drupal_root, $sites_all);
+      $destination = _pm_download_destination_lookup($type, $drupal_root, $sitewide);
     }
     // Attempt 3: If a specific (non default) site directory exists and
-    // sites/all does not exist, then we create destination in the site
-    // specific directory.
-    if (empty($destination) && $site_root && $site_root !== 'sites/default' && is_dir($full_site_root) && !is_dir($sites_all)) {
+    // the sitewide directory does not exist, then create destination
+    // in the site specific directory.
+    if (empty($destination) && $site_root && $site_root !== 'sites/default' && is_dir($full_site_root) && !is_dir($sitewide)) {
       $destination = _pm_download_destination_lookup($type, $drupal_root, $full_site_root, TRUE);
     }
-    // Attempt 4: If sites/all exists, then we create destination in the
-    // sites/all directory.
-    if (empty($destination) && is_dir($sites_all)) {
-      $destination = _pm_download_destination_lookup($type, $drupal_root, $sites_all, TRUE);
+    // Attempt 4: If sitewide directory exists, then create destination there.
+    if (empty($destination) && is_dir($sitewide)) {
+      $destination = _pm_download_destination_lookup($type, $drupal_root, $sitewide, TRUE);
     }
-    // Attempt 5: If site directory exists (even default), then we create
-    // destination in the this directory.
+    // Attempt 5: If site directory exists (even default), then create
+    // destination in that directory.
     if (empty($destination) && $site_root && is_dir($full_site_root)) {
       $destination = _pm_download_destination_lookup($type, $drupal_root, $full_site_root, TRUE);
     }
diff --git a/commands/pm/pm.drush.inc b/commands/pm/pm.drush.inc
index 2b47e5a..325f1ea 100644
--- a/commands/pm/pm.drush.inc
+++ b/commands/pm/pm.drush.inc
@@ -73,7 +73,7 @@ function pm_drush_help($section) {
 
 If no --destination is provided, then destination depends on the project type:
   - Profiles will be downloaded to profiles/ in your Drupal root.
-  - Modules and themes will be downloaded to the site specific directory (sites/example.com/modules|themes) if available, or to sites/all/modules|themes.
+  - Modules and themes will be downloaded to the site specific directory (sites/example.com/modules|themes) if available, or to the site wide directory otherwise.
   - If you're downloading drupal core or you are not running the command within a bootstrapped drupal site, the default location is the current directory.
   - Drush commands will be relocated to @site_wide_location (if available) or ~/.drush. Relocation is determined once the project is downloaded by examining its content. Note you can provide your own function in a commandfile to determine the relocation of any project.", array('@site_wide_location' => drush_get_context('DRUSH_SITE_WIDE_COMMANDFILES')));
   }
diff --git a/includes/command.inc b/includes/command.inc
index 33d77ed..fefa407 100644
--- a/includes/command.inc
+++ b/includes/command.inc
@@ -1346,18 +1346,29 @@ function _drush_find_commandfiles($phase, $phase_max = FALSE) {
       // TODO: Treat themes like modules and stop unconditionally searching here.
       $searchpath[] = 'sites/all/themes';
       $searchpath[] = conf_path() . '/themes';
+      // In D8, we search top level directories as well.
+      if (drush_drupal_major_version() >=8) {
+        $searchpath[] = 'themes';
+      }
       break;
     case DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION:
-      // See comment above  regarding this if() condition.
+      // See comment above regarding this if() condition.
       if ($phase_max < DRUSH_BOOTSTRAP_DRUPAL_FULL) {
         // You must define your install_profile in settings.php. The DB is not sufficient.
         // Drupal core does not yet do that. See http://drupal.org/node/545452.
         if ($profile = variable_get('install_profile', NULL)) {
-          $searchpath[] = "profiles/$profile/modules";
+          $path = "profiles/$profile/modules";
+          if (file_exists($path)) {
+            $searchpath[] = $path;
+          }
+          elseif (file_exists('sites/all/' . $path)) {
+            $searchpath[] = 'sites/all/' . $path;
+          }
         }
         else {
           // If 'install_profile' is not available, check all profiles.
           $searchpath[] = "profiles";
+          $searchpath[] = "sites/all/profiles";
         }
       }
       break;
diff --git a/includes/environment.inc b/includes/environment.inc
index 648a463..ff4d132 100644
--- a/includes/environment.inc
+++ b/includes/environment.inc
@@ -889,3 +889,14 @@ function drush_theme_get_default() {
 function drush_theme_get_admin() {
   return variable_get('admin_theme', drush_theme_get_default());
 }
+
+/**
+ * Returns the sitewide Drupal directory for extensions.
+ */
+function drush_drupal_sitewide_directory($major_version = NULL) {
+  if (!$major_version) {
+    $major_version = drush_drupal_major_version();
+  }
+  return ($major_version < 8) ? 'sites/all' : '';
+}
+
diff --git a/tests/coreTest.php b/tests/coreTest.php
index 40c7fdf..622694c 100644
--- a/tests/coreTest.php
+++ b/tests/coreTest.php
@@ -87,6 +87,7 @@ drush_invoke("version", $arg);
   function testDrupalDirectory() {
     $this->setUpDrupal(1, TRUE);
     $root = $this->webroot();
+    $sitewide = $this->drupalSitewideDirectory();
     $options = array(
       'root' => $root,
       'uri' => key($this->sites),
@@ -101,7 +102,7 @@ drush_invoke("version", $arg);
 
     $this->drush('drupal-directory', array('devel'), $options);
     $output = $this->getOutput();
-    $this->assertEquals($root . '/sites/all/modules/devel', $output);
+    $this->assertEquals($root . '/' . $sitewide . '/modules/devel', $output);
 
     $this->drush('drupal-directory', array('%files'), $options);
     $output = $this->getOutput();
@@ -109,7 +110,7 @@ drush_invoke("version", $arg);
 
     $this->drush('drupal-directory', array('%modules'), $options);
     $output = $this->getOutput();
-    $this->assertEquals($root . '/sites/all/modules', $output);
+    $this->assertEquals($root .  '/' . $sitewide . '/modules', $output);
   }
 
   function testCoreRequirements() {
diff --git a/tests/drush_testcase.inc b/tests/drush_testcase.inc
index 10f8c9c..980086b 100644
--- a/tests/drush_testcase.inc
+++ b/tests/drush_testcase.inc
@@ -300,6 +300,16 @@ abstract class Drush_TestCase extends PHPUnit_Framework_TestCase {
       touch("$site/settings.php");
     }
   }
+
+  /**
+   * @see drush_drupal_sitewide_directory()
+   */
+  function drupalSitewideDirectory($major_version = NULL) {
+    if (!$major_version) {
+      $major_version = drush_drupal_major_version();
+    }
+    return ($major_version < 8) ? 'sites/all' : '';
+  }
 }
 
 abstract class Drush_CommandTestCase extends Drush_TestCase {
diff --git a/tests/pmDownloadTest.php b/tests/pmDownloadTest.php
index 4be7067..c0a756a 100644
--- a/tests/pmDownloadTest.php
+++ b/tests/pmDownloadTest.php
@@ -25,13 +25,13 @@ class pmDownloadCase extends Drush_CommandTestCase {
       'invoke' => NULL, // Invoke from script: do not verify options
     );
 
-    // Default to sites/all.
+    // Default to Drupal sitewide directory.
     $options = array(
       'root' => $root,
       'uri' => $uri,
     ) + $devel_options;
     $this->drush('pm-download', array('devel'), $options);
-    $this->assertFileExists($root . '/sites/all/modules/devel/README.txt');
+    $this->assertFileExists($root . '/' . $this->drupalSitewideDirectory() . '/modules/devel/README.txt');
 
     //  --use-site-dir
     // Expand above $options.
