=== modified file 'includes/form.inc'
--- includes/form.inc	
+++ includes/form.inc	
@@ -268,6 +268,7 @@ function _form_builder($form_id, $form) 
       $edit = isset($edit[$parent]) ? $edit[$parent] : NULL;
       $ref =& $ref[$parent];
     }
+    $form['#ref'] = &$ref;
     if (!isset($form['#value'])) {
       if ($posted) {
         if (isset($edit)) {
@@ -582,18 +583,19 @@ function theme_password_confirm($element
  * Build password_confirm element.
  */
 function password_confirm_after_build($form, $form_values, &$ref) {
-  if (isset($form_values['pass1'])) {
-    $pass1 = trim($form_values['pass1']);
-    $pass2 = trim($form_values['pass2']);
-    unset($form_values['pass1'], $form_values['pass2']);
+  if (isset($form['pass1']['#value'])) {
+    $pass1 = trim($form['pass1']['#value']);
+    $pass2 = trim($form['pass2']['#value']);
+    $form['pass1']['#ref'] = NULL;
+    $form['pass2']['#ref'] = NULL;
     if ($pass1 != $pass2) {
       form_set_error('pass1', t('The specified passwords do not match.'));
     }
-    elseif ($form['#required'] && !$pass1) {
-      form_set_error('pass1', t('Password field is required.'));
-    }
     $ref = $pass1;
   }
+  elseif ($form['#required'] && !empty($_POST['edit'])) {
+    form_set_error('pass1', t('Password field is required.'));
+  }
   return $form;
 }
 
