===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.367
diff -u -p -r1.367 form.inc
--- includes/form.inc	27 Aug 2009 04:40:12 -0000	1.367
+++ includes/form.inc	28 Aug 2009 03:00:25 -0000
@@ -788,7 +788,10 @@ function _form_validate($elements, &$for
       // checkboxes, can return a valid value of '0'. Instead, check the
       // length if it's a string, and the item count if it's an array.
       if ($elements['#required'] && (!count($elements['#value']) || (is_string($elements['#value']) && strlen(trim($elements['#value'])) == 0))) {
-        form_error($elements, $t('!name field is required.', array('!name' => $elements['#title'])));
+        form_error($elements, $t('<a href="#!field_id">!name</a> field is required.', array(
+          '!field_id' => $elements['#id'],
+          '!name' => $elements['#title'],
+        )));
       }
 
       // Verify that the value is not longer than #maxlength.
@@ -2581,14 +2584,22 @@ function theme_form_element($element) {
 
   $output = '<div class="' . implode(' ', $class) . '">' . "\n";
   $required = !empty($element['#required']) ? '<span class="form-required" title="' . $t('This field is required.') . '">*</span>' : '';
+  $error = '';
+  if ($element['#type'] == 'password' && $element['#name'] == 'pass[pass1]') {
+    // Only display an error on the second password field.
+  } else if (!empty($element['#required']) && empty($element['#value'])) {
+    $error = form_get_error($element) ? '<span class="error">' . $t('Field is required.') . '</span>' : '';
+  } else {
+    $error = form_get_error($element) ? '<span class="error">' . filter_xss_admin(form_get_error($element)) . '</span>' : '';
+  }
 
   if (!empty($element['#title']) && empty($element['#form_element_skip_title'])) {
     $title = $element['#title'];
     if (!empty($element['#id'])) {
-      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
+      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title !required !error', array('!title' => filter_xss_admin($title), '!required' => $required, '!error' => $error)) . "</label>\n";
     }
     else {
-      $output .= ' <label>' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
+      $output .= ' <label>' . $t('!title !required !error', array('!title' => filter_xss_admin($title), '!required' => $required, '!error' => $error)) . "</label>\n";
     }
   }
 
Index: modules/field/field.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.test,v
retrieving revision 1.46
diff -u -p -r1.46 field.test
--- modules/field/field.test	27 Aug 2009 04:40:12 -0000	1.46
+++ modules/field/field.test	28 Aug 2009 03:00:25 -0000
@@ -1231,7 +1231,7 @@ class FieldFormTestCase extends FieldTes
     // Submit with missing required value.
     $edit = array();
     $this->drupalPost('test-entity/add/test-bundle', $edit, t('Save'));
-    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+    $this->assertText(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
 
     // Create an entity
     $value = mt_rand(1, 127);
@@ -1247,7 +1247,7 @@ class FieldFormTestCase extends FieldTes
     $value = '';
     $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
     $this->drupalPost('test-entity/' . $id . '/edit', $edit, t('Save'));
-    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+    $this->assertText(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
   }
 
 //  function testFieldFormMultiple() {
