Index: includes/authorize.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/authorize.inc,v
retrieving revision 1.11
diff -u -p -r1.11 authorize.inc
--- includes/authorize.inc	14 May 2010 04:50:18 -0000	1.11
+++ includes/authorize.inc	29 Sep 2010 22:14:53 -0000
@@ -50,6 +50,7 @@ function authorize_filetransfer_form($fo
   $form['connection_settings']['#tree'] = TRUE;
   $form['connection_settings']['authorize_filetransfer_default'] = array(
     '#type' => 'select',
+    '#required' => TRUE,
     '#title' => t('Connection method'),
     '#default_value' => $authorize_filetransfer_default,
     '#weight' => -10,
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	29 Sep 2010 22:15:32 -0000
@@ -2161,7 +2161,7 @@ function form_type_password_confirm_valu
  */
 function form_type_select_value($element, $input = FALSE) {
   if ($input !== FALSE) {
-    if (isset($element['#multiple']) && $element['#multiple']) {
+    if ($element['#multiple']) {
       // If an enabled multi-select submits NULL, it means all items are
       // unselected. A disabled multi-select always submits NULL, and the
       // default value should be used.
@@ -2176,6 +2176,23 @@ function form_type_select_value($element
       return $input;
     }
   }
+  else {
+    if ($element['#multiple']) {
+      return (isset($element['#default_value']) && is_array($element['#default_value'])) ? $element['#default_value'] : array();
+    }
+    else {
+      // If there is a #default_value, then it is only valid if it is contained
+      // in #options.
+      if (isset($element['#default_value']) && isset($element['#options'][$element['#default_value']])) {
+        return $element['#default_value'];
+      }
+      // Otherwise, pre-select the empty default option value.
+      // @see form_process_select()
+      else {
+        return $element['#empty_value'];
+      }
+    }
+  }
 }
 
 /**
@@ -2309,8 +2326,8 @@ function _form_options_flatten($array) {
  *   - #required: (optional) Whether the user needs to select an option (TRUE)
  *     or not (FALSE). Defaults to TRUE.
  *   - #empty_option: (optional) The label to show for the first default option.
- *     By default, the label is automatically set to "- Please select -" for a
- *     required field and "- None -" for an optional field.
+ *     If not set, the default label is automatically set according to whether
+ *     the element is #required or not.
  *   - #empty_value: (optional) The value for the first default option, which is
  *     used to determine whether the user submitted a value or not. Defaults to
  *     '' (an empty string). To be used in case the field is optional and the
@@ -2323,10 +2340,6 @@ function form_process_select($element) {
   if ($element['#multiple']) {
     $element['#attributes']['multiple'] = 'multiple';
     $element['#attributes']['name'] = $element['#name'] . '[]';
-    // If not explicitly set, #required has to default to FALSE (see below).
-    if (!isset($element['#required'])) {
-      $element['#required'] = FALSE;
-    }
   }
   // A non-#multiple select needs special handling to prevent user agents from
   // preselecting the first option without intention. #multiple select lists do
@@ -2334,41 +2347,22 @@ function form_process_select($element) {
   else {
     $add_empty_option = FALSE;
     // Select elements always have a value in HTML, so the expectation is that
-    // the user has to choose an option. Therefore, a select element is set to
-    // #required TRUE, unless it has been explicitly set to FALSE. This differs
-    // from every other element which gets a default of #required FALSE via
-    // form_builder(). To avoid this default, system_element_info() sets
-    // #required to NULL.
-    // If #required has been explicitly set to FALSE, the user may optionally
-    // choose an option, which can be "None".
-    if (isset($element['#required']) && !$element['#required']) {
-      $element['#required'] = FALSE;
+    // the user has to choose an option.
+    if (!$element['#required']) {
       $element += array(
-        '#empty_value' => '',
         '#empty_option' => t('- None -'),
       );
       $add_empty_option = TRUE;
     }
-    // Otherwise, if #required is TRUE (or not set) and there is no
-    // #default_value, then the user has to choose an option, which makes this
-    // element #required.
-    elseif (!isset($element['#default_value'])) {
-      // By only conditionally setting #required to TRUE, we additionally ensure
-      // that the select element does not get a required marker if it already
-      // has a value.
-      $element['#required'] = TRUE;
+    // Otherwise, if #required is TRUE and there is no #default_value or the
+    // #default_value is not contained in #options, then the user has to choose
+    // an option.
+    elseif (!isset($element['#default_value']) || !isset($element['#options'][$element['#default_value']])) {
       $element += array(
-        '#empty_value' => '',
         '#empty_option' => t('- Select -'),
       );
       $add_empty_option = TRUE;
     }
-    // If there is a #default_value and #required is not explicitly FALSE, then
-    // there is no point in adding an empty option which is never valid, and we
-    // just retain API compatibility.
-    if (!isset($element['#required'])) {
-      $element['#required'] = FALSE;
-    }
     // If one of the above conditions is met, add a first empty default option,
     // which is always invalid for #required select lists that do not specify a
     // #default_value.
@@ -3421,6 +3415,7 @@ function form_process_weight($element) {
   }
   $element['#options'] = $weights;
   $element['#type'] = 'select';
+  $element['#required'] = TRUE;
   $element['#is_weight'] = TRUE;
   $element += element_info('select');
   return $element;
Index: includes/install.core.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.core.inc,v
retrieving revision 1.34
diff -u -p -r1.34 install.core.inc
--- includes/install.core.inc	24 Sep 2010 21:36:22 -0000	1.34
+++ includes/install.core.inc	29 Sep 2010 22:15:50 -0000
@@ -1752,7 +1752,6 @@ function _install_configure_form($form, 
   $form['server_settings']['site_default_country'] = array(
     '#type' => 'select',
     '#title' => t('Default country'),
-    '#required' => FALSE,
     '#default_value' => variable_get('site_default_country', NULL),
     '#options' => $countries,
     '#description' => st('Select the default country for the site.'),
@@ -1762,6 +1761,7 @@ function _install_configure_form($form, 
   $form['server_settings']['date_default_timezone'] = array(
     '#type' => 'select',
     '#title' => st('Default time zone'),
+    '#required' => TRUE,
     '#default_value' => date_default_timezone_get(),
     '#options' => system_time_zones(),
     '#description' => st('By default, dates in this site will be displayed in the chosen time zone.'),
Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.444
diff -u -p -r1.444 aggregator.module
--- modules/aggregator/aggregator.module	24 Sep 2010 00:37:41 -0000	1.444
+++ modules/aggregator/aggregator.module	29 Sep 2010 22:16:38 -0000
@@ -366,6 +366,7 @@ function aggregator_block_configure($del
     $form['block'] = array(
       '#type' => 'select',
       '#title' => t('Number of news items in block'),
+      '#required' => TRUE,
       '#default_value' => $value,
       '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20))
     );
Index: modules/aggregator/aggregator.processor.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.processor.inc,v
retrieving revision 1.13
diff -u -p -r1.13 aggregator.processor.inc
--- modules/aggregator/aggregator.processor.inc	24 Sep 2010 21:36:22 -0000	1.13
+++ modules/aggregator/aggregator.processor.inc	29 Sep 2010 22:16:53 -0000
@@ -100,6 +100,7 @@ function aggregator_form_aggregator_admi
     $form['modules']['aggregator']['aggregator_clear'] = array(
       '#type' => 'select',
       '#title' => t('Discard items older than'),
+      '#required' => TRUE,
       '#default_value' => variable_get('aggregator_clear', 9676800),
       '#options' => $period,
       '#description' => t('Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
Index: modules/block/block.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v
retrieving revision 1.88
diff -u -p -r1.88 block.admin.inc
--- modules/block/block.admin.inc	24 Sep 2010 21:36:22 -0000	1.88
+++ modules/block/block.admin.inc	29 Sep 2010 22:17:43 -0000
@@ -129,7 +129,6 @@ function block_admin_display_form($form,
     );
     $form['blocks'][$key]['region'] = array(
       '#type' => 'select',
-      '#required' => FALSE,
       '#default_value' => $block['region'] != BLOCK_REGION_NONE ? $block['region'] : NULL,
       '#empty_value' => BLOCK_REGION_NONE,
       '#title_display' => 'invisible',
@@ -150,7 +149,9 @@ function block_admin_display_form($form,
     }
   }
   // Do not allow disabling the main system content block.
-  $form['blocks']['system_main']['region']['#required'] = TRUE;
+  if (isset($form['blocks']['system_main']['region'])) {
+    $form['blocks']['system_main']['region']['#required'] = TRUE;
+  }
 
   $form['actions'] = array(
     '#tree' => FALSE,
@@ -302,7 +303,6 @@ function block_admin_configure($form, &$
       $form['regions'][$key] = array(
         '#type' => 'select',
         '#title' => $theme->info['name'],
-        '#required' => FALSE,
         '#default_value' => !empty($region) && $region != -1 ? $region : NULL,
         '#empty_value' => BLOCK_REGION_NONE,
         '#options' => system_region_list($key, REGIONS_VISIBLE),
Index: modules/blog/blog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.module,v
retrieving revision 1.360
diff -u -p -r1.360 blog.module
--- modules/blog/blog.module	30 Aug 2010 05:58:46 -0000	1.360
+++ modules/blog/blog.module	29 Sep 2010 22:17:55 -0000
@@ -201,6 +201,7 @@ function blog_block_configure($delta = '
     $form['blog_block_count'] = array(
       '#type' => 'select',
       '#title' => t('Number of recent blog posts to display'),
+      '#required' => TRUE,
       '#default_value' => variable_get('blog_block_count', 10),
       '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
     );
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.900
diff -u -p -r1.900 comment.module
--- modules/comment/comment.module	24 Sep 2010 00:37:42 -0000	1.900
+++ modules/comment/comment.module	29 Sep 2010 22:20:32 -0000
@@ -414,6 +414,7 @@ function comment_block_configure($delta 
     '#type' => 'select',
     '#title' => t('Number of recent comments'),
     '#default_value' => variable_get('comment_block_count', 10),
+    '#required' => TRUE,
     '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
   );
 
@@ -1079,6 +1080,7 @@ function comment_form_node_type_form_alt
     $form['comment']['comment'] = array(
       '#type' => 'select',
       '#title' => t('Default comment setting for new content'),
+      '#required' => TRUE,
       '#default_value' => variable_get('comment_' . $form['#node_type']->type, COMMENT_NODE_OPEN),
       '#options' => array(t('Hidden'), t('Closed'), t('Open')),
     );
@@ -1091,12 +1093,14 @@ function comment_form_node_type_form_alt
     $form['comment']['comment_default_per_page'] = array(
       '#type' => 'select',
       '#title' => t('Comments per page'),
+      '#required' => TRUE,
       '#default_value' => variable_get('comment_default_per_page_' . $form['#node_type']->type, 50),
       '#options' => _comment_per_page(),
     );
     $form['comment']['comment_anonymous'] = array(
       '#type' => 'select',
       '#title' => t('Anonymous commenting'),
+      '#required' => TRUE,
       '#default_value' => variable_get('comment_anonymous_' . $form['#node_type']->type, COMMENT_ANONYMOUS_MAYNOT_CONTACT),
       '#options' => array(
         COMMENT_ANONYMOUS_MAYNOT_CONTACT => t('Anonymous posters may not enter their contact information'),
Index: modules/field/modules/number/number.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/number/number.module,v
retrieving revision 1.43
diff -u -p -r1.43 number.module
--- modules/field/modules/number/number.module	7 Sep 2010 17:56:41 -0000	1.43
+++ modules/field/modules/number/number.module	29 Sep 2010 22:23:02 -0000
@@ -61,6 +61,7 @@ function number_field_settings_form($fie
     $form['precision'] = array(
       '#type' => 'select',
       '#title' => t('Precision'),
+      '#required' => TRUE,
       '#options' => drupal_map_assoc(range(10, 32)),
       '#default_value' => $settings['precision'],
       '#description' => t('The total number of digits to store in the database, including those to the right of the decimal.'),
@@ -69,6 +70,7 @@ function number_field_settings_form($fie
     $form['scale'] = array(
       '#type' => 'select',
       '#title' => t('Scale'),
+      '#required' => TRUE,
       '#options' => drupal_map_assoc(range(0, 10)),
       '#default_value' => $settings['scale'],
       '#description' => t('The number of digits to the right of the decimal.'),
@@ -79,6 +81,7 @@ function number_field_settings_form($fie
     $form['decimal_separator'] = array(
       '#type' => 'select',
       '#title' => t('Decimal marker'),
+      '#required' => TRUE,
       '#options' => array('.' => t('Decimal point'), ',' => t('Comma')),
       '#default_value' => $settings['decimal_separator'],
       '#description' => t('The character users will input to mark the decimal point in forms.'),
@@ -233,12 +236,14 @@ function number_field_formatter_settings
     $form['decimal_separator'] = array(
       '#type' => 'select',
       '#title' => t('Decimal marker'),
+      '#required' => TRUE,
       '#options' => array('.' => t('Decimal point'), ',' => t('Comma')),
       '#default_value' => $settings['decimal_separator'],
     );
     $form['scale'] = array(
       '#type' => 'select',
       '#title' => t('Scale'),
+      '#required' => TRUE,
       '#options' => drupal_map_assoc(range(0, 10)),
       '#default_value' => $settings['scale'],
       '#description' => t('The number of digits to the right of the decimal.'),
Index: modules/field/modules/options/options.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/options/options.module,v
retrieving revision 1.27
diff -u -p -r1.27 options.module
--- modules/field/modules/options/options.module	17 Aug 2010 21:48:39 -0000	1.27
+++ modules/field/modules/options/options.module	29 Sep 2010 22:13:57 -0000
@@ -87,6 +87,9 @@ function options_field_widget_form(&$for
 
   switch ($type) {
     case 'select':
+      if (!$multiple) {
+        $default_value = (!empty($default_value) ? reset($default_value) : NULL);
+      }
       $element += array(
         '#type' => 'select',
         '#default_value' => $default_value,
@@ -138,9 +141,6 @@ function options_field_widget_form(&$for
  * Form element validation handler for options element.
  */
 function options_field_widget_validate($element, &$form_state) {
-  if ($element['#required'] && $element['#value'] == '_none') {
-    form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
-  }
   // Transpose selections from field => delta to delta => field, turning
   // multiple selected options into multiple parent elements.
   $items = _options_form_to_storage($element);
@@ -152,6 +152,7 @@ function options_field_widget_validate($
  */
 function _options_properties($type, $multiple, $required, $has_value) {
   $base = array(
+    'type' => $type,
     'zero_placeholder' => FALSE,
     'filter_xss' => FALSE,
     'strip_tags' => FALSE,
@@ -168,23 +169,6 @@ function _options_properties($type, $mul
         'strip_tags' => TRUE,
         'optgroups' => TRUE,
       );
-      if ($multiple) {
-        // Multiple select: add a 'none' option for non-required fields.
-        if (!$required) {
-          $properties['empty_option'] = 'option_none';
-        }
-      }
-      else {
-        // Single select: add a 'none' option for non-required fields,
-        // and a 'select a value' option for required fields that do not come
-        // with a value selected.
-        if (!$required) {
-          $properties['empty_option'] = 'option_none';
-        }
-        else if (!$has_value) {
-          $properties['empty_option'] = 'option_select';
-        }
-      }
       break;
 
     case 'buttons':
@@ -224,7 +208,9 @@ function _options_get_options($field, $i
     $options = options_array_flatten($options);
   }
 
-  if ($properties['empty_option']) {
+  // Add an empty option, except for select lists, which are already handled by
+  // Form API.
+  if ($properties['empty_option'] && $properties['type'] != 'select') {
     $label = theme('options_none', array('instance' => $instance, 'option' => $properties['empty_option']));
     $options = array('_none' => $label) + $options;
   }
Index: modules/field_ui/field_ui.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field_ui/field_ui.admin.inc,v
retrieving revision 1.70
diff -u -p -r1.70 field_ui.admin.inc
--- modules/field_ui/field_ui.admin.inc	29 Sep 2010 02:01:34 -0000	1.70
+++ modules/field_ui/field_ui.admin.inc	29 Sep 2010 22:24:27 -0000
@@ -335,7 +335,6 @@ function field_ui_field_overview_form($f
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#parents' => array('fields', $name, 'parent'),
@@ -402,7 +401,6 @@ function field_ui_field_overview_form($f
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#parents' => array('fields', $name, 'parent'),
@@ -458,7 +456,6 @@ function field_ui_field_overview_form($f
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
@@ -482,7 +479,6 @@ function field_ui_field_overview_form($f
       ),
       'type' => array(
         '#type' => 'select',
-        '#required' => FALSE,
         '#options' => $field_type_options,
         '#empty_option' => t('- Select a field type -'),
         '#description' => t('Type of data to store.'),
@@ -491,7 +487,6 @@ function field_ui_field_overview_form($f
       ),
       'widget_type' => array(
         '#type' => 'select',
-        '#required' => FALSE,
         '#options' => $widget_type_options,
         '#empty_option' => t('- Select a widget -'),
         '#description' => t('Form element to edit the data.'),
@@ -530,7 +525,6 @@ function field_ui_field_overview_form($f
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
@@ -544,7 +538,6 @@ function field_ui_field_overview_form($f
       ),
       'field_name' => array(
         '#type' => 'select',
-        '#required' => FALSE,
         '#options' => $existing_field_options,
         '#empty_option' => t('- Select an existing field -'),
         '#description' => t('Field to share'),
@@ -554,7 +547,6 @@ function field_ui_field_overview_form($f
       ),
       'widget_type' => array(
         '#type' => 'select',
-        '#required' => FALSE,
         '#options' => $widget_type_options,
         '#empty_option' => t('- Select a widget -'),
         '#description' => t('Form element to edit the data.'),
@@ -897,7 +889,6 @@ function field_ui_display_overview_form(
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#parents' => array('fields', $name, 'parent'),
@@ -910,6 +901,7 @@ function field_ui_display_overview_form(
       ),
       'label' => array(
         '#type' => 'select',
+        '#required' => TRUE,
         '#options' => $field_label_options,
         '#default_value' => $display['label'],
       ),
@@ -920,6 +912,7 @@ function field_ui_display_overview_form(
     $table[$name]['format'] = array(
       'type' => array(
         '#type' => 'select',
+        '#required' => TRUE,
         '#options' => $formatter_options,
         '#default_value' => $display['type'],
         '#parents' => array('fields', $name, 'type'),
@@ -1051,7 +1044,6 @@ function field_ui_display_overview_form(
       'parent_wrapper' => array(
         'parent' => array(
           '#type' => 'select',
-          '#required' => FALSE,
           '#options' => $table['#parent_options'],
           '#attributes' => array('class' => array('field-parent')),
           '#parents' => array('fields', $name, 'parent'),
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.350
diff -u -p -r1.350 filter.module
--- modules/filter/filter.module	29 Sep 2010 20:12:51 -0000	1.350
+++ modules/filter/filter.module	29 Sep 2010 22:13:57 -0000
@@ -827,6 +827,7 @@ function filter_process_format($element)
   $element['format']['format'] = array(
     '#type' => 'select',
     '#title' => t('Text format'),
+    '#required' => TRUE,
     '#options' => $options,
     '#default_value' => $element['#format'],
     '#access' => count($formats) > 1,
Index: modules/forum/forum.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.admin.inc,v
retrieving revision 1.36
diff -u -p -r1.36 forum.admin.inc
--- modules/forum/forum.admin.inc	8 Aug 2010 19:21:25 -0000	1.36
+++ modules/forum/forum.admin.inc	29 Sep 2010 22:24:58 -0000
@@ -211,6 +211,7 @@ function forum_admin_settings($form) {
   $number = drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 150, 200, 250, 300, 350, 400, 500));
   $form['forum_hot_topic'] = array('#type' => 'select',
     '#title' => t('Hot topic threshold'),
+    '#required' => TRUE,
     '#default_value' => variable_get('forum_hot_topic', 15),
     '#options' => $number,
     '#description' => t('The number of replies a topic must have to be considered "hot".'),
@@ -218,6 +219,7 @@ function forum_admin_settings($form) {
   $number = drupal_map_assoc(array(10, 25, 50, 75, 100));
   $form['forum_per_page'] = array('#type' => 'select',
     '#title' => t('Topics per page'),
+    '#required' => TRUE,
     '#default_value' => variable_get('forum_per_page', 25),
     '#options' => $number,
     '#description' => t('Default number of forum topics displayed per page.'),
@@ -275,15 +277,11 @@ function forum_overview($form, &$form_st
  * @param $child_type Whether the child is forum or container
  */
 function _forum_parent_select($tid, $title, $child_type) {
-
   $parents = taxonomy_get_parents($tid);
   if ($parents) {
     $parent = array_shift($parents);
     $parent = $parent->tid;
   }
-  else {
-    $parent = 0;
-  }
 
   $vid = variable_get('forum_nav_vocabulary', '');
   $children = taxonomy_get_tree($vid, $tid);
@@ -295,7 +293,7 @@ function _forum_parent_select($tid, $tit
   $exclude[] = $tid;
 
   $tree = taxonomy_get_tree($vid);
-  $options[0] = '<' . t('root') . '>';
+  $options = array();
   if ($tree) {
     foreach ($tree as $term) {
       if (!in_array($term->tid, $exclude)) {
@@ -310,5 +308,13 @@ function _forum_parent_select($tid, $tit
     $description = t('Forums may be placed at the top (root) level, or inside another container or forum.');
   }
 
-  return array('#type' => 'select', '#title' => $title, '#default_value' => $parent, '#options' => $options, '#description' => $description, '#required' => TRUE);
+  return array(
+    '#type' => 'select',
+    '#title' => $title,
+    '#required' => TRUE,
+    '#default_value' => isset($parent) ? $parent : NULL,
+    '#options' => $options,
+    '#empty_option' => t('- Root -'),
+    '#description' => $description,
+  );
 }
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.577
diff -u -p -r1.577 forum.module
--- modules/forum/forum.module	27 Sep 2010 02:59:31 -0000	1.577
+++ modules/forum/forum.module	29 Sep 2010 22:25:05 -0000
@@ -635,7 +635,13 @@ function forum_block_info() {
  * Implements hook_block_configure().
  */
 function forum_block_configure($delta = '') {
-  $form['forum_block_num_' . $delta] = array('#type' => 'select', '#title' => t('Number of topics'), '#default_value' => variable_get('forum_block_num_' . $delta, '5'), '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)));
+  $form['forum_block_num_' . $delta] = array(
+    '#type' => 'select',
+    '#title' => t('Number of topics'),
+    '#required' => TRUE,
+    '#default_value' => variable_get('forum_block_num_' . $delta, '5'),
+    '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
+  );
   return $form;
 }
 
Index: modules/image/image.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/image/image.admin.inc,v
retrieving revision 1.24
diff -u -p -r1.24 image.admin.inc
--- modules/image/image.admin.inc	27 Sep 2010 00:53:56 -0000	1.24
+++ modules/image/image.admin.inc	29 Sep 2010 22:25:16 -0000
@@ -127,7 +127,6 @@ function image_style_form($form, &$form_
   );
   $form['effects']['new']['new'] = array(
     '#type' => 'select',
-    '#required' => FALSE,
     '#options' => $new_effect_options,
     '#empty_option' => t('Select a new effect'),
   );
@@ -295,7 +294,6 @@ function image_style_delete_form($form, 
   $form['replacement'] = array(
     '#title' => t('Replacement style'),
     '#type' => 'select',
-    '#required' => FALSE,
     '#options' => $replacement_styles,
     '#empty_option' => t('No replacement, just delete'),
   );
Index: modules/image/image.field.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/image/image.field.inc,v
retrieving revision 1.29
diff -u -p -r1.29 image.field.inc
--- modules/image/image.field.inc	24 Sep 2010 21:36:22 -0000	1.29
+++ modules/image/image.field.inc	29 Sep 2010 22:25:26 -0000
@@ -269,7 +269,6 @@ function image_field_widget_settings_for
   $form['preview_image_style'] = array(
     '#title' => t('Preview image style'),
     '#type' => 'select',
-    '#required' => FALSE,
     '#options' => image_style_options(FALSE),
     '#default_value' => $settings['preview_image_style'],
     '#description' => t('The preview image will be shown while editing the content.'),
@@ -423,7 +422,6 @@ function image_field_formatter_settings_
   $form['image_style'] = array(
     '#title' => t('Image style'),
     '#type' => 'select',
-    '#required' => FALSE,
     '#default_value' => $settings['image_style'],
     '#empty_option' => t('None (original image)'),
     '#options' => $image_styles,
@@ -436,7 +434,6 @@ function image_field_formatter_settings_
   $form['image_link'] = array(
     '#title' => t('Link image to'),
     '#type' => 'select',
-    '#required' => FALSE,
     '#default_value' => $settings['image_link'],
     '#options' => $link_types,
   );
Index: modules/locale/locale.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.admin.inc,v
retrieving revision 1.18
diff -u -p -r1.18 locale.admin.inc
--- modules/locale/locale.admin.inc	24 Sep 2010 21:36:22 -0000	1.18
+++ modules/locale/locale.admin.inc	29 Sep 2010 22:26:33 -0000
@@ -164,6 +164,7 @@ function locale_languages_predefined_for
   );
   $form['language list']['langcode'] = array('#type' => 'select',
     '#title' => t('Language name'),
+    '#required' => TRUE,
     '#default_value' => key($predefined),
     '#options' => $predefined,
     '#description' => t('Use the <em>Custom language</em> section below if your desired language does not appear in this list.'),
@@ -854,7 +855,6 @@ function locale_translation_filter_form(
       $form['filters']['status'][$key] = array(
         '#title' => $filter['title'],
         '#type' => 'select',
-        '#required' => FALSE,
         '#empty_value' => 'all',
         '#empty_option' => $filter['options']['all'],
         '#size' => 0,
@@ -955,6 +955,7 @@ function locale_translate_import_form($f
   );
   $form['import']['langcode'] = array('#type' => 'select',
     '#title' => t('Import into'),
+    '#required' => TRUE,
     '#options' => $languages,
     '#default_value' => $default,
     '#description' => t('Choose the language you want to add strings into. If you choose a language which is not yet set up, it will be added.'),
@@ -1053,6 +1054,7 @@ function locale_translate_export_po_form
   );
   $form['langcode'] = array('#type' => 'select',
     '#title' => t('Language name'),
+    '#required' => TRUE,
     '#options' => $names,
     '#description' => t('Select the language to export in Gettext Portable Object (<em>.po</em>) format.'),
   );
@@ -1390,6 +1392,7 @@ function locale_date_format_form($form, 
     $form['date_formats']['date_format_' . $type] = array(
       '#type' => 'select',
       '#title' => check_plain($type_info['title']),
+      '#required' => TRUE,
       '#attributes' => array('class' => array('date-format')),
       '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
       '#options' => $choices,
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.299
diff -u -p -r1.299 locale.module
--- modules/locale/locale.module	24 Sep 2010 00:37:43 -0000	1.299
+++ modules/locale/locale.module	29 Sep 2010 22:27:13 -0000
@@ -336,6 +336,7 @@ function locale_form_path_admin_form_alt
   $form['language'] = array(
     '#type' => 'select',
     '#title' => t('Language'),
+    '#required' => TRUE,
     '#options' => array(LANGUAGE_NONE => t('All languages')) + locale_language_list('name'),
     '#default_value' => $form['language']['#value'],
     '#weight' => -10,
@@ -392,6 +393,7 @@ function locale_form_node_form_alter(&$f
     $form['language'] = array(
       '#type' => 'select',
       '#title' => t('Language'),
+      '#required' => TRUE,
       '#default_value' => (isset($form['#node']->language) ? $form['#node']->language : ''),
       '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
     );
Index: modules/menu/menu.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v
retrieving revision 1.86
diff -u -p -r1.86 menu.admin.inc
--- modules/menu/menu.admin.inc	29 Sep 2010 01:57:30 -0000	1.86
+++ modules/menu/menu.admin.inc	29 Sep 2010 22:29:29 -0000
@@ -333,6 +333,7 @@ function menu_edit_item($form, &$form_st
   $form['parent'] = array(
     '#type' => 'select',
     '#title' => t('Parent link'),
+    '#required' => TRUE,
     '#default_value' => $default,
     '#options' => $options,
     '#description' => t('The maximum depth for a link and all its children is fixed at !maxdepth. Some menu links may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)),
@@ -679,27 +680,24 @@ function menu_configure() {
 
   $menu_options = menu_get_menus();
 
-  $main = variable_get('menu_main_links_source', 'main-menu');
   $form['menu_main_links_source'] = array(
     '#type' => 'select',
     '#title' => t('Source for the Main links'),
-    '#required' => FALSE,
     '#default_value' => variable_get('menu_main_links_source', 'main-menu'),
     '#empty_option' => t('No Main links'),
     '#options' => $menu_options,
     '#tree' => FALSE,
-    '#description' => t('Select what should be displayed as the Main links (typically at the top of the page).'),
+    '#description' => t('Typically shown at the top of the page.'),
   );
 
   $form['menu_secondary_links_source'] = array(
     '#type' => 'select',
     '#title' => t('Source for the Secondary links'),
-    '#required' => FALSE,
     '#default_value' => variable_get('menu_secondary_links_source', 'user-menu'),
     '#empty_option' => t('No Secondary links'),
     '#options' => $menu_options,
     '#tree' => FALSE,
-    '#description' => t("Select the source for the Secondary links. An advanced option allows you to use the same source for both Main links (currently %main) and Secondary links: if your source menu has two levels of hierarchy, the top level menu links will appear in the Main links, and the children of the active link will appear in the Secondary links." , array('%main' => $main_options[$main])),
+    '#description' => t('Typically shown to complement the Main links near the top of the page. Use the same source as Main links to show the child links of the active Main link.'),
   );
 
   return system_settings_form($form);
Index: modules/menu/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v
retrieving revision 1.233
diff -u -p -r1.233 menu.module
--- modules/menu/menu.module	24 Sep 2010 00:37:43 -0000	1.233
+++ modules/menu/menu.module	29 Sep 2010 22:29:07 -0000
@@ -655,6 +655,7 @@ function menu_form_node_form_alter(&$for
   $form['menu']['link']['parent'] = array(
     '#type' => 'select',
     '#title' => t('Parent item'),
+    '#required' => TRUE,
     '#default_value' => $default,
     '#options' => $options,
     '#attributes' => array('class' => array('menu-parent-select')),
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1303
diff -u -p -r1.1303 node.module
--- modules/node/node.module	29 Sep 2010 14:08:54 -0000	1.1303
+++ modules/node/node.module	29 Sep 2010 22:30:13 -0000
@@ -2070,6 +2070,7 @@ function node_block_configure($delta = '
     $form['node_recent_block_count'] = array(
       '#type' => 'select',
       '#title' => t('Number of recent content items to display'),
+      '#required' => TRUE,
       '#default_value' => variable_get('node_recent_block_count', 10),
       '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
     );
@@ -3600,6 +3601,7 @@ function node_assign_owner_action_form($
     $form['owner_name'] = array(
       '#type' => 'select',
       '#title' => t('Username'),
+      '#required' => TRUE,
       '#default_value' => $owner_name,
       '#options' => $options,
       '#description' => $description,
Index: modules/poll/poll.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v
retrieving revision 1.357
diff -u -p -r1.357 poll.module
--- modules/poll/poll.module	24 Sep 2010 02:05:55 -0000	1.357
+++ modules/poll/poll.module	29 Sep 2010 22:30:25 -0000
@@ -343,6 +343,7 @@ function poll_form($node, &$form_state) 
   $form['settings']['runtime'] = array(
     '#type' => 'select',
     '#title' => t('Poll duration'),
+    '#required' => TRUE,
     '#default_value' => isset($node->runtime) ? $node->runtime : 0,
     '#options' => $duration,
     '#description' => t('After this period, the poll will be closed automatically.'),
Index: modules/search/search.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.admin.inc,v
retrieving revision 1.18
diff -u -p -r1.18 search.admin.inc
--- modules/search/search.admin.inc	28 Sep 2010 02:30:31 -0000	1.18
+++ modules/search/search.admin.inc	29 Sep 2010 22:30:47 -0000
@@ -84,6 +84,7 @@ function search_admin_settings($form) {
   $form['indexing_throttle']['search_cron_limit'] = array(
     '#type' => 'select',
     '#title' => t('Number of items to index per cron run'),
+    '#required' => TRUE,
     '#default_value' => variable_get('search_cron_limit', 100),
     '#options' => $items,
     '#description' => t('The maximum number of items indexed in each pass of a <a href="@cron">cron maintenance task</a>. If necessary, reduce the number of items to prevent timeouts and memory errors while indexing.', array('@cron' => url('admin/reports/status')))
Index: modules/shortcut/shortcut.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/shortcut/shortcut.admin.inc,v
retrieving revision 1.14
diff -u -p -r1.14 shortcut.admin.inc
--- modules/shortcut/shortcut.admin.inc	30 Jun 2010 15:12:59 -0000	1.14
+++ modules/shortcut/shortcut.admin.inc	29 Sep 2010 22:31:00 -0000
@@ -284,6 +284,7 @@ function shortcut_set_customize($form, &
     $form['shortcuts'][$status][$mlid]['status'] = array(
       '#type' => 'select',
       '#title' => t('Status'),
+      '#required' => TRUE,
       '#options' => array('disabled' => t('Disabled'), 'enabled' => t('Enabled')),
       '#default_value' => $status,
       '#attributes' => array('class' => array('shortcut-status-select')),
Index: modules/simpletest/simpletest.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.pages.inc,v
retrieving revision 1.31
diff -u -p -r1.31 simpletest.pages.inc
--- modules/simpletest/simpletest.pages.inc	24 Jul 2010 17:28:26 -0000	1.31
+++ modules/simpletest/simpletest.pages.inc	29 Sep 2010 22:31:21 -0000
@@ -298,6 +298,7 @@ function simpletest_result_form($form, &
   $form['action']['filter'] = array(
     '#type' => 'select',
     '#title' => 'Filter',
+    '#required' => TRUE,
     '#options' => array(
       'all' => t('All (@count)', array('@count' => count($filter['pass']) + count($filter['fail']))),
       'pass' => t('Pass (@count)', array('@count' => count($filter['pass']))),
Index: modules/simpletest/tests/form.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form.test,v
retrieving revision 1.70
diff -u -p -r1.70 form.test
--- modules/simpletest/tests/form.test	28 Sep 2010 02:30:32 -0000	1.70
+++ modules/simpletest/tests/form.test	29 Sep 2010 22:13:57 -0000
@@ -158,14 +158,62 @@ class FormsTestCase extends DrupalWebTes
   function testSelect() {
     $form = $form_state = array();
     $form = form_test_select($form, $form_state);
-    $error = '!name field is required.';
     $this->drupalGet('form-test/select');
 
+    // Verify that the expected options are selected by default.
+    $expected_defaults = array(
+      'select' => 'one',
+      'empty_value' => 'one',
+      'empty_value_one' => 'one',
+      'invalid_default' => '',
+      'invalid_default_optional' => '',
+      'no_default' => '',
+      'no_default_optional' => '',
+      'no_default_empty_option' => '',
+      'no_default_empty_option_optional' => '',
+      'no_default_empty_value' => 0,
+      'no_default_empty_value_one' => 'one',
+      'no_default_empty_value_optional' => 0,
+      'multiple[]' => 'two',
+      'multiple_no_default[]' => NULL,
+      'multiple_no_default_required[]' => NULL,
+    );
+    foreach ($expected_defaults as $key => $value) {
+      // assertFieldByXPath() automatically uses the first available select
+      // option if no option has the "selected" attribute, so we cannot pass
+      // $value here and instead have to retrieve the selected option's value
+      // manually.
+      if (isset($value)) {
+        $xpath = $this->buildXPathQuery('//select[@name=:name]/option[@selected and @value=:value]', array(
+          ':name' => $key,
+          ':value' => $value,
+        ));
+        $this->assertFieldByXPath($xpath, NULL, t('@key: Pre-selected option @value found.', array(
+          '@key' => $key,
+          '@value' => var_export($value, TRUE),
+        )));
+      }
+      else {
+        $xpath = $this->buildXPathQuery('//select[@name=:name]/option[@selected]', array(
+          ':name' => $key,
+        ));
+        $this->assertNoFieldByXPath($xpath, NULL, t('@key: No pre-selected option found.', array(
+          '@key' => $key,
+        )));
+      }
+    }
+
     // Posting without any values should throw validation errors.
+    $error = '!name field is required.';
     $this->drupalPost(NULL, array(), 'Submit');
+    $this->assertNoText(t('An illegal choice has been detected. Please contact the site administrator.'));
     $this->assertNoText(t($error, array('!name' => $form['select']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_required']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_optional']['#title'])));
     $this->assertNoText(t($error, array('!name' => $form['empty_value']['#title'])));
     $this->assertNoText(t($error, array('!name' => $form['empty_value_one']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['invalid_default']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['invalid_default_optional']['#title'])));
     $this->assertText(t($error, array('!name' => $form['no_default']['#title'])));
     $this->assertNoText(t($error, array('!name' => $form['no_default_optional']['#title'])));
     $this->assertText(t($error, array('!name' => $form['no_default_empty_option']['#title'])));
@@ -179,6 +227,7 @@ class FormsTestCase extends DrupalWebTes
 
     // Post values for required fields.
     $edit = array(
+      'invalid_default' => 'three',
       'no_default' => 'three',
       'no_default_empty_option' => 'three',
       'no_default_empty_value' => 'three',
@@ -186,6 +235,7 @@ class FormsTestCase extends DrupalWebTes
       'multiple_no_default_required[]' => 'three',
     );
     $this->drupalPost(NULL, $edit, 'Submit');
+    $this->assertNoText(t('An illegal choice has been detected. Please contact the site administrator.'));
     $values = drupal_json_decode($this->drupalGetContent());
 
     // Verify expected values.
@@ -193,6 +243,8 @@ class FormsTestCase extends DrupalWebTes
       'select' => 'one',
       'empty_value' => 'one',
       'empty_value_one' => 'one',
+      'invalid_default' => 'three',
+      'invalid_default_optional' => '',
       'no_default' => 'three',
       'no_default_optional' => '',
       'no_default_empty_option' => 'three',
Index: modules/simpletest/tests/form_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form_test.module,v
retrieving revision 1.50
diff -u -p -r1.50 form_test.module
--- modules/simpletest/tests/form_test.module	27 Sep 2010 00:53:56 -0000	1.50
+++ modules/simpletest/tests/form_test.module	29 Sep 2010 22:13:58 -0000
@@ -789,19 +789,45 @@ function form_test_select($form, &$form_
     '#title' => '#default_value one',
     '#default_value' => 'one',
   );
+  $form['select_required'] = $base + array(
+    '#title' => '#default_value one, #required',
+    '#required' => TRUE,
+    '#default_value' => 'one',
+  );
+  $form['select_optional'] = $base + array(
+    '#title' => '#default_value one, not #required',
+    '#required' => FALSE,
+    '#default_value' => 'one',
+  );
   $form['empty_value'] = $base + array(
-    '#title' => '#default_value one, #empty_value 0',
+    '#title' => '#default_value one, #required, #empty_value 0',
+    '#required' => TRUE,
     '#default_value' => 'one',
     '#empty_value' => 0,
   );
   $form['empty_value_one'] = $base + array(
-    '#title' => '#default_value = #empty_value',
+    '#title' => '#default_value = #empty_value, #required',
+    '#required' => TRUE,
     '#default_value' => 'one',
     '#empty_value' => 'one',
   );
 
+  $form['invalid_default'] = $base + array(
+    '#title' => 'Invalid #default_value, #required',
+    '#required' => TRUE,
+    '#default_value' => 'invalid',
+    '#description' => 'Should result in #empty_value, since #default_value is not within #options.',
+  );
+  $form['invalid_default_optional'] = $base + array(
+    '#title' => 'Invalid #default_value, not #required',
+    '#required' => FALSE,
+    '#default_value' => 'invalid',
+    '#description' => 'Should result in #empty_value, since #default_value is not within #options.',
+  );
+
   $form['no_default'] = $base + array(
-    '#title' => 'No #default_value',
+    '#title' => 'No #default_value, #required',
+    '#required' => TRUE,
   );
   $form['no_default_optional'] = $base + array(
     '#title' => 'No #default_value, not #required',
@@ -810,7 +836,8 @@ function form_test_select($form, &$form_
   );
 
   $form['no_default_empty_option'] = $base + array(
-    '#title' => 'No #default_value, #empty_option',
+    '#title' => 'No #default_value, #required, #empty_option',
+    '#required' => TRUE,
     '#empty_option' => '- Choose -',
   );
   $form['no_default_empty_option_optional'] = $base + array(
@@ -821,12 +848,14 @@ function form_test_select($form, &$form_
   );
 
   $form['no_default_empty_value'] = $base + array(
-    '#title' => 'No #default_value, #empty_value 0',
+    '#title' => 'No #default_value, #required, #empty_value 0',
+    '#required' => TRUE,
     '#empty_value' => 0,
     '#description' => 'Should never result in 0.',
   );
   $form['no_default_empty_value_one'] = $base + array(
-    '#title' => 'No #default_value, #empty_value one',
+    '#title' => 'No #default_value, #required, #empty_value one',
+    '#required' => TRUE,
     '#empty_value' => 'one',
     '#description' => 'A mistakenly assigned #empty_value contained in #options should not be valid.',
   );
Index: modules/syslog/syslog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/syslog/syslog.module,v
retrieving revision 1.38
diff -u -p -r1.38 syslog.module
--- modules/syslog/syslog.module	26 Sep 2010 23:31:36 -0000	1.38
+++ modules/syslog/syslog.module	29 Sep 2010 22:32:01 -0000
@@ -47,6 +47,7 @@ function syslog_form_system_logging_sett
   if (defined('LOG_LOCAL0')) {
     $form['syslog_facility'] = array(
       '#type'          => 'select',
+      '#required' => TRUE,
       '#title'         => t('Syslog facility'),
       '#default_value' => variable_get('syslog_facility', LOG_LOCAL0),
       '#options'       => syslog_facility_list(),
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.310
diff -u -p -r1.310 system.admin.inc
--- modules/system/system.admin.inc	28 Sep 2010 02:30:32 -0000	1.310
+++ modules/system/system.admin.inc	29 Sep 2010 22:33:52 -0000
@@ -329,6 +329,7 @@ function system_themes_admin_form($form,
   );
   $form['admin_theme']['admin_theme'] = array(
     '#type' => 'select',
+    '#required' => TRUE,
     '#options' => array(0 => t('Default theme')) + $theme_options,
     '#title' => t('Administration theme'),
     '#description' => t('Choose "Default theme" to always use the same theme as the rest of the site.'),
@@ -1545,6 +1546,7 @@ function system_site_information_setting
   );
   $form['front_page']['default_nodes_main'] = array(
     '#type' => 'select', '#title' => t('Number of posts on front page'),
+    '#required' => TRUE,
     '#default_value' => variable_get('default_nodes_main', 10),
     '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)),
     '#description' => t('The maximum number of posts displayed on overview pages such as the front page.')
@@ -1911,6 +1913,7 @@ function system_rss_feeds_settings() {
   $form['feed_default_items'] = array(
     '#type' => 'select',
     '#title' => t('Number of items in each feed'),
+    '#required' => TRUE,
     '#default_value' => variable_get('feed_default_items', 10),
     '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)),
     '#description' => t('Default number of items to include in each feed.')
@@ -1918,6 +1921,7 @@ function system_rss_feeds_settings() {
   $form['feed_item_length'] = array(
     '#type' => 'select',
     '#title' => t('Feed content'),
+    '#required' => TRUE,
     '#default_value' => variable_get('feed_item_length', 'fulltext'),
     '#options' => array('title' => t('Titles only'), 'teaser' => t('Titles plus teaser'), 'fulltext' => t('Full text')),
     '#description' => t('Global setting for the default display of content items in each feed.')
@@ -1958,6 +1962,7 @@ function system_regional_settings() {
   $form['locale']['date_first_day'] = array(
     '#type' => 'select',
     '#title' => t('First day of week'),
+    '#required' => TRUE,
     '#default_value' => variable_get('date_first_day', 0),
     '#options' => array(0 => t('Sunday'), 1 => t('Monday'), 2 => t('Tuesday'), 3 => t('Wednesday'), 4 => t('Thursday'), 5 => t('Friday'), 6 => t('Saturday')),
   );
@@ -1970,6 +1975,7 @@ function system_regional_settings() {
   $form['timezone']['date_default_timezone'] = array(
     '#type' => 'select',
     '#title' => t('Default time zone'),
+    '#required' => TRUE,
     '#default_value' => variable_get('date_default_timezone', date_default_timezone_get()),
     '#options' => $zones,
   );
@@ -3013,6 +3019,7 @@ function system_actions_manage_form($for
   );
   $form['parent']['action'] = array(
     '#type' => 'select',
+    '#required' => TRUE,
     '#options' => $options,
   );
   $form['parent']['actions'] = array('#type' => 'actions');
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.967
diff -u -p -r1.967 system.module
--- modules/system/system.module	29 Sep 2010 16:06:11 -0000	1.967
+++ modules/system/system.module	29 Sep 2010 22:13:58 -0000
@@ -399,11 +399,7 @@ function system_element_info() {
   );
   $types['select'] = array(
     '#input' => TRUE,
-    // In order to be able to determine whether a select list needs an empty
-    // default option, #required has to be NULL by default, as form_builder()
-    // preemptively sets #required to FALSE for all elements.
-    // @see form_process_select()
-    '#required' => NULL,
+    '#empty_value' => '',
     '#multiple' => FALSE,
     '#process' => array('form_process_select', 'ajax_process_form'),
     '#theme' => 'select',
Index: modules/trigger/trigger.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/trigger/trigger.admin.inc,v
retrieving revision 1.28
diff -u -p -r1.28 trigger.admin.inc
--- modules/trigger/trigger.admin.inc	24 Sep 2010 21:36:22 -0000	1.28
+++ modules/trigger/trigger.admin.inc	29 Sep 2010 22:34:36 -0000
@@ -179,7 +179,9 @@ function trigger_assign_form($form, $for
   if (count($options) != 0) {
     $form[$hook]['parent']['aid'] = array(
       '#type' => 'select',
+      '#required' => TRUE,
       '#options' => $options,
+      '#empty_option' => t('- Choose an action -'),
     );
     $form[$hook]['parent']['submit'] = array(
       '#type' => 'submit',
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.1204
diff -u -p -r1.1204 user.module
--- modules/user/user.module	24 Sep 2010 00:37:45 -0000	1.1204
+++ modules/user/user.module	29 Sep 2010 22:35:08 -0000
@@ -1291,6 +1291,7 @@ function user_block_configure($delta = '
       $form['user_block_whois_new_count'] = array(
         '#type' => 'select',
         '#title' => t('Number of users to display'),
+        '#required' => TRUE,
         '#default_value' => variable_get('user_block_whois_new_count', 5),
         '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
       );
