diff --git a/includes/form.inc b/includes/form.inc
index e112773914c5ed13b6abcceeb046ae6ad99ddd25..170cfc35b263246b5a686211f58a76db9ea46ff1 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -111,7 +111,8 @@ function drupal_get_form($form_id, &$form, $callback = NULL) {
     $function($form_id, $form);
   }
 
-  $form = form_builder($form_id, $form);
+  form_builder($form_id, $form);
+
   if (!empty($_POST['edit']) && (($_POST['edit']['form_id'] == $form_id) || ($_POST['edit']['form_id'] == $callback))) {
     drupal_validate_form($form_id, $form, $callback);
     if ($form_submitted && !form_get_errors()) {
@@ -157,15 +158,6 @@ function drupal_get_form($form_id, &$form, $callback = NULL) {
 function drupal_validate_form($form_id, &$form, $callback = NULL) {
   global $form_values;
 
-  // we need a copy of form_values otherwise foreach falls into an infite loop
-  $copy = (array)$form_values;
-  // this loop breaks the references in form_values thus makes it impossible for 
-  // validate functions to modify the $form_values array
-  foreach ($copy as $k => $v) {
-    unset($form_values[$k]);
-    $form_values[$k] = $v;
-  }
-
   if (isset($form['#token'])) {
     if ($form_values['form_token'] != md5(session_id() . $form['#token'] . variable_get('drupal_private_key', ''))) {
       // setting this error will cause the form to fail validation
@@ -316,7 +308,7 @@ function form_error(&$element, $message = '') {
  * @param $form
  *   An associative array containing the structure of the form.
  */
-function form_builder($form_id, $form) {
+function form_builder($form_id, &$form) {
   global $form_values;
   global $form_submitted;
   /* Use element defaults */
@@ -425,7 +417,7 @@ function form_builder($form_id, $form) {
     if (!isset($form[$key]['#weight'])) {
       $form[$key]['#weight'] = $count/1000;
     }
-    $form[$key] = form_builder($form_id, $form[$key]);
+    form_builder($form_id, $form[$key]);
     $count++;
   }
 
@@ -434,8 +426,6 @@ function form_builder($form_id, $form) {
     $form = $function($form, $form_values);
     $form['#after_build_done'] = TRUE;
   }
-
-  return $form;
 }
 
 /**
diff --git a/modules/poll.module b/modules/poll.module
index 1087f742fb57debe537678c94236be53fdaf5d4a..7c16ee3521c30c0c5121c8ab42a98dbfb60ff042 100644
--- a/modules/poll.module
+++ b/modules/poll.module
@@ -133,7 +133,7 @@ function poll_form(&$node) {
 
   $form['choice']['choices'] = array('#type' => 'hidden', '#default_value' => max(2, count($node->choice) ? count($node->choice) : 5));
   $form['choice']['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#default_value' => 0, '#description' => t("If the amount of boxes above isn't enough, check this box and click the Preview button below to add some more."), '#weight' => 1);
-  $form['choice'] = form_builder('poll_node_form', $form['choice']);
+  form_builder('poll_node_form', $form['choice']);
   if ($form['choice']['morechoices']['#value']) {
     $form['choice']['morechoices']['#value'] = 0;
     $form['choice']['choices']['#value'] *= 2;
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index 1087f742fb57debe537678c94236be53fdaf5d4a..7c16ee3521c30c0c5121c8ab42a98dbfb60ff042 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -133,7 +133,7 @@ function poll_form(&$node) {
 
   $form['choice']['choices'] = array('#type' => 'hidden', '#default_value' => max(2, count($node->choice) ? count($node->choice) : 5));
   $form['choice']['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#default_value' => 0, '#description' => t("If the amount of boxes above isn't enough, check this box and click the Preview button below to add some more."), '#weight' => 1);
-  $form['choice'] = form_builder('poll_node_form', $form['choice']);
+  form_builder('poll_node_form', $form['choice']);
   if ($form['choice']['morechoices']['#value']) {
     $form['choice']['morechoices']['#value'] = 0;
     $form['choice']['choices']['#value'] *= 2;
diff --git a/modules/upload.module b/modules/upload.module
index 46d582400d48cb97d2981ad617193e1f064140ed..50b249ede4d320b5b5c00bb1a7ff98f072512e8c 100644
--- a/modules/upload.module
+++ b/modules/upload.module
@@ -640,7 +640,7 @@ function upload_js() {
   _upload_validate($node);
 
   $form = _upload_form($node);
-  $form = form_builder('upload_js', $form);
+  form_builder('upload_js', $form);
   $output = theme('status_messages') . form_render($form);
 
   // We send the updated file attachments form.
diff --git a/modules/upload/upload.module b/modules/upload/upload.module
index 46d582400d48cb97d2981ad617193e1f064140ed..50b249ede4d320b5b5c00bb1a7ff98f072512e8c 100644
--- a/modules/upload/upload.module
+++ b/modules/upload/upload.module
@@ -640,7 +640,7 @@ function upload_js() {
   _upload_validate($node);
 
   $form = _upload_form($node);
-  $form = form_builder('upload_js', $form);
+  form_builder('upload_js', $form);
   $output = theme('status_messages') . form_render($form);
 
   // We send the updated file attachments form.