diff --git a/commands/core/archive.drush.inc b/commands/core/archive.drush.inc
index 85dd5b6..933681b 100644
--- a/commands/core/archive.drush.inc
+++ b/commands/core/archive.drush.inc
@@ -106,8 +106,7 @@ function drush_archive_dump($sites_subdirs = '@self') {
   $final_destination = drush_get_option('destination');
   if (!$final_destination) {
     // No destination provided.
-    drush_include_engine('version_control', 'backup');
-    $backup = new drush_pm_version_control_backup();
+    $backup = drush_include_engine('version_control', 'backup');
     // TODO: this standard drush pattern leads to a slightly obtuse directory structure.
     $dest_dir = $backup->prepare_backup_dir('archive-dump');
     if (empty($dest_dir)) {
diff --git a/commands/pm/download.pm.inc b/commands/pm/download.pm.inc
index 0a04037..9815ffb 100644
--- a/commands/pm/download.pm.inc
+++ b/commands/pm/download.pm.inc
@@ -73,6 +73,7 @@ function drush_pm_download_validate() {
 function drush_pm_download() {
   $package_handler = drush_get_option('package-handler', 'wget');
   drush_include_engine('package_handler', $package_handler);
+  drush_include_engine('release_info', 'drupalorg');
 
   if (!$requests = pm_parse_arguments(func_get_args(), FALSE)) {
     $requests = array('drupal');
@@ -82,63 +83,12 @@ function drush_pm_download() {
   $requests = pm_parse_project_version($requests);
 
   // Get release history for each request and download the project.
-  $project_types = pm_project_types();
-  $project_types_xpath = '(value="' . implode('" or value="', $project_types) . '")';
   foreach ($requests as $name => $request) {
-    $xml = _drush_pm_get_release_history_xml($request);
-    if (!$xml) {
+    $release = release_info_fetch($request);
+    if ($release == FALSE) {
       continue;
     }
 
-    // Identify the most appropriate release.
-    $release = _pm_download_parse_release($request, $xml);
-    if (!$release) {
-      continue;
-    }
-
-    // Determine what type of project we are to download.
-    $request['project_type'] = 'module';
-    if ($types = $xml->xpath('/project/terms/term[name="Projects" and ' . $project_types_xpath . ']')) {
-      $request['project_type'] = array_search($types[0]->value, $project_types);
-    }
-
-    if ($request['project_type'] == 'translation') {
-      drush_set_error('DRUSH_PM_DOWNLOAD_TRANSLATIONS_FORBIDDEN', dt('Drush has dropped support for downloading translation projects. See l10n_update and l10n_install projects.'));
-      continue;
-    }
-
-    // Determine the name of the directory that will contain the project.
-    // We face here all the asymetries to make it smooth for package handlers.
-    // For Drupal core: --drupal-project-rename or drupal-x.y
-    if ($request['project_type'] == 'core') {
-      // Avoid downloading core into existing core.
-      if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_ROOT) {
-        if (strpos(realpath(drush_get_option('destination')), DRUPAL_ROOT) !== FALSE) {
-          drush_log(dt('It\'s forbidden to download !project core into an existing core.', array('!project' => $request['name'])), 'error');
-          continue;
-        }
-      }
-
-      if ($rename = drush_get_option('drupal-project-rename', FALSE)) {
-        if ($rename === TRUE) {
-          $request['project_dir'] = 'drupal';
-        }
-        else {
-          $request['project_dir'] = $rename;
-        }
-      }
-      else {
-        // Set to drupal-x.y, the expected name for .tar.gz contents.
-        // Explicitly needed for cvs package handler.
-        $request['project_dir'] = strtolower(strtr($release['name'], ' ', '-'));
-      }
-    }
-    // For the other project types we want the project name. Including core
-    // variant for profiles.  Note those come with drupal-x.y in the .tar.gz.
-    else {
-      $request['project_dir'] = $request['name'];
-    }
-
     // Download the project to a temporary location.
     $request['base_project_path'] = drush_tempdir();
     $request['full_project_path'] = $request['base_project_path'] .'/'. $request['project_dir'];
@@ -264,68 +214,6 @@ function _pm_download_releases_choice($xml, $project, $all = FALSE, $dev = FALSE
 }
 
 /**
- * Pick most appropriate release from XML list.
- *
- * @param array $request
- *   An array of version specifications as returned by pm_parse_project_version().
- * @param resource $xml
- *   A handle to the XML document.
- */
-function _pm_download_parse_release($request, $xml) {
-  if (!empty($request['version'])) {
-    $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $request['version'] . "']");
-    if (empty($releases)) {
-      drush_log(dt("Could not locate specified project version, downloading latest stable version"), 'warning');
-    }
-  }
-  // If that did not work, we will get the first published release for the
-  // recommended major version.
-  if (empty($releases)) {
-    if ($recommended_major = $xml->xpath("/project/recommended_major")) {
-      $xpath_releases = "/project/releases/release[status='published'][version_major=" . (string)$recommended_major[0] . "]";
-      $releases = @$xml->xpath($xpath_releases);
-    }
-  }
-  // If there are recommended releases (no 'version_extra' elements), then use
-  // only recommended releases.  Otherwise, use all; in this case, the
-  // recommended release defaults to the latest published release with the
-  // right recommended major version number.
-  $recommended_releases = array();
-  if (!empty($releases)) {
-    foreach ($releases as $one_release) {
-      if (!array_key_exists('version_extra', $one_release)) {
-        $recommended_releases[] = $one_release;
-      }
-    }
-  }
-  if (!empty($recommended_releases)) {
-    $releases = $recommended_releases;
-  }
-  $release_type = 'recommended';
-  if (drush_get_option('dev', FALSE)) {
-    $releases = @$xml->xpath("/project/releases/release[status='published'][version_extra='dev']");
-    $release_type = 'development';
-  }
-  if (drush_get_option('select', FALSE) || empty($releases)) {
-    if (empty($releases)) {
-      drush_print(dt('There is no !type release for project !project.', array('!type' => $release_type, '!project' => $request['name'])));
-    }
-    $options = _pm_download_releases_choice($xml, $request['name'], drush_get_option('all', FALSE), drush_get_option('dev', FALSE));
-    $choice = drush_choice($options, dt('Choose one of the available releases:'));
-    if ($choice) {
-      $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $choice . "']");
-    }
-    else {
-      return FALSE;
-    }
-  }
-
-  // First published release for the recommended major version is just the
-  // first value in $releases.
-  return (array)$releases[0];
-}
-
-/**
  * Implementation of hook_drush_pm_download_destination_alter().
  *
  * Built-in download-destination-alter hook. This particular version of
@@ -370,9 +258,9 @@ function pm_drush_pm_download_destination_alter(&$project, $release) {
           // Change the location if the mkdir worked.
           if (is_dir($install_dir)) {
             $project['project_install_location'] = $install_dir;
-	    // We need to clear the drush commandfile cache so that
-	    // our newly-downloaded drush extension commandfiles can be found.
-	    drush_cache_clear_all();
+            // We need to clear the drush commandfile cache so that
+            // our newly-downloaded drush extension commandfiles can be found.
+            drush_cache_clear_all();
           }
         }
       }
diff --git a/commands/pm/pm.drush.inc b/commands/pm/pm.drush.inc
index 95e87b0..9898f4f 100644
--- a/commands/pm/pm.drush.inc
+++ b/commands/pm/pm.drush.inc
@@ -1309,7 +1309,7 @@ function _drush_pm_get_releases($requests) {
 
   // Get release history for each request.
   foreach ($requests as $name => $request) {
-    $xml = _drush_pm_get_release_history_xml($request);
+    $xml = drupalorg_get_release_history_xml($request);
     if (!$xml) {
       continue;
     }
@@ -1678,6 +1678,16 @@ function pm_drush_engine_package_handler() {
 }
 
 /**
+ * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.
+ */
+function pm_drush_engine_release_info() {
+  return array(
+    'drupalorg' => array(
+    ),
+  );
+}
+
+/**
  * Integration with VCS in order to easily commit your changes to projects.
  */
 function pm_drush_engine_version_control() {
@@ -1787,44 +1797,12 @@ function drush_pm_include_version_control($directory = '.') {
     return drush_set_error('DRUSH_PM_NO_VERSION_CONTROL', dt('No valid version control or backup engine found (the --version-control option was set to "!version-control").', array('!version-control' => $version_control)));
   }
 
-  drush_include_engine('version_control', $version_control);
-  $class = 'drush_pm_version_control_' . $engine;
-  $instance = new $class();
+  $instance = drush_include_engine('version_control', $version_control);
   $instance->engine = $engine;
   return $instance;
 }
 
 /**
- * Download the release history xml for the specified request.
- */
-function _drush_pm_get_release_history_xml($request) {
-  // Don't rely on UPDATE_DEFAULT_URL since perhaps we are not fully
-  // bootstrapped.
-  $url = drush_get_option('source', 'http://updates.drupal.org/release-history') . '/' . $request['name'] . '/' . $request['drupal_version'];
-  drush_log('Downloading release history from ' . $url);
-  // Some hosts have allow_url_fopen disabled.
-  if ($path = drush_download_file($url, drush_tempnam($request['name']), drush_get_option('cache-duration-releasexml', 24*3600))) {
-    $xml = simplexml_load_file($path);
-  }
-  if (!$xml) {
-    // We are not getting here since drupal.org always serves an XML response.
-    return drush_set_error('DRUSH_PM_DOWNLOAD_FAILED', dt('Could not download project status information from !url', array('!url' => $url)));
-  }
-  if ($error = $xml->xpath('/error')) {
-    // Don't set an error here since it stops processing during site-upgrade.
-    drush_log($error[0], 'warning'); // 'DRUSH_PM_COULD_NOT_LOAD_UPDATE_FILE',
-    return FALSE;
-  }
-  // Unpublished project?
-  $project_status = $xml->xpath('/project/project_status');
-  if ($project_status[0][0] == 'unpublished') {
-    return drush_set_error('DRUSH_PM_PROJECT_UNPUBLISHED', dt("Project !project is unpublished and has no releases available.", array('!project' => $request['name'])), 'warning');
-  }
-
-  return $xml;
-}
-
-/**
  * Update the locked status of all of the candidate projects
  * to be updated.
  *
diff --git a/commands/pm/release_info/drupalorg.inc b/commands/pm/release_info/drupalorg.inc
new file mode 100644
index 0000000..a3bd03b
--- /dev/null
+++ b/commands/pm/release_info/drupalorg.inc
@@ -0,0 +1,154 @@
+<?php
+
+/**
+ * @file Drush release info engine for update.drupal.org
+ */
+
+function release_info_fetch(&$request) {
+  $project_types = pm_project_types();
+  $project_types_xpath = '(value="' . implode('" or value="', $project_types) . '")';
+  $xml = drupalorg_get_release_history_xml($request);
+  if (!$xml) {
+    return FALSE;
+  }
+
+  // Identify the most appropriate release.
+  $release = drupalorg_parse_release($request, $xml);
+  if (!$release) {
+    return FALSE;
+  }
+
+  // Determine what type of project we are to download.
+  $request['project_type'] = 'module';
+  if ($types = $xml->xpath('/project/terms/term[name="Projects" and ' . $project_types_xpath . ']')) {
+    $request['project_type'] = array_search($types[0]->value, $project_types);
+  }
+
+  if ($request['project_type'] == 'translation') {
+    return drush_set_error('DRUSH_PM_DOWNLOAD_TRANSLATIONS_FORBIDDEN', dt('Drush has dropped support for downloading translation projects. See l10n_update and l10n_install projects.'));
+  }
+
+  // Determine the name of the directory that will contain the project.
+  // We face here all the asymetries to make it smooth for package handlers.
+  // For Drupal core: --drupal-project-rename or drupal-x.y
+  if ($request['project_type'] == 'core') {
+    // Avoid downloading core into existing core.
+    if (drush_get_context('DRUSH_BOOTSTRAP_PHASE') >= DRUSH_BOOTSTRAP_DRUPAL_ROOT) {
+      if (strpos(realpath(drush_get_option('destination')), DRUPAL_ROOT) !== FALSE) {
+        return drush_set_error('DRUSH_PM_DOWNLOAD_TRANSLATIONS_FORBIDDEN', dt('It\'s forbidden to download !project core into an existing core.', array('!project' => $request['name'])));
+      }
+    }
+
+    if ($rename = drush_get_option('drupal-project-rename', FALSE)) {
+      if ($rename === TRUE) {
+        $request['project_dir'] = 'drupal';
+      }
+      else {
+        $request['project_dir'] = $rename;
+      }
+    }
+    else {
+      // Set to drupal-x.y, the expected name for .tar.gz contents.
+      // Explicitly needed for cvs package handler.
+      $request['project_dir'] = strtolower(strtr($release['name'], ' ', '-'));
+    }
+  }
+    // For the other project types we want the project name. Including core
+    // variant for profiles.  Note those come with drupal-x.y in the .tar.gz.
+  else {
+    $request['project_dir'] = $request['name'];
+  }
+  return $release;
+}
+
+/**
+ * Pick most appropriate release from XML list.
+ *
+ * @param array $request
+ *   An array of version specifications as returned by pm_parse_project_version().
+ * @param resource $xml
+ *   A handle to the XML document.
+ */
+function drupalorg_parse_release($request, $xml) {
+  if (!empty($request['version'])) {
+    $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $request['version'] . "']");
+    if (empty($releases)) {
+      drush_log(dt("Could not locate specified project version, downloading latest stable version"), 'warning');
+    }
+  }
+  // If that did not work, we will get the first published release for the
+  // recommended major version.
+  if (empty($releases)) {
+    if ($recommended_major = $xml->xpath("/project/recommended_major")) {
+      $xpath_releases = "/project/releases/release[status='published'][version_major=" . (string)$recommended_major[0] . "]";
+      $releases = @$xml->xpath($xpath_releases);
+    }
+  }
+  // If there are recommended releases (no 'version_extra' elements), then use
+  // only recommended releases.  Otherwise, use all; in this case, the
+  // recommended release defaults to the latest published release with the
+  // right recommended major version number.
+  $recommended_releases = array();
+  if (!empty($releases)) {
+    foreach ($releases as $one_release) {
+      if (!array_key_exists('version_extra', $one_release)) {
+        $recommended_releases[] = $one_release;
+      }
+    }
+  }
+  if (!empty($recommended_releases)) {
+    $releases = $recommended_releases;
+  }
+  $release_type = 'recommended';
+  if (drush_get_option('dev', FALSE)) {
+    $releases = @$xml->xpath("/project/releases/release[status='published'][version_extra='dev']");
+    $release_type = 'development';
+  }
+  if (drush_get_option('select', FALSE) || empty($releases)) {
+    if (empty($releases)) {
+      drush_print(dt('There is no !type release for project !project.', array('!type' => $release_type, '!project' => $request['name'])));
+    }
+    $options = _pm_download_releases_choice($xml, $request['name'], drush_get_option('all', FALSE), drush_get_option('dev', FALSE));
+    $choice = drush_choice($options, dt('Choose one of the available releases:'));
+    if ($choice) {
+      $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $choice . "']");
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  // First published release for the recommended major version is just the
+  // first value in $releases.
+  return (array)$releases[0];
+}
+
+/**
+ * Download the release history xml for the specified request.
+ */
+function drupalorg_get_release_history_xml($request) {
+  // Don't rely on UPDATE_DEFAULT_URL since perhaps we are not fully
+  // bootstrapped.
+  $url = drush_get_option('source', 'http://updates.drupal.org/release-history') . '/' . $request['name'] . '/' . $request['drupal_version'];
+  drush_log('Downloading release history from ' . $url);
+  // Some hosts have allow_url_fopen disabled.
+  if ($path = drush_download_file($url, drush_tempnam($request['name']), drush_get_option('cache-duration-releasexml', 24*3600))) {
+    $xml = simplexml_load_file($path);
+  }
+  if (!$xml) {
+    // We are not getting here since drupal.org always serves an XML response.
+    return drush_set_error('DRUSH_PM_DOWNLOAD_FAILED', dt('Could not download project status information from !url', array('!url' => $url)));
+  }
+  if ($error = $xml->xpath('/error')) {
+    // Don't set an error here since it stops processing during site-upgrade.
+    drush_log($error[0], 'warning'); // 'DRUSH_PM_COULD_NOT_LOAD_UPDATE_FILE',
+    return FALSE;
+  }
+  // Unpublished project?
+  $project_status = $xml->xpath('/project/project_status');
+  if ($project_status[0][0] == 'unpublished') {
+    return drush_set_error('DRUSH_PM_PROJECT_UNPUBLISHED', dt("Project !project is unpublished and has no releases available.", array('!project' => $request['name'])), 'warning');
+  }
+
+  return $xml;
+}
diff --git a/commands/pm/version_control/backup.inc b/commands/pm/version_control/backup.inc
index 1bcf4a5..79ed225 100644
--- a/commands/pm/version_control/backup.inc
+++ b/commands/pm/version_control/backup.inc
@@ -4,7 +4,7 @@
  * @file Drush pm directory copy backup extension
  */
 
-class drush_pm_version_control_backup implements drush_pm_version_control {
+class drush_version_control_backup implements drush_pm_version_control {
 
   /**
    * Implementation of pre_update().
diff --git a/commands/pm/version_control/bzr.inc b/commands/pm/version_control/bzr.inc
index 35c184e..4b30a87 100644
--- a/commands/pm/version_control/bzr.inc
+++ b/commands/pm/version_control/bzr.inc
@@ -4,7 +4,7 @@
  * @file Drush pm Bazaar extension
  */
 
-class drush_pm_version_control_bzr implements drush_pm_version_control {
+class drush_version_control_bzr implements drush_pm_version_control {
 
   /**
    * Implementation of pre_update().
diff --git a/commands/pm/version_control/svn.inc b/commands/pm/version_control/svn.inc
index 50795b7..6b61cb4 100644
--- a/commands/pm/version_control/svn.inc
+++ b/commands/pm/version_control/svn.inc
@@ -4,7 +4,7 @@
  * @file Drush pm SVN extension
  */
 
-class drush_pm_version_control_svn implements drush_pm_version_control {
+class drush_version_control_svn implements drush_pm_version_control {
 
   /**
    * Implementation of pre_update().
diff --git a/commands/sql/sql.drush.inc b/commands/sql/sql.drush.inc
index 6248b41..150dfbd 100644
--- a/commands/sql/sql.drush.inc
+++ b/commands/sql/sql.drush.inc
@@ -314,8 +314,7 @@ function drush_sql_build_dump_command($table_selection, $db_spec = NULL, $file =
   if ($file) {
     if ($file === TRUE) {
       // User did not pass a specific value for --result-file. Make one.
-      drush_include_engine('version_control', 'backup');
-      $backup = new drush_pm_version_control_backup();
+      $backup = drush_include_engine('version_control', 'backup');
       $backup_dir = $backup->prepare_backup_dir($db_spec['database']);
       if (empty($backup_dir)) {
         $backup_dir = "/tmp";
diff --git a/includes/drush.inc b/includes/drush.inc
index d70df32..59a92ee 100644
--- a/includes/drush.inc
+++ b/includes/drush.inc
@@ -155,6 +155,10 @@ function drush_include_engine($type, $engine, $version = NULL, $path = NULL) {
     return drush_set_error('DRUSH_ENGINE INCLUDE_NO_PATH', dt('No path was set for including the !type engine !engine.', array('!type' => $type, '!engine' => $engine)));
   }
   if (drush_include($path, $engine, $version)) {
+    $class = 'drush_' . $type . '_' . $engine;
+    if (class_exists($class)) {
+      return new $class();
+    }
     return TRUE;
   }
   return drush_set_error('DRUSH_ENGINE INCLUDE_FAILED', dt('Unable to include the !type engine !engine from !path.' , array('!path' => $path, '!type' => $type, '!engine' => $engine)));
@@ -1601,11 +1605,7 @@ function drush_version_control_reserved_files() {
     $files = array('.git', '.gitignore', '.hg', '.hgignore', '.hgrags');
     $vcs = array_keys(drush_get_engines('version_control'));
     foreach ($vcs as $name) {
-      drush_include_engine('version_control', $name);
-      $class = 'drush_pm_version_control_' . $name;
-      // For php < 5.3 we can't access a static method by referencing the class
-      // using a variable.
-      $version_control = new $class();
+      $version_control = drush_include_engine('version_control', $name);
       $files = array_merge($files, $version_control->reserved_files());
     }
   }
diff --git a/tests/pmTest.inc b/tests/pmTest.inc
index 95b4468..208e3da 100644
--- a/tests/pmTest.inc
+++ b/tests/pmTest.inc
@@ -36,7 +36,7 @@ class pmCase extends Drush_UnitTestCase {
     );
 
     // Pick specific release.
-    $release = _pm_download_parse_release($request_data, $xml);
+    $release = drupalorg_parse_release($request_data, $xml);
     $this->assertEquals($release['version'], '6.x-1.18');
 
     // Pick latest recommended+published with no further specification.
@@ -46,7 +46,7 @@ class pmCase extends Drush_UnitTestCase {
       'name' => 'devel',
       'drupal_version' => '6.x',
     );
-    $release = _pm_download_parse_release($request_data, $xml);
+    $release = drupalorg_parse_release($request_data, $xml);
     $this->assertEquals($release['version'], '6.x-2.1');
   }
 }
\ No newline at end of file
