Index: includes/ajax.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/ajax.inc,v
retrieving revision 1.33
diff -u -p -r1.33 ajax.inc
--- includes/ajax.inc	27 Sep 2010 00:53:55 -0000	1.33
+++ includes/ajax.inc	2 Oct 2010 17:53:25 -0000
@@ -436,10 +436,10 @@ function ajax_footer() {
  *   None. Additional code is added to the header of the page using
  *   drupal_add_js().
  */
-function ajax_process_form($element, &$form_state) {
+function ajax_process_form(&$element, &$form_state) {
   // Nothing to do if there is neither a callback nor a path.
   if (!(isset($element['#ajax']['callback']) || isset($element['#ajax']['path']))) {
-    return $element;
+    return;
   }
 
   // Add a reasonable default event handler if none was specified.
@@ -470,7 +470,7 @@ function ajax_process_form($element, &$f
         break;
 
       default:
-        return $element;
+        return;
     }
   }
 
@@ -549,7 +549,6 @@ function ajax_process_form($element, &$f
 
     $form_state['cache'] = TRUE;
   }
-  return $element;
 }
 
 /**
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.498
diff -u -p -r1.498 form.inc
--- includes/form.inc	1 Oct 2010 22:28:55 -0000	1.498
+++ includes/form.inc	2 Oct 2010 17:54:02 -0000
@@ -1582,7 +1582,7 @@ function form_error(&$element, $message 
  *   was clicked when the form was submitted, as well as the sanitized
  *   $_POST data.
  */
-function form_builder($form_id, $element, &$form_state) {
+function form_builder($form_id, &$element, &$form_state) {
   // Initialize as unprocessed.
   $element['#processed'] = FALSE;
 
@@ -1609,8 +1609,11 @@ function form_builder($form_id, $element
       $element['#action'] = str_replace('http://', 'https://', $base_root) . $element['#action'];
     }
 
-    // Store a complete copy of the form in form_state prior to building the form.
-    $form_state['complete form'] = $element;
+    // Store a reference to the complete form in $form_state prior to building
+    // the form. This allows advanced #process and #after_build callbacks to
+    // perform changes elsewhere in the form.
+    $form_state['complete form'] = &$element;
+
     // Set a flag if we have a correct form submission. This is always TRUE for
     // programmed forms coming from drupal_form_submit(), or if the form_id coming
     // from the POST data is set and matches the current form_id.
@@ -1633,7 +1636,12 @@ function form_builder($form_id, $element
   // checkboxes and files.
   if (isset($element['#process']) && !$element['#processed']) {
     foreach ($element['#process'] as $process) {
-      $element = $process($element, $form_state, $form_state['complete form']);
+      // Processing elements by reference is preferred to returning a new copy.
+      // @todo D8: Always pass by reference only.
+      $result = $process($element, $form_state, $form_state['complete form']);
+      if (isset($result)) {
+        $element = &$result;
+      }
     }
     $element['#processed'] = TRUE;
   }
@@ -1697,7 +1705,12 @@ function form_builder($form_id, $element
   // after normal input parsing has been completed.
   if (isset($element['#after_build']) && !isset($element['#after_build_done'])) {
     foreach ($element['#after_build'] as $function) {
-      $element = $function($element, $form_state);
+      // Processing elements by reference is preferred to returning a new copy.
+      // @todo D8: Always pass by reference only.
+      $result = $function($element, $form_state);
+      if (isset($result)) {
+        $element = &$result;
+      }
     }
     $element['#after_build_done'] = TRUE;
   }
@@ -1756,9 +1769,6 @@ function form_builder($form_id, $element
       // @todo Legacy support. Remove in Drupal 8.
       $form_state['clicked_button'] = $form_state['triggering_element'];
     }
-
-    // Update the copy of the complete form for usage in validation handlers.
-    $form_state['complete form'] = $element;
   }
   return $element;
 }
@@ -2586,7 +2596,7 @@ function theme_radios($variables) {
 /**
  * Expand a password_confirm field into two text boxes.
  */
-function form_process_password_confirm($element) {
+function form_process_password_confirm(&$element) {
   $element['pass1'] =  array(
     '#type' => 'password',
     '#title' => t('Password'),
@@ -2607,8 +2617,6 @@ function form_process_password_confirm($
   if (isset($element['#size'])) {
     $element['pass1']['#size'] = $element['pass2']['#size'] = $element['#size'];
   }
-
-  return $element;
 }
 
 /**
@@ -2655,7 +2663,7 @@ function theme_date($variables) {
 /**
  * Roll out a single date element.
  */
-function form_process_date($element) {
+function form_process_date(&$element) {
   // Default to current date
   if (empty($element['#value'])) {
     $element['#value'] = array(
@@ -2699,8 +2707,6 @@ function form_process_date($element) {
       '#options' => $options,
     );
   }
-
-  return $element;
 }
 
 /**
@@ -2749,7 +2755,7 @@ function weight_value(&$form) {
  * Roll out a single radios element to a list of radios,
  * using the options array as index.
  */
-function form_process_radios($element) {
+function form_process_radios(&$element) {
   if (count($element['#options']) > 0) {
     foreach ($element['#options'] as $key => $choice) {
       if (!isset($element[$key])) {
@@ -2769,7 +2775,6 @@ function form_process_radios($element) {
       }
     }
   }
-  return $element;
 }
 
 /**
@@ -2842,7 +2847,7 @@ function form_pre_render_conditional_for
   return $element;
 }
 
-function form_process_checkboxes($element) {
+function form_process_checkboxes(&$element) {
   $value = is_array($element['#value']) ? $element['#value'] : array();
   $element['#tree'] = TRUE;
   if (count($element['#options']) > 0) {
@@ -2863,7 +2868,6 @@ function form_process_checkboxes($elemen
       }
     }
   }
-  return $element;
 }
 
 /**
@@ -2878,9 +2882,8 @@ function form_process_checkboxes($elemen
  * @return
  *   The processed element.
  */
-function form_process_actions($element, &$form_state) {
+function form_process_actions(&$element, &$form_state) {
   $element['#attributes']['class'][] = 'form-actions';
-  return $element;
 }
 
 /**
@@ -2894,12 +2897,11 @@ function form_process_actions($element, 
  * @return
  *   The processed element.
  */
-function form_process_container($element, &$form_state) {
+function form_process_container(&$element, &$form_state) {
   // Generate the ID of the element if it's not explicitly given.
   if (!isset($element['#id'])) {
     $element['#id'] = drupal_html_id(implode('-', $element['#parents']) . '-wrapper');
   }
-  return $element;
 }
 
 /**
@@ -2998,8 +3000,7 @@ function theme_tableselect($variables) {
  * @return
  *   The processed element.
  */
-function form_process_tableselect($element) {
-
+function form_process_tableselect(&$element) {
   if ($element['#multiple']) {
     $value = is_array($element['#value']) ? $element['#value'] : array();
   }
@@ -3053,7 +3054,6 @@ function form_process_tableselect($eleme
   else {
     $element['#value'] = array();
   }
-  return $element;
 }
 
 /**
@@ -3101,8 +3101,6 @@ function form_process_fieldset(&$element
       $element['#attributes']['class'][] = 'collapsed';
     }
   }
-
-  return $element;
 }
 
 /**
@@ -3172,7 +3170,7 @@ function form_pre_render_fieldset($eleme
  * @return
  *   The processed element.
  */
-function form_process_vertical_tabs($element, &$form_state) {
+function form_process_vertical_tabs(&$element, &$form_state) {
   // Inject a new fieldset as child, so that form_process_fieldset() processes
   // this fieldset like any other fieldset.
   $element['group'] = array(
@@ -3194,8 +3192,6 @@ function form_process_vertical_tabs($ele
     '#default_value' => $element['#default_tab'],
     '#attributes' => array('class' => array('vertical-tabs-active-tab')),
   );
-
-  return $element;
 }
 
 /**
@@ -3415,7 +3411,7 @@ function theme_password($variables) {
 /**
  * Expand weight elements into selects.
  */
-function form_process_weight($element) {
+function form_process_weight(&$element) {
   for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {
     $weights[$n] = $n;
   }
@@ -3423,7 +3419,6 @@ function form_process_weight($element) {
   $element['#type'] = 'select';
   $element['#is_weight'] = TRUE;
   $element += element_info('select');
-  return $element;
 }
 
 /**
Index: modules/field/field.form.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v
retrieving revision 1.50
diff -u -p -r1.50 field.form.inc
--- modules/field/field.form.inc	17 Jun 2010 13:44:45 -0000	1.50
+++ modules/field/field.form.inc	2 Oct 2010 17:53:25 -0000
@@ -305,12 +305,10 @@ function theme_field_multiple_value_form
  * @see field_default_form_errors()
  * @see field_add_more_js()
  */
-function field_form_element_after_build($element, &$form_state) {
+function field_form_element_after_build(&$element, &$form_state) {
   $field_name = $element['#field_name'];
   $langcode = $element['#language'];
   $form_state['field'][$field_name][$langcode]['array_parents'] = $element['#array_parents'];
-
-  return $element;
 }
 
 /**
Index: modules/file/file.field.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/file/file.field.inc,v
retrieving revision 1.35
diff -u -p -r1.35 file.field.inc
--- modules/file/file.field.inc	1 Oct 2010 01:32:59 -0000	1.35
+++ modules/file/file.field.inc	2 Oct 2010 17:53:25 -0000
@@ -607,7 +607,7 @@ function file_field_widget_value($elemen
  *
  * Expands the file_generic type to include the description and display fields.
  */
-function file_field_widget_process($element, &$form_state, $form) {
+function file_field_widget_process(&$element, &$form_state, $form) {
   $item = $element['#value'];
   $item['fid'] = $element['fid']['#value'];
 
@@ -658,8 +658,6 @@ function file_field_widget_process($elem
     }
     unset($element['#prefix'], $element['#suffix']);
   }
-
-  return $element;
 }
 
 /**
@@ -668,7 +666,7 @@ function file_field_widget_process($elem
  * Adds the weight field to each row so it can be ordered and adds a new AJAX
  * wrapper around the entire group so it can be replaced all at once.
  */
-function file_field_widget_process_multiple($element, &$form_state, $form) {
+function file_field_widget_process_multiple(&$element, &$form_state, $form) {
   $element_children = element_children($element, TRUE);
   $count = count($element_children);
 
@@ -694,8 +692,6 @@ function file_field_widget_process_multi
   // Add a new wrapper around all the elements for AJAX replacement.
   $element['#prefix'] = '<div id="' . $element['#id'] . '-ajax-wrapper">';
   $element['#suffix'] = '</div>';
-
-  return $element;
 }
 
 /**
Index: modules/file/file.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/file/file.module,v
retrieving revision 1.41
diff -u -p -r1.41 file.module
--- modules/file/file.module	1 Oct 2010 01:32:59 -0000	1.41
+++ modules/file/file.module	2 Oct 2010 17:53:25 -0000
@@ -365,7 +365,7 @@ function file_file_delete($file) {
  * Expands the file type to include Upload and Remove buttons, as well as
  * support for a default value.
  */
-function file_managed_file_process($element, &$form_state, $form) {
+function file_managed_file_process(&$element, &$form_state, $form) {
   $fid = isset($element['#value']['fid']) ? $element['#value']['fid'] : 0;
 
   // Set some default element properties.
@@ -467,8 +467,6 @@ function file_managed_file_process($elem
   // Prefix and suffix used for AJAX replacement.
   $element['#prefix'] = '<div id="' . $element['#id'] . '-ajax-wrapper">';
   $element['#suffix'] = '</div>';
-
-  return $element;
 }
 
 /**
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	2 Oct 2010 17:53:25 -0000
@@ -757,7 +757,7 @@ function check_markup($text, $format_id 
  * @return
  *   The expanded element.
  */
-function filter_process_format($element) {
+function filter_process_format(&$element) {
   global $user;
 
   // Ensure that children appear as subkeys of this element.
@@ -883,8 +883,6 @@ function filter_process_format($element)
       }
     }
   }
-
-  return $element;
 }
 
 /**
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	2 Oct 2010 17:53:25 -0000
@@ -323,7 +323,7 @@ function image_field_widget_form(&$form,
  *
  * Expands the image_image type to include the alt and title fields.
  */
-function image_field_widget_process($element, &$form_state, $form) {
+function image_field_widget_process(&$element, &$form_state, $form) {
   $item = $element['#value'];
   $item['fid'] = $element['fid']['#value'];
 
@@ -362,8 +362,6 @@ function image_field_widget_process($ele
     '#weight' => -1,
     '#access' => (bool) $item['fid'] && $settings['title_field'],
   );
-
-  return $element;
 }
 
 /**
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.969
diff -u -p -r1.969 system.module
--- modules/system/system.module	1 Oct 2010 18:37:23 -0000	1.969
+++ modules/system/system.module	2 Oct 2010 17:53:25 -0000
@@ -2080,10 +2080,10 @@ function system_admin_menu_block($item) 
  * @param $form_element
  *   The form element containing the name of the directory to check.
  */
-function system_check_directory($form_element) {
+function system_check_directory(&$form_element) {
   $directory = $form_element['#value'];
   if (strlen($directory) == 0) {
-    return $form_element;
+    return;
   }
 
   if (!is_dir($directory) && !drupal_mkdir($directory, NULL, TRUE)) {
@@ -2107,8 +2107,6 @@ function system_check_directory($form_el
       file_create_htaccess($directory);
     }
   }
-
-  return $form_element;
 }
 
 /**
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	2 Oct 2010 17:53:25 -0000
@@ -3340,7 +3340,7 @@ function _user_mail_notify($op, $account
  *
  * @see system_element_info()
  */
-function user_form_process_password_confirm($element) {
+function user_form_process_password_confirm(&$element) {
   global $user;
 
   $js_settings = array(
@@ -3371,8 +3371,6 @@ function user_form_process_password_conf
     $already_added = TRUE;
     $element['#attached']['js'][] = array('data' => $js_settings, 'type' => 'setting');
   }
-
-  return $element;
 }
 
 /**
