diff --git a/commands/pm/info.pm.inc b/commands/pm/info.pm.inc
index 5efbd71..f68cfe7 100644
--- a/commands/pm/info.pm.inc
+++ b/commands/pm/info.pm.inc
@@ -44,6 +44,7 @@ function _drush_pm_info_extension($info) {
   $data['Title'] = $info->info['name'];
   $data['Description'] = $info->info['description'];
   $data['Version'] = $info->info['version'];
+  $data['Date'] = format_date($info->info['datestamp']);
   $data['Package'] = $info->info['package'];
   $data['Core'] = $info->info['core'];
   $data['PHP'] = $info->info['php'];
diff --git a/commands/pm/pm.drush.inc b/commands/pm/pm.drush.inc
index af4784f..7b1d6bd 100644
--- a/commands/pm/pm.drush.inc
+++ b/commands/pm/pm.drush.inc
@@ -168,6 +168,7 @@ function pm_drush_command() {
       'pipe' => 'Returns a whitespace delimited list of projects with any of its extensions enabled and their respective version and update information, one project per line. Order: project name, current version, recommended version, update status.',
       'notes' => 'Show release notes for each project to be updated.',
       'no-core' => 'Only update modules and skip the core update.',
+      'stable' => 'Upgrade dev release to the latest stable version, if a newer one is available.',
     ) + $update_options,
     'sub-options' => $update_suboptions,
     'aliases' => array('upc'),
diff --git a/commands/pm/updatecode.pm.inc b/commands/pm/updatecode.pm.inc
index dba2ce0..236d3b8 100644
--- a/commands/pm/updatecode.pm.inc
+++ b/commands/pm/updatecode.pm.inc
@@ -525,16 +525,40 @@ function pm_project_filter(&$update_info, &$rows, $security_only) {
         $status = dt('Project has no enabled extensions and can\'t be updated');
         break;
       default:
-        $status = pm_update_filter($project);
+        // Special checking for projects using the 'dev' release
+        $upgrade_to_stable = TRUE;
+        $project_is_dev = preg_match('/([^+]*)(\+*[0-9]*)-dev/', $project['existing_version'], $matches);
+        if ($project_is_dev) {
+          $upgrade_to_stable = drush_get_option('stable', FALSE);
+        }
+        if ($upgrade_to_stable) {
+          $status = pm_update_filter($project);
+        }
+        else {
+          $status = dt('Up to date (latest dev)');
+          $latest_date = $project['info']['datestamp'];
+          // Search through available releases to find a -dev release
+          // that is newer than the current release.
+          foreach ($project['releases'] as $release => $info) {
+            if (preg_match('/([^+]*)(\+*[0-9]*)-dev/', $release) && ($info['date'] > $latest_date)) {
+              $latest_date = $info['date'];
+              $project['candidate_version'] = $release;
+              $status = dt('Update available (newer dev)');
+              $project['updateable'] = TRUE;
+            }
+          }
+        }
         break;
     }
 
-    // Special checking:  if drush decides that the candidate version is older
-    // than the installed version, then we will set the candidate version to
-    // the installed version.
-    if (isset($project['candidate_version'], $project['releases'][$project['candidate_version']], $project['releases'][$project['existing_version']])) {
-      if ($project['releases'][$project['candidate_version']]['date'] < $project['releases'][$project['existing_version']]['date']) {
-        $project['candidate_version'] = $project['existing_version'];
+    // Special checking:  if Drush decides that the candidate version is older
+    // than the installed version, then set this project as up to date.  This
+    // can happen if the user explicitly installed a release newer than the
+    // recommended release, which by default is favored even if older.
+    if (isset($project['candidate_version'], $project['releases'][$project['candidate_version']])) {
+      if ($project['releases'][$project['candidate_version']]['date'] < $project['info']['datestamp']) {
+        unset($project['updateable']);
+        $status = dt('Up to date');
       }
     }
 
