diff --git a/modules/user/user.module b/modules/user/user.module
index 14e1459..ced5e3a 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -980,7 +980,7 @@ function user_account_form(&$form, &$form_state) {
     '#title' => t('E-mail address'),
     '#maxlength' => EMAIL_MAX_LENGTH,
     '#description' => t('A valid e-mail address. All e-mails from the system will be sent to this address. The e-mail address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by e-mail.'),
-    '#required' => TRUE,
+    '#required' => !(empty($account->mail) && user_access('administer users')),
     '#default_value' => (!$register ? $account->mail : ''),
   );
 
@@ -1166,8 +1166,9 @@ function user_account_form_validate($form, &$form_state) {
     $mail = trim($form_state['values']['mail']);
     form_set_value($form['account']['mail'], $mail, $form_state);
 
-    // Validate the e-mail address, and check if it is taken by an existing user.
-    if ($error = user_validate_mail($form_state['values']['mail'])) {
+    // Validate the e-mail address, and check if it is taken by an existing
+    // user, but only if the field is required.
+    if ($form['account']['mail']['#required'] && ($error = user_validate_mail($form_state['values']['mail']))) {
       form_set_error('mail', $error);
     }
     elseif ((bool) db_select('users')->fields('users', array('uid'))->condition('uid', $account->uid, '<>')->condition('mail', db_like($form_state['values']['mail']), 'LIKE')->range(0, 1)->execute()->fetchField()) {
diff --git a/modules/user/user.test b/modules/user/user.test
index 6ecbfac..323da4c 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -796,6 +796,33 @@ class UserCancelTestCase extends DrupalWebTestCase {
   }
 
   /**
+   * Create an administrative user and delete a user without an e-mail address.
+   */
+  function testUserWithoutEmailCancelByAdmin() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+
+    // Create a regular user.
+    $account = $this->drupalCreateUser(array());
+    // This user has no e-mail address.
+    $account->mail == '';
+
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+
+    // Delete regular user without e-mail address.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertRaw(t('Are you sure you want to cancel the account %name?', array('%name' => $account->name)), t('Confirmation form to cancel account displayed.'));
+    $this->assertText(t('Select the method to cancel the account above.'), t('Allows to select account cancellation method.'));
+
+    // Confirm deletion.
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertRaw(t('%name has been deleted.', array('%name' => $account->name)), t('User deleted.'));
+    $this->assertFalse(user_load($account->uid), t('User is not found in the database.'));
+  }
+
+  /**
    * Create an administrative user and mass-delete other users.
    */
   function testMassUserCancelByAdmin() {
@@ -1671,6 +1698,16 @@ class UserEditTestCase extends DrupalWebTestCase {
     $user1->pass_raw = $new_pass;
     $this->drupalLogin($user1);
     $this->drupalLogout();
+
+    // Test that an admin can edit users without an e-mail address.
+    $admin = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin);
+    // Create a user without an e-mail address.
+    $user3 = $this->drupalCreateUser(array());
+    $edit = array('mail' => '');
+    user_save($user3, $edit);
+    $this->drupalPost("user/$user3->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t("The changes have been saved."));
   }
 }
 
