Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.411
diff -u -p -r1.411 form.inc
--- includes/form.inc	1 Dec 2009 16:28:57 -0000	1.411
+++ includes/form.inc	1 Dec 2009 22:17:19 -0000
@@ -870,7 +870,7 @@ function _form_validate(&$elements, &$fo
       // length if it's a string, and the item count if it's an array.
       // An unchecked checkbox has a #value of numeric 0, different than string
       // '0', which could be a valid value.
-      if ($elements['#required'] && (!count($elements['#value']) || (is_string($elements['#value']) && strlen(trim($elements['#value'])) == 0) || $elements['#value'] === 0)) {
+      if ($elements['#required'] && !_form_validate_skip($elements, $form_state) && (!count($elements['#value']) || (is_string($elements['#value']) && strlen(trim($elements['#value'])) == 0) || $elements['#value'] === 0)) {
         form_error($elements, $t('!name field is required.', array('!name' => $elements['#title'])));
       }
 
@@ -908,7 +908,7 @@ function _form_validate(&$elements, &$fo
     }
     // Call any element-specific validators. These must act on the element
     // #value data.
-    elseif (isset($elements['#element_validate'])) {
+    elseif (isset($elements['#element_validate']) && !_form_validate_skip($elements, $form_state)) {
       foreach ($elements['#element_validate'] as $function) {
         if (function_exists($function))  {
           $function($elements, $form_state, $form_state['complete form']);
@@ -920,6 +920,45 @@ function _form_validate(&$elements, &$fo
 }
 
 /**
+ * Check if an element's validation can be skipped.
+ *
+ * This is used to skip validation of #required and #element_validate
+ * properties, but never properties that are enforced by HTML, such as
+ * #maxlength or #options.
+ *
+ * @param $element
+ *   The element whose parents will be checked to determine if this element's
+ *   validation should be skipped.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. The
+ *   'clicked_button' property will be checked to determine which elements
+ *   should be validated.
+ *
+ * @return
+ *   Boolean TRUE if the element should not be validated. FALSE if the element
+ *   should be validated.
+ */
+function _form_validate_skip($element, $form_state) {
+  $skip = FALSE;
+  // Check whether the pressed button defined form element parents to validate.
+  if (!isset($form_state['clicked_button']['#validate_section'])) {
+    return $skip;
+  }
+  // Iterate over the parents of $element and compare them with the parents
+  // defined in the pressed button. If this element's parents are not contained
+  // in the defined parents, then validation for this element can be skipped.
+  $parents = $form_state['clicked_button']['#validate_section'];
+  foreach ($parents as $key => $parent) {
+    if ($element['#parents'][$key] != $parent) {
+      $skip = TRUE;
+      break;
+    }
+  }
+
+  return $skip;
+}
+
+/**
  * A helper function used to execute custom validation and submission
  * handlers for a given form. Button-specific handlers are checked
  * first. If none exist, the function falls back to form-level handlers.
Index: modules/field/field.form.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v
retrieving revision 1.36
diff -u -p -r1.36 field.form.inc
--- modules/field/field.form.inc	1 Dec 2009 03:07:33 -0000	1.36
+++ modules/field/field.form.inc	1 Dec 2009 22:01:58 -0000
@@ -214,7 +214,8 @@ function field_multiple_value_form($fiel
           '#name' => $field_name . '_add_more',
           '#value' => t('Add another item'),
           '#attributes' => array('class' => array('field-add-more-submit')),
-          // Submit callback for disabled JavaScript.
+          '#validate' => array(),
+          '#validate_section' => array($field_name),
           '#submit' => array('field_add_more_submit'),
           '#ajax' => array(
             'callback' => 'field_add_more_js',
Index: modules/poll/poll.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v
retrieving revision 1.326
diff -u -p -r1.326 poll.module
--- modules/poll/poll.module	1 Dec 2009 13:14:42 -0000	1.326
+++ modules/poll/poll.module	1 Dec 2009 22:00:07 -0000
@@ -273,7 +273,9 @@ function poll_form($node, &$form_state) 
     '#value' => t('More choices'),
     '#description' => t("If the amount of boxes above isn't enough, click here to add more choices."),
     '#weight' => 1,
-    '#submit' => array('poll_more_choices_submit'), // If no javascript action.
+    '#validate' => array(),
+    '#validate_section' => array('choice_wrapper'),
+    '#submit' => array('poll_more_choices_submit'),
     '#ajax' => array(
       'callback' => 'poll_choice_js',
       'wrapper' => 'poll-choices',
