Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.1228
diff -u -p -r1.1228 common.inc
--- includes/common.inc	26 Sep 2010 23:31:35 -0000	1.1228
+++ includes/common.inc	27 Sep 2010 19:15:31 -0000
@@ -6004,6 +6004,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.497
diff -u -p -r1.497 form.inc
--- includes/form.inc	27 Sep 2010 00:53:55 -0000	1.497
+++ includes/form.inc	27 Sep 2010 19:15:31 -0000
@@ -3532,6 +3532,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";
@@ -3634,6 +3639,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('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.69
diff -u -p -r1.69 form.test
--- modules/simpletest/tests/form.test	27 Sep 2010 00:53:56 -0000	1.69
+++ modules/simpletest/tests/form.test	27 Sep 2010 19:15:31 -0000
@@ -66,7 +66,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="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.965
diff -u -p -r1.965 system.module
--- modules/system/system.module	27 Sep 2010 01:11:17 -0000	1.965
+++ modules/system/system.module	27 Sep 2010 19:15:31 -0000
@@ -371,6 +371,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'),
@@ -385,6 +386,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'),
@@ -441,6 +443,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: themes/bartik/css/style.css
===================================================================
RCS file: /cvs/drupal/drupal/themes/bartik/css/style.css,v
retrieving revision 1.25
diff -u -p -r1.25 style.css
--- themes/bartik/css/style.css	8 Oct 2010 03:36:03 -0000	1.25
+++ themes/bartik/css/style.css	18 Oct 2010 20:48:39 -0000
@@ -1139,7 +1153,7 @@ input.form-submit:focus {
   margin-bottom: 1em;
   margin-top: 2px;
 }
-.form-item label {
+.form-item label, div.label {
   font-size: 0.929em;
 }
 fieldset .description {
Index: themes/bartik/css/style.css
===================================================================
RCS file: /cvs/drupal/drupal/themes/bartik/css/style.css,v
retrieving revision 1.17
diff -u -p -r1.17 style.css
--- themes/bartik/css/style.css	24 Sep 2010 01:36:30 -0000	1.17
+++ themes/bartik/css/style.css	27 Sep 2010 19:15:31 -0000
@@ -1074,7 +1074,7 @@ input.form-submit:focus {
   margin-bottom: 1em;
   margin-top: 2px;
 }
-.form-item label {
+.form-item label, div.label {
   font-size: 90%;
 }
 .form-radio {
Index: themes/seven/style.css
===================================================================
RCS file: /cvs/drupal/drupal/themes/seven/style.css,v
retrieving revision 1.73
diff -u -p -r1.73 style.css
--- themes/seven/style.css	23 Sep 2010 02:11:19 -0000	1.73
+++ themes/seven/style.css	27 Sep 2010 19:15:31 -0000
@@ -586,7 +586,7 @@ div.teaser-checkbox .form-item,
 .text-format-wrapper .form-item {
   padding-bottom: 0;
 }
-.form-item label {
+.form-item label, div.label {
   margin: 0;
   padding: 0;
 }
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.130
diff -u -p -r1.130 common.test
--- modules/simpletest/tests/common.test	8 Oct 2010 15:36:12 -0000	1.130
+++ modules/simpletest/tests/common.test	18 Oct 2010 20:50:21 -0000
@@ -1558,7 +1558,7 @@ class DrupalRenderTestCase extends Drupa
       '#title' => $this->randomName(),
       '#markup' => $this->randomName(),
     );
-    $this->assertRenderedElement($element, '//div[contains(@class, :class) and contains(., :markup)]/label[contains(., :label)]', array(
+    $this->assertRenderedElement($element, '//div[contains(@class, :class) and contains(., :markup)]/div[contains(., :div)]', array(
       ':class' => 'form-type-item',
       ':markup' => $element['#markup'],
       ':label' => $element['#title'],

