diff --git a/commands/pm/download.pm.inc b/commands/pm/download.pm.inc
index 6a8f369..7ad06eb 100644
--- a/commands/pm/download.pm.inc
+++ b/commands/pm/download.pm.inc
@@ -83,12 +83,12 @@ function drush_pm_download() {
 
   // Get release history for each request and download the project.
   $source = drush_get_option('source', RELEASE_INFO_DEFAULT_URL);
-  $dev = drush_get_option('dev', FALSE);
+  $restrict_to = drush_get_option('dev', FALSE) ? 'dev' : '';
   $select = drush_get_option('select', 'auto');
   $all = drush_get_option('all', FALSE);
   foreach ($requests as $name => $request) {
     $request['status url'] = $source;
-    $release = release_info_fetch($request, $dev, $select, $all);
+    $release = release_info_fetch($request, $restrict_to, $select, $all);
     if ($release == FALSE) {
       continue;
     }
diff --git a/commands/pm/release_info/updatexml.inc b/commands/pm/release_info/updatexml.inc
index 94e54a8..362a960 100644
--- a/commands/pm/release_info/updatexml.inc
+++ b/commands/pm/release_info/updatexml.inc
@@ -16,8 +16,12 @@ define('RELEASE_INFO_DEFAULT_URL', 'http://updates.drupal.org/release-history');
  * @param Array &$request
  *   A project request as returned by pm_parse_project_version(). The array will
  *   be expanded with the project type.
- * @param Boolean $dev
- *   Forces to choose a -dev release.
+ * @param String $restrict_to
+ *   One of:
+ *     'dev': Forces choosing a -dev release.
+ *     'version': Forces choosing a point release.
+ *     '': No restriction.
+ *   Default is ''.
  * @param String $select
  *   Strategy for selecting a release, should be one of:
  *    - auto: Try to select the latest release, if none found allow the user
@@ -32,7 +36,7 @@ define('RELEASE_INFO_DEFAULT_URL', 'http://updates.drupal.org/release-history');
  * @return
  *  The selected release xml object.
  */
-function release_info_fetch(&$request, $dev = FALSE, $select = 'never', $all = FALSE) {
+function release_info_fetch(&$request, $restrict_to = '', $select = 'never', $all = FALSE) {
   if (!in_array($select, array('auto', 'never', 'always'))) {
     drush_log(dt("Error: select strategy must be one of: auto, never, always", array(), 'error'));
     return FALSE;
@@ -47,7 +51,7 @@ function release_info_fetch(&$request, $dev = FALSE, $select = 'never', $all = F
 
   if ($select != 'always') {
     // Try to identify the most appropriate release.
-    $release = updatexml_parse_release($request, $xml, $dev);
+    $release = updatexml_parse_release($request, $xml, $restrict_to);
     if ($release) {
       return $release;
     }
@@ -59,7 +63,7 @@ function release_info_fetch(&$request, $dev = FALSE, $select = 'never', $all = F
   }
 
   $project_info = updatexml_get_releases_from_xml($xml, $request['name']);
-  $releases = release_info_filter_releases($project_info['releases'], $all, $dev);
+  $releases = release_info_filter_releases($project_info['releases'], $all, $restrict_to);
   $options = array();
   foreach($releases as $version => $release) {
     $options[$version] = array($version, '-', gmdate('Y-M-d', $release['date']), '-', implode(', ', $release['release_status']));
@@ -259,13 +263,13 @@ function _release_info_compare_date($a, $b) {
  * @param $all
  *   Show all releases. If FALSE, shows only the first release that is
  *   Recommended or Supported or Security or Installed.
- * @param $dev
- *   Show only development release.
+ * @param String $restrict_to
+ *   If set to 'dev', show only development release.
  * @param $show_all_until_installed
  *   If TRUE, then all releases will be shown until the INSTALLED release
  *   is found, at which point the algorithm will stop.
  */
-function release_info_filter_releases($releases, $all = FALSE, $dev = FALSE, $show_all_until_installed = TRUE) {
+function release_info_filter_releases($releases, $all = FALSE, $restrict_to = '', $show_all_until_installed = TRUE) {
   // Start off by sorting releases by release date.
   uasort($releases, '_release_info_compare_date');
   // Find version_major for the installed release.
@@ -278,6 +282,7 @@ function release_info_filter_releases($releases, $all = FALSE, $dev = FALSE, $sh
   // Now iterate through and filter out the releases we're interested in.
   $options = array();
   $limits_list = array();
+  $dev = $restrict_to == 'dev';
   foreach ($releases as $version => $release_info) {
     if (!$dev || ((array_key_exists('version_extra', $release_info)) && ($release_info['version_extra'] == 'dev'))) {
       $saw_unique_status = FALSE;
@@ -316,7 +321,7 @@ function release_info_filter_releases($releases, $all = FALSE, $dev = FALSE, $sh
   // releases found.  If this is the case, then we will force ALL to TRUE
   // and show everything on the second iteration.
   if (($all === FALSE) && ($show_all_until_installed === TRUE)) {
-    $options = release_info_filter_releases($releases, empty($options), $dev, FALSE);
+    $options = release_info_filter_releases($releases, empty($options), $restrict_to, FALSE);
   }
   return $options;
 }
@@ -328,8 +333,15 @@ function release_info_filter_releases($releases, $all = FALSE, $dev = FALSE, $sh
  *   An array of version specifications as returned by pm_parse_project_version().
  * @param resource $xml
  *   A handle to the XML document.
+ * @param String $restrict_to
+ *   One of:
+ *     'dev': Forces a -dev release.
+ *     'version': Forces a point release.
+ *     '': No restriction (auto-selects latest recommended release if requested
+ *         release is not found).
+ *   Default is ''.
  */
-function updatexml_parse_release($request, $xml, $dev = FALSE) {
+function updatexml_parse_release($request, $xml, $restrict_to = '') {
   if (!empty($request['version'])) {
     $matches = array();
     // See if we only have a branch version.
@@ -346,7 +358,13 @@ function updatexml_parse_release($request, $xml, $dev = FALSE) {
       }
       $releases = $xml->xpath("/project/releases/release[status='published'][version='" . $request['version'] . "']");
       if (empty($releases)) {
-        drush_log(dt("Could not locate @project version @version, downloading latest stable version", array('@project' => $request['name'], '@version' => $request['version'])), 'warning');
+        if (empty($restrict_to)) {
+          drush_log(dt("Could not locate @project version @version, downloading latest stable version", array('@project' => $request['name'], '@version' => $request['version'])), 'warning');
+        }
+        else {
+          drush_log(dt("Could not locate @project version @version", array('@project' => $request['name'], '@version' => $request['version'])), 'warning');
+          return FALSE;
+        }
       }
     }
   }
@@ -374,7 +392,7 @@ function updatexml_parse_release($request, $xml, $dev = FALSE) {
     $releases = $recommended_releases;
   }
   $release_type = 'recommended';
-  if ($dev) {
+  if ($restrict_to == 'dev') {
     $releases = @$xml->xpath("/project/releases/release[status='published'][version_extra='dev']");
     $release_type = 'development';
   }
