diff --git a/commerce_checkout_login.module b/commerce_checkout_login.module
index e812f22..12eea41 100644
--- a/commerce_checkout_login.module
+++ b/commerce_checkout_login.module
@@ -26,9 +26,19 @@ function commerce_checkout_login_form_commerce_checkout_form_alter(&$form, &$for
     );
 
     // Check the form state to see if an e-mail address has been specified.
+    $mail = '';
     if (!empty($form_state['values']['account']['login'])) {
       $mail = trim($form_state['values']['account']['login']['mail']);
-
+    }
+    elseif (!empty($_GET['name'])
+            && empty($form['account']['login']['mail']['#value'])
+            && empty($form_state['input']['account']['login']['mail'])) {
+      // This value is set when returning from the 'forgot password' screen.
+      // (See 'destination' below.)
+      $mail = $_GET['name'];
+      $form['account']['login']['mail']['#default_value'] = $mail;
+    }
+    if ($mail) {
       // Don't attempt to load the user for an invalid e-mail address.
       if ($error = user_validate_mail($mail)) {
         form_set_error('account][login][mail', $error);
@@ -41,6 +51,16 @@ function commerce_checkout_login_form_commerce_checkout_form_alter(&$form, &$for
         $form['account']['login']['password'] = array(
           '#type' => 'password',
           '#title' => t('Password'),
+          '#description' => l(
+            t('I forgot my password'),
+            'user/password',
+            array(
+              'attributes' => array(
+                'title' => t('Request new password via e-mail.')),
+              'query' => array(
+                'destination' => 'checkout/' . $form_state['order']->order_id . '/' . $form_state['checkout_page']['page_id'] . '?name=' . $mail,
+              ),
+            )),
         );
 
         $form['account']['login']['login_now'] = array(
@@ -106,3 +126,25 @@ function commerce_checkout_login_checkout_form_submit($form, &$form_state) {
     unset($form_state['commerce_checkout_login_uid']);
   }
 }
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Fills the e-mail address in the 'forgot password' form, and adds 'cancel'.
+ */
+function commerce_checkout_login_form_user_pass_alter(&$form, &$form_state) {
+  if (!empty($_GET['destination']) && empty($form['name']['#value']) && empty($form_state['input']['name'])) {
+
+    // Get the name (e-mail address) from the destination URL argument.
+    $destination = drupal_parse_url($_GET['destination']);
+    $form['name']['#default_value'] = $destination['query']['name'];
+
+    $form['actions']['cancel'] = array(
+      '#type' => 'link',
+      '#title' => t('Cancel'),
+      '#href' => $destination['path'],
+      '#options' => array('query' => array('name' => $destination['query']['name']))
+    );
+  }
+
+}
