diff --git a/includes/form.inc b/includes/form.inc
index 2a467076a6b853b1a8df98d990b8089b9e594326..9c1062ef40cccaef144a23ff468bf2a6bd86de47 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -716,6 +716,8 @@ function form_error(&$element, $message = '') {
  *   $_POST data.
  */
 function form_builder($form_id, $form, &$form_state) {
+  static $complete_form;
+
   // Initialize as unprocessed.
   $form['#processed'] = FALSE;
 
@@ -725,12 +727,15 @@ function form_builder($form_id, $form, &$form_state) {
     $form += $info;
   }
 
-  if (isset($form['#type']) && $form['#type'] == 'form' && !empty($form['#programmed'])) {
-    $form_state['submitted'] = TRUE;
+  if (isset($form['#type']) && $form['#type'] == 'form') {
+    $complete_form = $form;
+    if (!empty($form['#programmed'])) {
+      $form_state['submitted'] = TRUE;
+    }
   }
 
   if (isset($form['#input']) && $form['#input']) {
-    _form_builder_handle_input_element($form_id, $form, $form_state);
+    _form_builder_handle_input_element($form_id, $form, $form_state, $complete_form);
   }
   $form['#defaults_loaded'] = TRUE;
 
@@ -796,7 +801,7 @@ function form_builder($form_id, $form, &$form_state) {
  * can be processed and rendered. Also, execute any #process handlers
  * attached to a specific element.
  */
-function _form_builder_handle_input_element($form_id, &$form, &$form_state) {
+function _form_builder_handle_input_element($form_id, &$form, &$form_state, $complete_form) {
   if (!isset($form['#name'])) {
     $name = array_shift($form['#parents']);
     $form['#name'] = $name;
@@ -886,7 +891,7 @@ function _form_builder_handle_input_element($form_id, &$form, &$form_state) {
   if (isset($form['#process']) && !$form['#processed']) {
     foreach ($form['#process'] as $process) {
       if (function_exists($process)) {
-        $args = array_merge(array($form), array(isset($edit) ? $edit : NULL), array($form_state));
+        $args = array_merge(array($form), array(isset($edit) ? $edit : NULL), array($form_state), array($complete_form));
         $form = call_user_func_array($process, $args);
       }
     }