diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index d0f2320..2dd7373 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -1,8 +1,6 @@
 <?php
 
-define('MAKE_UPDATE_DEFAULT_URL', 'http://updates.drupal.org/release-history');
 define('MAKE_DEFAULT_L10N_SERVER', 'http://localize.drupal.org/l10n_server.xml');
-define('MAKE_VERSION_BEST', 'best');
 define('MAKE_API', 2);
 
 include_once 'make.utilities.inc';
@@ -10,14 +8,6 @@ include_once 'make.download.inc';
 include_once 'make.project.inc';
 
 /**
- * Implement EXTENSION_drush_init().
- */
-function make_drush_init() {
-  // The default URL to use for retrieving update XML files.
-  drush_set_default('make-update-default-url', MAKE_UPDATE_DEFAULT_URL);
-}
-
-/**
  * Implementation of hook_drush_command().
  */
 function make_drush_command() {
@@ -160,6 +150,9 @@ function drush_make_post_make($makefile = NULL, $build_path = NULL) {
 }
 
 function make_projects($recursion, $contrib_destination, $info, $build_path) {
+  $release_info = drush_get_option('release-info', 'updatexml');
+  drush_include_engine('release_info', $release_info);
+
   $projects = array();
   if (empty($info['projects'])) {
     if (drush_get_option('no-core') || $recursion) {
@@ -182,14 +175,30 @@ function make_projects($recursion, $contrib_destination, $info, $build_path) {
       'core'                => $info['core'],
       'build_path'          => $build_path,
       'contrib_destination' => $contrib_destination,
-      'version'             => MAKE_VERSION_BEST,
-      'location'            => drush_get_option('make-update-default-url'),
+      'version'             => '',
+      'location'            => RELEASE_INFO_DEFAULT_URL,
       'subdir'              => '',
       'directory_name'      => '',
     );
-    if ($project['location'] != MAKE_UPDATE_DEFAULT_URL && !isset($project['type'])) {
-      $project = make_updatexml($project);
-      $project['download_type'] = ($project['type'] == 'core' ? 'core' : 'contrib');
+    if (!isset($project['l10n_url']) && ($project['location'] == RELEASE_INFO_DEFAULT_URL)) {
+      $project['l10n_url'] = MAKE_DEFAULT_L10N_SERVER;
+    }
+
+    // For convenience: define $request to be compatible with release_info engine.
+    // TODO: refactor to enforce 'make' to internally work with release_info keys.
+    $request = array(
+      'name' => $project['name'],
+      'drupal_version' => $project['core'],
+      'status url' => $project['location'],
+    );
+    if ($project['version'] != '') {
+      $request['project_version'] = $project['version'];
+      $request['version'] = $project['core'] . '-' . $project['version'];
+    }
+
+    if ($project['location'] != RELEASE_INFO_DEFAULT_URL && !isset($project['type'])) {
+      $project_type = release_info_check_project($request, 'core');
+      $project['download_type'] = ($project_type ? 'core' : 'contrib');
     }
     elseif (!empty($project['type'])) {
       $project['download_type'] = ($project['type'] == 'core' ? 'core' : 'contrib');
@@ -219,9 +228,25 @@ function make_projects($recursion, $contrib_destination, $info, $build_path) {
 
   foreach ($projects as $type => $type_projects) {
     foreach ($type_projects as $project) {
-      if ($project['location'] == MAKE_UPDATE_DEFAULT_URL && (!isset($project['type']) || !isset($project['download']))) {
-        $project = make_updatexml($project);
+      // For convenience: define $request to be compatible with release_info engine.
+      // TODO: refactor to enforce 'make' to internally work with release_info keys.
+      $request = array(
+        'name' => $project['name'],
+        'drupal_version' => $project['core'],
+        'status url' => $project['location'],
+      );
+      if ($project['version'] != '') {
+        $request['project_version'] = $project['version'];
+        $request['version'] = $project['core'] . '-' . $project['version'];
       }
+      $release = release_info_fetch($request);
+      // Translate release_info key for project_type to drush make.
+      $project['type'] = $request['project_type'];
+      $project['download'] =array(
+        'type' => 'get',
+        'url'  => $release['download_link'],
+        'md5'  => $release['mdhash'],
+      );
       if (!empty($md5)) {
         $project['download']['md5'] = $md5;
       }
@@ -278,126 +303,6 @@ function make_libraries($contrib_destination, $info, $build_path) {
   }
 }
 
-function make_updatexml($project) {
-  if (isset($project['download']) && isset($project['type'])) {
-    return $project;
-  }
-  if ($filename = _make_download_file($project['location'] . '/' . $project['name'] . '/' . $project['core'])) {
-    $release_history = simplexml_load_string(file_get_contents($filename));
-    drush_op('unlink', $filename);
-  }
-  // First, get the release history.
-  if (!is_object($release_history) || !$release_history->title) {
-    make_error('XML_ERROR', dt("Could not retrieve version information for %project.", array('%project' => $project['name'])));
-    return FALSE;
-  }
-  drush_log(dt('Project information for %project retrieved.', array('%project' => $project['name'])), 'ok');
-  $project['release_history'] = $release_history;
-  if (!isset($project['type'])) {
-    // Determine the project type.
-    $term_map = array(
-      'Modules' => 'module',
-      'Themes' => 'theme',
-      'Drupal core' => 'core',
-      'Installation profiles' => 'profile',
-      'Translations' => 'translation'
-    );
-    // Iterate through all terms related to this project.
-    foreach ($release_history->terms->term as $term) {
-      // If we find a term from the term map, add it.
-      if (in_array((string) $term->value, array_keys($term_map))) {
-        $project['type'] = $term_map[(string)$term->value];
-        break;
-      }
-    }
-    if (!isset($project['type'])) {
-      make_error('BUILD_ERROR', dt("Unable to determine project type for %project.", array('%project' => $project['name'])));
-      return FALSE;
-    }
-  }
-  if (!isset($project['download'])) {
-    $project = make_update_xml_download($project);
-  }
-  return $project;
-}
-
-function make_update_xml_download($project) {
-  // Make an array of releases.
-  foreach ($project['release_history']->releases->release as $release) {
-    $version = (string) $release->version_major;
-    // there should be version_patch attribute for every stable release
-    // so checking whether the attribute exists should be enough
-    if (isset($release->version_patch) && ((string) $release->version_extra) != 'dev') {
-      $version .= '.' . (string) $release->version_patch;
-    }
-    // if version_patch attribute does not exist, then it should be a dev release
-    // and the version string should be in format MAJOR_VERSION.x-dev
-    else {
-      $version .= '.x';
-    }
-
-    if ($extra_version = (string) $release->version_extra) {
-      $version .= '-' . $extra_version;
-    }
-
-    $releases[$version] = array(
-      'file' => (string) $release->download_link,
-      'md5' => (string) $release->mdhash,
-      'version' => (string) $release->version,
-    );
-    foreach (array('major', 'patch', 'extra') as $part) {
-      $releases[$version][$part] = (string) $release->{'version_' . $part};
-    }
-    if ($releases[$version]['extra'] == 'dev') {
-      $releases[$version]['patch'] = 'x';
-    }
-  }
-
-  // Find the best release.
-  if ($project['version'] == MAKE_VERSION_BEST) {
-    $recommended_major = (string)$project['release_history']->recommended_major;
-    if (!$recommended_major && $project['type'] == 'core') {
-      $recommended_major = strtok($project['core'], '.');
-    }
-    $project['version'] = _make_update_xml_best_version($recommended_major, $releases);
-  }
-  // Find the best release for the specified version.
-  else {
-    $exploded_version = explode('.', $project['version']);
-    if (count($exploded_version) == 1) {
-      list($major) = $exploded_version;
-      $project['version'] = _make_update_xml_best_version($major, $releases);
-    }
-    // Otherwise we have a full version.
-  }
-
-  $final_version = empty($project['version']) ? '' : $project['version'];
-
-  // Uh oh, couldn't find a valid version.
-  if (empty($final_version) || empty($releases[$final_version])) {
-    make_error('BUILD_ERROR', dt("Invalid version %version for %project.", array('%version' => $final_version, '%project' => $project['name'])));
-    return FALSE;
-  }
-
-  $release = $releases[$final_version];
-  $project['download'] = array(
-    'type' => 'get',
-    'url'  => $release['file'],
-    'md5'  => $release['md5'],
-  );
-  return $project;
-}
-
-function _make_update_xml_best_version($major, $releases) {
-  $best = NULL;
-  foreach ($releases as $version => $release_info) {
-    if ((!$major || $release_info['major'] == $major) && !empty($release_info['file']) && version_compare($best, $version, '<')) {
-      $best = $version;
-    }
-  }
-  return $best;
-}
-
 function make_build_path($build_path) {
   static $saved_path;
   if (isset($saved_path)) {
diff --git a/commands/make/make.generate.inc b/commands/make/make.generate.inc
index 2cc9318..d3e6737 100644
--- a/commands/make/make.generate.inc
+++ b/commands/make/make.generate.inc
@@ -10,6 +10,9 @@ function _drush_make_generate($file = NULL) {
   if (!$file) {
     drush_die('Missing filename');
   }
+  $release_info = drush_get_option('release-info', 'updatexml');
+  drush_include_engine('release_info', $release_info);
+
   // What projects should we pin the versions for?
   // Check the command-line options for details
   foreach(array("include", "exclude") as $option) {
@@ -40,7 +43,11 @@ function _drush_make_generate($file = NULL) {
   if (!in_array($install_profile, array('default', 'standard', 'minimal')) && $install_profile != '') {
     $projects[$install_profile]['type'] =
     $projects[$install_profile]['_type'] = 'profile';
-    if (!_drush_generate_makefile_check_updatexml($install_profile, 'profile')) {
+    $request = array(
+      'name' => $install_profile,
+      'drupal_version' => $system_requirements['drupal']['value'],
+    );
+    if (!release_info_check_project($request, 'profile')) {
       $projects[$install_profile]['custom_download'] = TRUE;
     }
   }
@@ -63,19 +70,21 @@ function _drush_make_generate($file = NULL) {
     if (($type == 'module') && (!$project['status'])) {
       continue;
     }
-    // Check the project is on drupal.org or its own update service.
-    $status_url = isset($project['status url'])?$project['status url']:'';
-    $updatexml = _drush_generate_makefile_check_updatexml($name, $type, $status_url);
     $projects[$name] = array('_type' => $type);
-    if (!$updatexml) {
+    // Check the project is on drupal.org or its own update service.
+    $request = array(
+      'name' => $name,
+      'drupal_version' => $system_requirements['drupal']['value'],
+    );
+    if (isset($project['status url'])) {
+      $request['status url'] = $project['status url'];
+      $projects[$name]['location'] = $status_url;
+    }
+    if (!release_info_check_project($request, $type)) {
       // It is not a project on drupal.org neither an external update service.
       $projects[$name]['type'] = $type;
       $projects[$name]['custom_download'] = TRUE;
     }
-    elseif ($status_url != '') {
-      // Project is hosted in an external update service. Ex: a features server.
-      $projects[$name]['location'] = $status_url;
-    }
     // Add 'subdir' if the project is installed in a non-default location.
     $projects[$name] += _drush_generate_makefile_check_path($project);
     // Add version number if this project's version is to be tracked.
@@ -146,33 +155,6 @@ function _drush_generate_track_version($project, $version_options) {
 }
 
 /**
- * Check if a project is available in a update service.
- *
- * Default update service is obviously updates.drupal.org. We can receive here
- * an alternative url corresponding to the 'project status url' property in
- * project's .info file.
- *
- * It also checks for consistency by comparing given project type with to the
- * type obtained from the update service.
- */
-function _drush_generate_makefile_check_updatexml($name, $type, $status_url = '') {
-  if ($status_url == '') {
-    $status_url = drush_get_option('drush-make-update-default-url');
-  }
-  // First we set up the project information array.
-  $project = array(
-    'name' => $name,
-    'location' => $status_url,
-    'core' => DRUPAL_CORE_COMPATIBILITY,
-    'version' => DRUSH_MAKE_VERSION_BEST,
-  );
-
-  // Now we get the project information.
-  $update_check = drush_make_updatexml($project);
-  return $update_check !== FALSE && $type == $update_check['type'];
-}
-
-/**
  * Helper function to check for a non-default installation location.
  */
 function _drush_generate_makefile_check_path($project) {
diff --git a/commands/make/make.project.inc b/commands/make/make.project.inc
index 7a22521..fb82607 100644
--- a/commands/make/make.project.inc
+++ b/commands/make/make.project.inc
@@ -190,9 +190,6 @@ class DrushMakeProject {
         if (isset($this->l10n_url)) {
           $l10n_server = $this->l10n_url;
         }
-        elseif ($this->location === drush_get_option('make-update-default-url')) {
-          $l10n_server = MAKE_DEFAULT_L10N_SERVER;
-        }
         else {
           $l10n_server = FALSE;
         }
diff --git a/commands/pm/pm.drush.inc b/commands/pm/pm.drush.inc
index ba959a8..ecbb056 100644
--- a/commands/pm/pm.drush.inc
+++ b/commands/pm/pm.drush.inc
@@ -655,8 +655,8 @@ function drush_pm_find_project_from_extension($extension) {
     // as the requested extension, then we'll call that a match.
     $release_info = drush_get_option('release-info', 'updatexml');
     drush_include_engine('release_info', $release_info);
-    $info = release_info_get_releases(array($extension));
-    if (!empty($info)) {
+    $request = pm_parse_project_version(array($extension));
+    if (release_info_check_project($request, 'module')) {
       $result = $extension;
     }
   }
@@ -1324,19 +1324,6 @@ function pm_parse_project_version($requests) {
   return $requestdata;
 }
 
-function pm_project_types() {
-  // Lookup the 'Project type' vocabulary to some standard strings.
-  $types = array(
-    'core' => 'Drupal core',
-    'profile' => 'Installation profiles',
-    'module' => 'Modules',
-    'theme' => 'Themes',
-    'theme engine' => 'Theme engines',
-    'translation' => 'Translations'
-  );
-  return $types;
-}
-
 /**
  * Used by dl and updatecode commands to determine how to download/checkout new projects and acquire updates to projects.
  */
diff --git a/commands/pm/release_info/updatexml.inc b/commands/pm/release_info/updatexml.inc
index d98a720..41ac8e5 100644
--- a/commands/pm/release_info/updatexml.inc
+++ b/commands/pm/release_info/updatexml.inc
@@ -32,13 +32,7 @@ function release_info_fetch(&$request, $dev = FALSE, $select = FALSE, $all = FAL
     return FALSE;
   }
 
-  // Determine project type.
-  $project_types = pm_project_types();
-  $project_types_xpath = '(value="' . implode('" or value="', $project_types) . '")';
-  $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);
-  }
+  $request['project_type'] = updatexml_determine_project_type($xml);
 
   if (!$select) {
     // Try to identify the most appropriate release.
@@ -88,6 +82,26 @@ function release_info_get_releases($requests) {
 }
 
 /**
+ * Check if a project is available in a update service.
+ *
+ * It also checks for consistency by comparing given project type with to the
+ * type obtained from the update service.
+ */
+function release_info_check_project($request, $type) {
+  $xml = updatexml_get_release_history_xml($request);
+  if (!$xml) {
+    return FALSE;
+  }
+
+  $project_type = updatexml_determine_project_type($xml);
+  if ($project_type != $type) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
  * Prints release notes for given projects.
  *
  * @param $requests
@@ -466,3 +480,26 @@ function updatexml_get_releases_from_xml($xml, $project) {
 
   return $project_info;
 }
+
+/**
+ * Determine a project type from its update service xml.
+ */
+function updatexml_determine_project_type($xml) {
+  $project_types = array(
+    'core' => 'Drupal core',
+    'profile' => 'Installation profiles',
+    'module' => 'Modules',
+    'theme' => 'Themes',
+    'theme engine' => 'Theme engines',
+    'translation' => 'Translations'
+  );
+
+  $project_types_xpath = '(value="' . implode('" or value="', $project_types) . '")';
+  $type = 'module';
+  if ($types = $xml->xpath('/project/terms/term[name="Projects" and ' . $project_types_xpath . ']')) {
+    $type = array_search($types[0]->value, $project_types);
+  }
+  
+  return $type;
+}
+
