diff --git commands/pm/pm.drush.inc commands/pm/pm.drush.inc
index 2d7633d..3c62dcb 100644
--- commands/pm/pm.drush.inc
+++ commands/pm/pm.drush.inc
@@ -191,11 +191,23 @@ function pm_drush_command() {
     'description' => 'Notify of pending db updates.',
     'hidden' => TRUE
   );
+  $items['pm-releasenotes'] = array(
+    'description' => 'Prints release notes for drupal.org project(s). ',
+    'arguments' => array(
+      'project' => 'A space separated list of drupal.org project names, optionally followed by a specific version. Defaults to \'drupal\'',
+    ),
+    'examples' => array(
+      'drush rln cck' => 'Prints the release notes for the recommended version of CCK package.',
+      'drush rln token-1.13' => 'Prints the release notes of a specfic version of the Token project for my version of Drupal.',
+      'drush rln pathauto zen' => 'Prints the release notes for the recommended version of Pathauto and Zen projects.',
+    ),
+    'aliases' => array('rln'),
+  );
   $items['pm-releases'] = array(
     'description' => 'Release information for a project',
     'drupal dependencies' => array($update),
     'arguments' => array(
-      'projects' => 'A space separated list of drupal.org project names.',
+      'projects' => 'A space separated list of drupal.org project names. Required.',
     ),
     'examples' => array(
       'drush pm-releases cck zen' => 'View releases for cck and Zen projects.',
@@ -218,6 +230,7 @@ function pm_drush_command() {
     'options' => array(
       '--destination' => 'Path to which the project will be copied. If you\'re providing a relative path, note it is relative to the drupal root (if bootstrapped).',
       '--source' => 'The base URL which provides project release history in XML. Defaults to http://updates.drupal.org/release-history.',
+      '--notes' => 'Show the release notes immediately after that each project is successfully downloaded.',
       '--variant' => "Only useful for install profiles. Possible values: 'core', 'no-core', 'make'.",
       '--drupal-project-rename' => 'Alternate name for "drupal-x.y" directory when downloading Drupal project. If empty, will defaults to "drupal".',
       '--pipe' => 'Returns a list of the names of the modules and themes contained in the downloaded projects.',
@@ -884,14 +897,19 @@ function _pm_get_project_path($data, $lookup) {
  * A drush command callback. Show release info for given project(s).
  *
  **/
-function drush_pm_releases() {
+function drush_pm_releases($projects = NULL, $get_args = TRUE) {
   // We don't provide for other options here, so we supply an explicit path.
   drush_include_engine('update_info', 'drupal', NULL, DRUSH_BASE_PATH . '/commands/pm/update_info');
-
-  $projects = func_get_args();
+  if (!func_get_args()) {
+    return drush_print("Type 'drush help pm-releases' to see how to use.");
+  }
+  elseif ($get_args) {
+    $projects = func_get_args();
+  }
   $projects = drupal_map_assoc($projects);
   $info = pm_get_project_info($projects);
   $project_info = drush_get_projects();
+  $specific_data = array();
 
   $rows[] = array(dt('Project'), dt('Release'), dt('Date'), dt('Status'));
   foreach ($info as $key => $project) {
@@ -924,6 +948,7 @@ function drush_pm_releases() {
       }
       if ((isset($recommended_version)) && ($release['version'] == $recommended_version)) {
         $status[] = dt('Recommended');
+        $specific_data['recommended'] = $release['version'];
       }
       if ($release['version_extra'] == 'dev') {
         $status[] = dt('Development');
@@ -931,6 +956,7 @@ function drush_pm_releases() {
       if (isset($project_info[$key])) {
         if ($project_info[$key]->info['version'] == $release['version']) {
           $status[] = dt('Installed');
+          $specific_data['installed'] = $release['version'];
         }
       }
       if (isset($release['terms']) && array_key_exists('Release type', $release['terms'])) {
@@ -949,6 +975,10 @@ function drush_pm_releases() {
     }
   }
 
+  if (!$get_args) {
+    $merged_info = array_merge($specific_data, $info);
+    return $merged_info;
+  }
   if (count($rows) == 1) {
     return drush_set_error('DRUSH_PM_PROJECT_NOT_FOUND', dt('No information available.'));
   }
@@ -958,6 +988,186 @@ function drush_pm_releases() {
 }
 
 /**
+ * Prints the release notes for drupal projects.
+ *
+ * It is command callback for pm-relasenotes and complements other commands
+ * (dl, up & upc).
+ *
+ * @param $projects
+ * @param $get_args
+ * @param $dl
+ */
+function drush_pm_releasenotes($projects = NULL, $get_args = TRUE, $dl = FALSE) {
+  // First we define the arguments to be considered.
+  if (!func_get_args()) {
+    $projects = array('drupal');
+  }
+  elseif ($get_args) {
+    $dl = FALSE;
+    $projects = func_get_args();
+  }
+  $requests = pm_parse_project_version($projects);
+  foreach ($requests as $name => $request) {
+    $selected_versions = array();
+    $project = $request['name'];
+    $project_info_plus = drush_pm_releases(array($project => $project), FALSE);
+    $project_info = array_pop($project_info_plus);
+    if (is_null($project_info)) {
+      drush_set_error('DRUSH_PM_PROJECT_NOT_FOUND', dt("The !project project was not found.", array('!project' => $project)));
+      continue;
+    }
+    $version_data = $project_info_plus;
+    if (!isset($version_data['installed'])) {
+      // Installed package's version (e.g. cck) are not detected for
+      // drush_pm_releases() function. We attempted to obtain information
+      // about it from update_cache.
+      $cache_project_info = _update_cache_get('update_project_projects');
+      if (isset($cache_project_info->data[$project])) {
+        $version_data['installed'] = $cache_project_info->data[$project]['info']['version'];
+      }
+    }
+    if (isset($request['version'])) {
+      // There are a specific version, then we print the release notes for it
+      // only.
+      $selected_versions[] = $request['version'];
+    }
+    else {
+      $reco_version = $version_data['recommended'];
+      $inst_version = $version_data['installed'];
+      $inst_patch_version = $project_info['releases'][$inst_version]['version_patch'];
+      $reco_patch_version = $project_info['releases'][$reco_version]['version_patch'];
+
+      if (isset($reco_version, $inst_version)) {
+        if (isset($project_info['releases'][$inst_version]['version_extra']) || $project == 'drupal') {
+          // Special handling if there are some extra version (beta4, rc3, etc)
+          // in the installed release.
+          $versions = array();
+          $project_releases = array_reverse($project_info['releases']);
+          $vsn=0;
+          foreach($project_releases as $key => $value) {
+            // We get all versions of the project.
+            $versions[] = $key;
+            if ($key == $reco_version) {
+              // Position of the candidate version.
+              $key_reco_version = $vsn;
+              if (is_null($key_inst_version)) {
+                $key_inst_version = $key_reco_version;
+              }
+              break;
+            }
+            if ($key == $inst_version) {
+              // Position of the installed version.
+              $key_inst_version = $vsn;
+            }
+            ++$vsn;
+          }
+          $i = $key_inst_version;
+          $supremo = $key_reco_version;
+          $version_extra = TRUE;
+        }
+        else {
+          // No extra version, we skip the foreach loop.
+          $i = $inst_patch_version;
+          $supremo = $reco_patch_version;
+          $version_extra = FALSE;
+        }
+        for ($i; $supremo >= $i; ++$i) {
+          if ($version_extra) {
+            $selected_versions[] = $versions[$i];
+          }
+          else {
+            $selected_versions[] = $project_info['api_version'] . '-' . $project_info['releases'][$reco_version]['version_major'] . '.' . $i;
+          }
+        }
+      }
+      else {
+        // Not installed project. We show the release notes for the recommended
+        // version if the user did not specify one in particular.
+        $selected_versions[] = $version_data['recommended'];
+      }
+    }
+    foreach ($selected_versions as $key => $version) {
+      // Stage of parsing.
+      // Con la versión ya definida, intentamos obtener las release notes
+      // parseando el contenido que nos devuelve la URL de la release.
+      if (!isset($project_info['releases'][$version]['release_link'])) {
+        // We avoid the cases where the URL of the release notes does not exist.
+        drush_log(dt("The !project project does not have release notes for version !version.", array('!project' => $project, '!version' => $version)), 'warning');
+        continue;
+      }
+      else {
+        $release_page_url = $project_info['releases'][$version]['release_link'];
+      }
+      $release_page_url_parsed = parse_url($release_page_url);
+      $release_url_path = $release_page_url_parsed['path'];
+      if (!empty($release_url_path)) {
+        if ($release_page_url_parsed['host'] == 'drupal.org') {
+        $release_page_id = substr($release_url_path, strlen('/node/'));
+          drush_log(dt("The URL of the release notes page for !project project was processed correctly.", array('!project' => $project)), 'notice');
+        }
+        else {
+          drush_log(dt("The !project project has relese notes's page, but it isn't hosted on drupal.org. See !url.", array('!project' => $project, '!url' => $release_page_url)), 'error');
+          continue;
+        }
+      }
+      $data = drupal_http_request($release_page_url);
+      if (isset($data->error)) {
+        drush_log(dt("Error (!error) while requesting the release notes' page of the !project project.", array('!error' => $data->error, '!project' => $project)), 'error');
+        continue;
+      }
+      @$dom = DOMDocument::loadHTML($data->data);
+      $xml = simplexml_import_dom($dom);
+      $xpath_expression = '//*[@id="node-' . $release_page_id .  '"]/div[@class="node-content"]';
+      $node_content = $xml->xpath($xpath_expression);
+
+      // We create the print format.
+      $dmv_less_7 = (drush_drupal_major_version() < 7);
+      $notes_last_update = $node_content[0]->div[1]->div[0]->asXML();
+      unset($node_content[0]->div);
+      $project_notes = $node_content[0]->asXML();
+
+      if (isset($version_data['installed'])) {
+        if (isset($request['version'])) {
+          $status_msg = 'Note: write only project name to see all the newer release notes.';
+        }
+        else {
+          if ($version == $version_data['installed']) {
+            $status_msg = 'Note: this is the installed version.';
+            if ($version == $version_data['recommended']) {
+              $status_msg = 'Note: this is the installed & recommended version.';
+            }
+          }
+          elseif ($version == $version_data['recommended']) {
+            $status_msg = 'Note: this is the recommended version.';
+          }
+          else {
+            $status_msg = dt('Note: the installed version is !version.', array('!version' => $version_data['installed']));
+          }
+        }
+      }
+      else {
+        $status_msg = 'Note: specific non-installed version.';
+        if (!isset($request['version'])) {
+          $status_msg = 'Note: recommended non-installed version.';
+        }
+      }
+      $notes_header = dt("
+      <hr>
+      > RELEASE NOTES FOR '!title' PROJECT, VERSION !version:!break
+      > !time.!break
+        !note
+      <hr>
+      ", array('!note' => $dl ? '' : ($dmv_less_7 ? ('> ' . $status_msg) : ('> ' . $status_msg . ' -<hr>')), '!title' => strtoupper($project_info['title']), '!break' => $dmv_less_7 ? '<br>' : ' -<hr>', '!name' => $project, '!version' => $version, '!time' => $notes_last_update));
+
+      // Finally we print the release notes for the requested project.
+      $print = drupal_html_to_text($notes_header . $project_notes, array('br', 'p', 'ul', 'ol', 'li', 'hr',));
+      drush_print($print);
+      if (!$dmv_less_7) {drush_print();}
+    }
+  }
+}
+
+/**
  * Command callback. Refresh update status information.
  */
 function drush_pm_refresh() {
@@ -1627,6 +1837,10 @@ function drush_pm_download() {
     drush_command_invoke_all('drush_pm_post_download', $request, $release);
     $version_control->post_download($request);
 
+    // Print release notes if --notes option is set.
+    if (drush_get_option('notes')) {
+      drush_pm_releasenotes(array($name . '-' . $release['version']), FALSE, TRUE);
+    }
     // Inform the user about available modules a/o themes in the downloaded package.
     drush_pm_projects_in_project($request);
   }
diff --git commands/pm/updatecode.pm.inc commands/pm/updatecode.pm.inc
index b26e9f4..1e0af6d 100644
--- commands/pm/updatecode.pm.inc
+++ commands/pm/updatecode.pm.inc
@@ -242,8 +242,8 @@ function _pm_update_move_files($src_dir, $dest_dir, $skip_list, $remove_conflict
 }
 
 /**
- * Update packages according to an array of releases, following interactive
- * confirmation from the user.
+ * Update packages according to an array of releases and print the release notes
+ * for each project, following interactive confirmation from the user.
  *
  * @param $projects
  *   An array of projects from the drupal.org update service, with an additional
@@ -253,17 +253,33 @@ function pm_update_packages($projects) {
   drush_include_engine('package_handler', drush_get_option('package-handler', 'wget'));
   $drupal_root = drush_get_context('DRUSH_DRUPAL_ROOT');
 
-  drush_print(dt('Code updates will be made to the following projects:'));
   $print = '';
   foreach($projects as $project) {
     $print .= $project['title'] . " [" . $project['name'] . '-' . $project['candidate_version'] . "], ";
+    $requests_notes[] = $project['name'];
   }
+  // We print the list of the projects that need to be updated.
+  drush_print(dt('Code updates will be made to the following projects:'));
   drush_print(substr($print, 0, strlen($print)-2));
+
+  // We print the release notes for each project, if they are more of one then
+  // we ask before.
+  if (count($projects) == 1) {
+    if (!drush_get_context('DRUSH_NEGATIVE')) {
+      drush_pm_releasenotes($requests_notes, FALSE);
+    }
+  }
+  elseif (drush_confirm(dt('Do you want to see the release notes of the above exposed versions?'))) {
+    drush_pm_releasenotes($requests_notes, FALSE);
+  }
+  unset($requests_notes);
+
+  // We print some warnings before the user confirms the update.
   drush_print();
   drush_print(dt("Note: Updated projects can potentially break your site. It is NOT recommended to update production sites without prior testing."));
   drush_print(dt("Note: A backup of your package will be stored to backups directory if it is not managed by a supported version control system."));
   drush_print(dt('Note: If you have made any modifications to any file that belongs to one of these projects, you will have to migrate those modifications after updating.'));
-  if(!drush_confirm(dt('Do you really want to continue?'))) {
+  if(!drush_confirm(dt('Do you really want to continue with the update process?'))) {
     drush_user_abort();
   }
 
diff --git includes/drush.inc includes/drush.inc
index eeebd0e..9478a7e 100644
--- includes/drush.inc
+++ includes/drush.inc
@@ -610,12 +610,21 @@ function drush_move_dir($src, $dest, $overwrite = FALSE) {
   if (@drush_op('rename', $src, $dest)) {
     return TRUE;
   }
+  elseif (is_file($dest)) {
+    unlink($dest);
+  }
+  // If rename doesn't work, then try mv.
+  $exec = 'mv ' . $src . ' ' . dirname($dest);
+  $mv_result = drush_op('system', $exec);
+  if ($mv_result !== FALSE) {
+    return TRUE;
+  }
   // Bail if we can't make a directory at the
   // destination (e.g. permissions)
   if (!is_dir($dest) && (drush_op('mkdir', $dest) === FALSE)) {
     return FALSE;
   }
-  // If rename doesn't work, then try rsync.
+  // If rename and mv doesn't work, then try rsync.
   $exec = 'rsync -raz --remove-source-files ' . $src . DIRECTORY_SEPARATOR . ' ' . $dest;
   $rsync_result = drush_op('system', $exec);
   if($rsync_result !== FALSE) {
