Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.1208
diff -u -p -r1.1208 common.inc
--- includes/common.inc	18 Aug 2010 00:44:52 -0000	1.1208
+++ includes/common.inc	19 Aug 2010 14:55:01 -0000
@@ -5776,6 +5776,9 @@ function drupal_common_theme() {
     'form_element_label' => array(
       'render element' => 'element',
     ),
+    'form_element_heading' => array(
+      'render element' => 'element',
+    ),
     'vertical_tabs' => array(
       'render element' => 'element',
     ),
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.483
diff -u -p -r1.483 form.inc
--- includes/form.inc	18 Aug 2010 00:44:52 -0000	1.483
+++ includes/form.inc	19 Aug 2010 14:55:02 -0000
@@ -3371,6 +3371,11 @@ function theme_form_element($variables) 
   $suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . $element['#field_suffix'] . '</span>' : '';
 
   switch ($element['#title_display']) {
+    case 'heading':
+      $output .= ' ' . theme('form_element_heading', $variables);
+      $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
+      break;
+
     case 'before':
       $output .= ' ' . theme('form_element_label', $variables);
       $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
@@ -3473,6 +3478,37 @@ function theme_form_element_label($varia
 }
 
 /**
+ * Returns HTML for a form element heading.
+ *
+ * @todo
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #required, #title, #id, #value, #description.
+ *
+ * @ingroup themeable
+ */
+function theme_form_element_heading($variables) {
+  $element = $variables['element'];
+  // This is also used in the installer, pre-database setup.
+  $t = get_t();
+
+  // If title and required marker are both empty, output no label.
+  if (empty($element['#title']) && empty($element['#required'])) {
+    return '';
+  }
+
+  // If the element is required, a required marker is appended to the label.
+  $required = !empty($element['#required']) ? theme('form_required_marker', array('element' => $element)) : '';
+
+  $title = filter_xss_admin($element['#title']);
+  $attributes = array('class' => array('form-label'));
+
+  return '<div' . drupal_attributes($attributes) . '>' . $t('!title !required', array('!title' => $title, '!required' => $required)) . "</div>\n";
+}
+
+/**
  * Sets a form element's class attribute.
  *
  * Adds 'required' and 'error' classes as needed.
Index: modules/simpletest/tests/form.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form.test,v
retrieving revision 1.61
diff -u -p -r1.61 form.test
--- modules/simpletest/tests/form.test	18 Aug 2010 00:44:52 -0000	1.61
+++ modules/simpletest/tests/form.test	19 Aug 2010 14:55:02 -0000
@@ -63,7 +63,7 @@ class FormsTestCase extends DrupalWebTes
     $elements['file']['empty_values'] = $empty_strings;
 
     // Regular expression to find the expected marker on required elements.
-    $required_marker_preg = '@<label.*<span class="form-required" title="This field is required\.">\*</span></label>@';
+    $required_marker_preg = '@<(?:label|div class="form-label").*<span class="form-required" title="This field is required\.">\*</span></(?:label|div)>@';
 
     // Go through all the elements and all the empty values for them.
     foreach ($elements as $type => $data) {
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.954
diff -u -p -r1.954 system.module
--- modules/system/system.module	18 Aug 2010 18:41:30 -0000	1.954
+++ modules/system/system.module	19 Aug 2010 14:55:02 -0000
@@ -370,6 +370,7 @@ function system_element_info() {
   );
   $types['radios'] = array(
     '#input' => TRUE,
+    '#title_display' => 'heading',
     '#process' => array('form_process_radios'),
     '#theme_wrappers' => array('radios'),
     '#pre_render' => array('form_pre_render_conditional_form_element'),
@@ -384,6 +385,7 @@ function system_element_info() {
   );
   $types['checkboxes'] = array(
     '#input' => TRUE,
+    '#title_display' => 'heading',
     '#process' => array('form_process_checkboxes'),
     '#theme_wrappers' => array('checkboxes'),
     '#pre_render' => array('form_pre_render_conditional_form_element'),
@@ -436,6 +438,7 @@ function system_element_info() {
   // Form structure.
   $types['item'] = array(
     '#markup' => '',
+    '#title_display' => 'heading',
     '#pre_render' => array('drupal_pre_render_markup'),
     '#theme_wrappers' => array('form_element'),
   );
Index: modules/system/system.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.css,v
retrieving revision 1.78
diff -u -p -r1.78 system.css
--- modules/system/system.css	2 Aug 2010 11:22:22 -0000	1.78
+++ modules/system/system.css	19 Aug 2010 14:55:02 -0000
@@ -120,6 +120,10 @@ tr.merge-up th {
   display: inline;
   font-weight: normal;
 }
+.form-label {
+  display: block;
+  font-weight: bold;
+}
 .form-checkboxes,
 .form-radios {
   margin: 1em 0;
