Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.36
diff -u -p -r1.36 install.php
--- install.php	29 Jan 2007 12:34:29 -0000	1.36
+++ install.php	31 Jan 2007 18:12:43 -0000
@@ -284,7 +284,8 @@ function install_settings_form($profile,
     );
 
     $form['save'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('install_settings_form_submit' => array()),
       '#value' => st('Save configuration'),
     );
 
@@ -425,7 +426,7 @@ function install_select_profile_form($pr
     );
   }
   $form['submit'] =  array(
-    '#type' => 'submit',
+    '#type' => 'button',
     '#value' => st('Save configuration'),
   );
   return $form;
@@ -481,7 +482,7 @@ function install_select_locale_form($loc
     );
   }
   $form['submit'] =  array(
-    '#type' => 'submit',
+    '#type' => 'button',
     '#value' => st('Save configuration'),
   );
   return $form;
Index: update.php
===================================================================
RCS file: /cvs/drupal/drupal/update.php,v
retrieving revision 1.211
diff -u -p -r1.211 update.php
--- update.php	25 Dec 2006 21:22:03 -0000	1.211
+++ update.php	31 Jan 2007 18:12:43 -0000
@@ -369,7 +369,7 @@ function update_script_selection_form() 
     '#attributes' => array('id' => 'edit-has_js'),
   );
   $form['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
     '#value' => 'Update',
   );
   return $form;
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.615
diff -u -p -r1.615 common.inc
--- includes/common.inc	31 Jan 2007 15:49:22 -0000	1.615
+++ includes/common.inc	31 Jan 2007 18:12:45 -0000
@@ -639,7 +639,7 @@ function locale_initialize() {
  *   }
  *
  *   $form['submit'] = array(
- *     '#type' => 'submit',
+ *     '#type' => 'button',
  *     '#value' => t('Log in'),
  *   );
  * @endcode
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.177
diff -u -p -r1.177 form.inc
--- includes/form.inc	31 Jan 2007 15:49:22 -0000	1.177
+++ includes/form.inc	31 Jan 2007 18:12:46 -0000
@@ -114,7 +114,6 @@ function _drupal_clean_form_sessions() {
   }
 }
 
-
 /**
  * Retrieves a form using a form_id, populates it with $form_values,
  * processes it, and returns any validation errors encountered. This
@@ -237,16 +236,15 @@ function drupal_retrieve_form($form_id) 
  *   The path to redirect the user to upon completion.
  */
 function drupal_process_form($form_id, &$form) {
-  global $form_values, $form_submitted, $user, $form_button_counter;
+  global $form_values, $submit_callback, $user;
   static $saved_globals = array();
   // In some scenarios, this function can be called recursively. Pushing any pre-existing
   // $form_values and form submission data lets us start fresh without clobbering work done
   // in earlier recursive calls.
-  array_push($saved_globals, array($form_values, $form_submitted, $form_button_counter));
+  array_push($saved_globals, array($form_values, $submit_callback));
 
   $form_values = array();
-  $form_submitted = FALSE;
-  $form_button_counter = array(0, 0);
+  $form_callback = array();
 
   drupal_prepare_form($form_id, $form);
   if (($form['#programmed']) || (!empty($_POST) && (($_POST['form_id'] == $form_id) || ($_POST['form_id'] == $form['#base'])))) {
@@ -254,8 +252,8 @@ function drupal_process_form($form_id, &
     // IE does not send a button value when there is only one submit button (and no non-submit buttons)
     // and you submit by pressing enter.
     // In that case we accept a submission without button values.
-    if ((($form['#programmed']) || $form_submitted || (!$form_button_counter[0] && $form_button_counter[1])) && !form_get_errors()) {
-      $redirect = drupal_submit_form($form_id, $form);
+    if ((($form['#programmed']) || $submit_callback) && !form_get_errors()) {
+      $redirect = drupal_submit_form($form_id, $form, $submit_callback);
       if (!$form['#programmed']) {
         drupal_redirect_form($form, $redirect);
       }
@@ -264,7 +262,7 @@ function drupal_process_form($form_id, &
 
   // We've finished calling functions that alter the global values, so we can
   // restore the ones that were there before this function was called.
-  list($form_values, $form_submitted, $form_button_counter) = array_pop($saved_globals);
+  list($form_values, $submit_callback) = array_pop($saved_globals);
   if (isset($redirect)) {
     return $redirect;
   }
@@ -350,16 +348,6 @@ function drupal_prepare_form($form_id, &
     }
   }
 
-  if (!isset($form['#submit'])) {
-    if (function_exists($form_id .'_submit')) {
-      // We set submit here so that it can be altered.
-      $form['#submit'] = array($form_id .'_submit' => array());
-    }
-    elseif (function_exists($base .'_submit')) {
-      $form['#submit'] = array($base .'_submit' => array());
-    }
-  }
-
   foreach (module_implements('form_alter') as $module) {
     $function = $module .'_form_alter';
     $function($form_id, $form);
@@ -410,25 +398,26 @@ function drupal_validate_form($form_id, 
  *   theming, and hook_form_alter functions.
  * @param $form
  *   An associative array containing the structure of the form.
+ * @param $submit_callback
+ *   An array of callback functions.
  * @return
  *   A string containing the path of the page to display when processing
  *   is complete.
  *
  */
-function drupal_submit_form($form_id, $form) {
+function drupal_submit_form($form_id, $form, $submit_callback) {
   global $form_values;
   $default_args = array($form_id, &$form_values);
 
-  if (isset($form['#submit'])) {
-    foreach ($form['#submit'] as $function => $args) {
-      if (function_exists($function)) {
-        $args = array_merge($default_args, (array) $args);
-        // Since we can only redirect to one page, only the last redirect
-        // will work.
-        $redirect = call_user_func_array($function, $args);
-        if (isset($redirect)) {
-          $goto = $redirect;
-        }
+  // Loop through the callbacks for a given submit operation, and execute
+  // each one if it exists.
+  foreach ($submit_callback as $function => $args) {
+    if (function_exists($function)) {
+      $args = array_merge($default_args, (array) $args);
+      // Since we can only redirect to one page, only the last redirect will work
+      $redirect = call_user_func_array($function, $args);
+      if (isset($redirect)) {
+        $goto = $redirect;
       }
     }
   }
@@ -642,7 +631,7 @@ function form_error(&$element, $message 
  *   An associative array containing the structure of the form.
  */
 function form_builder($form_id, $form) {
-  global $form_values, $form_submitted, $form_button_counter;
+  global $form_values, $submit_callback;
 
   // Initialize as unprocessed.
   $form['#processed'] = FALSE;
@@ -736,13 +725,13 @@ function form_builder($form_id, $form) {
         }
       }
     }
-    if (isset($form['#executes_submit_callback'])) {
-      // Count submit and non-submit buttons.
-      $form_button_counter[$form['#executes_submit_callback']]++;
-      // See if a submit button was pressed.
+    if (isset($form['#button_type'])) {
+      // This is an element capable of initiating a form submit. See if it was clicked.
       if (isset($form['#post'][$form['#name']]) && $form['#post'][$form['#name']] == $form['#value']) {
-        $form_submitted = $form_submitted || $form['#executes_submit_callback'];
-
+        $form_submitted = $form_submitted || !empty($form['#executes_submit_callback']);
+        if (isset($form['#callback'])) {
+          $submit_callback = $form['#callback'];
+        }
         // In most cases, we want to use form_set_value() to manipulate the
         // global variables. In this special case, we want to make sure that
         // the value of this element is listed in $form_variables under 'op'.
@@ -765,8 +754,10 @@ function form_builder($form_id, $form) {
 
   // Set the $form_values key that gets passed to validate and submit.
   // We call this after #process gets called so that #process has a
-  // chance to update #value if desired.
-  if (isset($form['#input']) && $form['#input']) {
+  // chance to update #value if desired. Button type input fields should
+  // only show up if they're used to submit the form, so we will ignore
+  // them here.
+  if (isset($form['#input']) && $form['#input'] && !isset($form['#button_type'])) {
     form_set_value($form, $form['#value']);
   }
 
Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.106
diff -u -p -r1.106 locale.inc
--- includes/locale.inc	24 Jan 2007 14:48:35 -0000	1.106
+++ includes/locale.inc	31 Jan 2007 18:12:48 -0000
@@ -74,7 +74,7 @@ function _locale_admin_manage_screen() {
     '#options' => $options,
     '#default_value' => $isdefault,
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('locale_admin_manage_screen_submit' => array()), '#value' => t('Save configuration'));
   $form['#base'] = 'locale_admin_manage_screen';
 
   return $form;
@@ -137,7 +137,7 @@ function locale_add_language_form() {
     '#options' => $isocodes,
     '#description' => t('Select your language here, or add it below, if you are unable to find it.'),
   );
-  $form['language list']['submit'] = array('#type' => 'submit', '#value' => t('Add language'));
+  $form['language list']['submit'] = array('#type' => 'button', '#callback' => array('locale_add_language_form_submit' => array()), '#value' => t('Add language'));
   return $form;
 }
 
@@ -160,7 +160,7 @@ function locale_custom_language_form() {
     '#required' => TRUE,
     '#description' => t('Name of the language. Will be available for translation in all languages.'),
   );
-  $form['custom language']['submit'] = array('#type' => 'submit', '#value' => t('Add custom language'));
+  $form['custom language']['submit'] = array('#type' => 'button', '#callback' => array('locale_language_add_form_submit' => array()), '#value' => t('Add custom language'));
   // Use the validation and submit functions of the add language form.
   $form['#base'] = 'locale_add_language_form';
   return $form;
@@ -244,7 +244,7 @@ function _locale_admin_import() {
     '#default_value' => 'overwrite',
     '#options' => array('overwrite' => t('Strings in the uploaded file replace existing ones, new ones are added'), 'keep' => t('Existing strings are kept, only new strings are added')),
   );
-  $form['import']['submit'] = array('#type' => 'submit', '#value' => t('Import'));
+  $form['import']['submit'] = array('#type' => 'button', '#callback' => array('_locale_admin_import_submit' => array()), '#value' => t('Import'));
   $form['#attributes']['enctype'] = 'multipart/form-data';
 
   return $form;
@@ -282,7 +282,7 @@ function _locale_export_po_form($languag
     '#options' => $languages,
     '#description' => t('Select the language you would like to export in gettext Portable Object (.po) format.'),
   );
-  $form['export']['submit'] = array('#type' => 'submit', '#value' => t('Export'));
+  $form['export']['submit'] = array('#type' => 'button', '#callback' => array('_locale_export_po_form_submit' => array()), '#value' => t('Export'));
   return $form;
 }
 
@@ -293,7 +293,7 @@ function _locale_export_pot_form() {
     '#collapsible' => TRUE,
     '#description' => t('Generate a gettext Portable Object Template (.pot) file with all the interface strings from the Drupal locale database.'),
   );
-  $form['export']['submit'] = array('#type' => 'submit', '#value' => t('Export'));
+  $form['export']['submit'] = array('#type' => 'button', '#callback' => array('_locale_export_pot_form_submit' => array()), '#value' => t('Export'));
   $form['#base'] = '_locale_export_po_form';
   return $form;
 }
@@ -356,7 +356,7 @@ function _locale_string_seek_form() {
     '#default_value' => ($query->searchin ? $query->searchin : 'all'),
     '#options' => array('all' => t('All strings in that language'), 'translated' => t('Only translated strings'), 'untranslated' => t('Only untranslated strings')),
   );
-  $form['search']['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+  $form['search']['submit'] = array('#type' => 'button', '#callback' => array('_locale_string_seek_form_submit' => array()), '#value' => t('Search'));
   $form['#redirect'] = FALSE;
 
   return $form;
@@ -409,7 +409,7 @@ function _locale_string_edit($lid) {
   }
 
   $form['lid'] = array('#type' => 'value', '#value' => $lid);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save translations'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('_locale_string_edit_submit' => array()), '#value' => t('Save translations'));
 
   return $form;
 }
Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.326
diff -u -p -r1.326 aggregator.module
--- modules/aggregator/aggregator.module	31 Jan 2007 15:49:22 -0000	1.326
+++ modules/aggregator/aggregator.module	31 Jan 2007 18:12:49 -0000
@@ -320,10 +320,10 @@ function aggregator_block($op = 'list', 
     '#title' => t('Description'),
     '#default_value' => $edit['description'],
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('aggregator_form_category_submit' => array()), '#value' => t('Submit'));
 
   if ($edit['cid']) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['delete'] = array('#type' => 'button', '#callback' => array('aggregator_form_category_submit' => array()), '#value' => t('Delete'));
     $form['cid'] = array('#type' => 'hidden', '#value' => $edit['cid']);
   }
 
@@ -451,10 +451,10 @@ function aggregator_form_feed($edit = ar
       '#description' => t('New items in this feed will be automatically filed in the checked categories as they are received.'),
     );
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('aggregator_form_feed_submit' => array()), '#value' => t('Submit'));
 
   if ($edit['fid']) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['delete'] = array('#type' => 'button', '#callback' => array('aggregator_form_feed_submit' => array()), '#value' => t('Delete'));
     $form['fid'] = array('#type' => 'hidden', '#value' => $edit['fid']);
   }
 
@@ -1080,7 +1080,7 @@ function aggregator_page_list($sql, $hea
       );
     }
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save categories'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('aggregator_page_list_submit' => array()), '#value' => t('Save categories'));
   $form['pager'] = array('#value' => theme('pager', NULL, 20, 0));
 
   return $form;
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.251
diff -u -p -r1.251 block.module
--- modules/block/block.module	31 Jan 2007 15:49:22 -0000	1.251
+++ modules/block/block.module	31 Jan 2007 18:12:50 -0000
@@ -245,7 +245,7 @@ function block_admin_display($theme = NU
       $form[$i]['delete'] = array('#value' => l(t('delete'), 'admin/build/block/delete/'. $block['delta']));
     }
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save blocks'));
+  $form['submit'] = array('#type' => 'button','#callback' => array('block_admin_display_submit' => array()), '#value' => t('Save blocks'));
 
   return $form;
 }
@@ -475,7 +475,8 @@ function block_admin_configure($module =
   }
 
   $form['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
+    '#callback' => array('block_admin_configure_submit' => array()),
     '#value' => t('Save block'),
   );
 
Index: modules/book/book.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.module,v
retrieving revision 1.410
diff -u -p -r1.410 book.module
--- modules/book/book.module	31 Jan 2007 15:49:23 -0000	1.410
+++ modules/book/book.module	31 Jan 2007 18:12:50 -0000
@@ -269,15 +269,17 @@ function book_outline($node) {
 
   $form['nid'] = array('#type' => 'value', '#value' => $nid);
   if ($node->parent) {
-    $form['update'] = array('#type' => 'submit',
+    $form['update'] = array('#type' => 'button',
+      '#callback' => array('book_outline_submit' => array()),
       '#value' => t('Update book outline'),
     );
-    $form['remove'] = array('#type' => 'submit',
+    $form['remove'] = array('#type' => 'button',
+      '#callback' => array('book_outline_submit' => array()),
       '#value' => t('Remove from book outline'),
     );
   }
   else {
-    $form['add'] = array('#type' => 'submit', '#value' => t('Add to book outline'));
+    $form['add'] = array('#type' => 'button', '#callback' => array('book_outline_submit' => array()), '#value' => t('Add to book outline'));
   }
 
   drupal_set_title(check_plain($node->title));
@@ -871,7 +873,8 @@ function book_admin_edit($nid) {
 
     $form['table'] = _book_admin_table(array($node));
     $form['save'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('book_admin_edit_submit' => array()),
       '#value' => t('Save book pages'),
     );
 
@@ -905,7 +908,8 @@ function book_admin_orphan() {
   if (count($orphans)) {
     $form['table'] = _book_admin_table($orphans);
     $form['save'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('book_admin_edit_submit' => array()),
       '#value' => t('Save book pages'),
     );
 
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.523
diff -u -p -r1.523 comment.module
--- modules/comment/comment.module	31 Jan 2007 15:49:23 -0000	1.523
+++ modules/comment/comment.module	31 Jan 2007 18:12:52 -0000
@@ -1170,7 +1170,7 @@ function comment_admin_overview($type = 
     $options[$key] = $value[0];
   }
   $form['options']['operation'] = array('#type' => 'select', '#options' => $options, '#default_value' => 'publish');
-  $form['options']['submit'] = array('#type' => 'submit', '#value' => t('Update'));
+  $form['options']['submit'] = array('#type' => 'button', '#callback' => array('comment_admin_overview_submit' => array()), '#value' => t('Update'));
 
   // load the comments that we want to display
   $status = ($type == 'approval') ? COMMENT_NOT_PUBLISHED : COMMENT_PUBLISHED;
@@ -1559,7 +1559,7 @@ function comment_form($edit, $title = NU
   // We show the post button in preview mode even if there are form errors so that
   // optional form elements (e.g., captcha) can be updated in preview mode.
   if (!form_get_errors() && ((variable_get('comment_preview', COMMENT_PREVIEW_REQUIRED) == COMMENT_PREVIEW_OPTIONAL) || ($op == t('Preview comment')) || ($op == t('Post comment')))) {
-    $form['submit'] = array('#type' => 'submit', '#value' => t('Post comment'), '#weight' => 20);
+    $form['submit'] = array('#type' => 'button', '#callback' => array('comment_form_submit' => array()), '#value' => t('Post comment'), '#weight' => 20);
   }
 
   if ($op == t('Preview comment')) {
@@ -1738,7 +1738,8 @@ function comment_controls($mode = COMMEN
     '#weight' => 3,
   );
 
-  $form['submit'] = array('#type' => 'submit',
+  $form['submit'] = array('#type' => 'button',
+    '#callback' => array('comment_controls_submit' => array()),
     '#value' => t('Save settings'),
     '#weight' => 20,
   );
Index: modules/contact/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v
retrieving revision 1.76
diff -u -p -r1.76 contact.module
--- modules/contact/contact.module	31 Jan 2007 15:49:24 -0000	1.76
+++ modules/contact/contact.module	31 Jan 2007 18:12:53 -0000
@@ -182,7 +182,8 @@ function contact_admin_edit($cid = NULL)
   $form['cid'] = array('#type' => 'value',
     '#value' => $edit['cid'],
   );
-  $form['submit'] = array('#type' => 'submit',
+  $form['submit'] = array('#type' => 'button',
+    '#callback' => array('contact_admin_edit_submit' => array()),
     '#value' => t('Submit'),
   );
 
@@ -331,7 +332,8 @@ function contact_mail_user($recipient) {
   $form['copy'] = array('#type' => 'checkbox',
     '#title' => t('Send yourself a copy.'),
   );
-  $form['submit'] = array('#type' => 'submit',
+  $form['submit'] = array('#type' => 'button',
+    '#callback' => array('contact_mail_user_submit' => array()),
     '#value' => t('Send e-mail'),
   );
   return $form;
@@ -463,7 +465,8 @@ function contact_mail_page() {
         '#title' => t('Send yourself a copy.'),
       );
     }
-    $form['submit'] = array('#type' => 'submit',
+    $form['submit'] = array('#type' => 'button',
+      '#callback' => array('contact_mail_page_submit' => array()),
       '#value' => t('Send e-mail'),
     );
   }
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.162
diff -u -p -r1.162 filter.module
--- modules/filter/filter.module	31 Jan 2007 15:49:24 -0000	1.162
+++ modules/filter/filter.module	31 Jan 2007 18:12:54 -0000
@@ -297,7 +297,7 @@ function filter_admin_overview() {
     $form[$format->name]['delete'] = array('#value' => $default ? '' : l(t('delete'), 'admin/settings/filters/delete/'. $id));
   }
   $form['default'] = array('#type' => 'radios', '#options' => $options, '#default_value' => variable_get('filter_default_format', 1));
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Set default format'));
+  $form['submit'] = array('#type' => 'button','#callback' => array('filter_admin_overview_submit' => array()), '#value' => t('Set default format'));
   return $form;
 }
 
@@ -438,7 +438,7 @@ function filter_admin_format_form($forma
     $form['tips'] = array('#value' => '<h2>'. t('Formatting guidelines') .'</h2>'. $group);
     drupal_set_title(t("!format input format", array('!format' => $format->name)));
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('filter_admin_format_form_submit' => array()), '#value' => t('Save configuration'));
 
   return $form;
 }
@@ -527,7 +527,7 @@ function filter_admin_order($format = NU
     $form['weights'][$id] = array('#type' => 'weight', '#default_value' => $filter->weight);
   }
   $form['format'] = array('#type' => 'hidden', '#value' => $format->format);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('filter_admin_order_submit' => array()), '#value' => t('Save configuration'));
 
   return $form;
 }
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.380
diff -u -p -r1.380 forum.module
--- modules/forum/forum.module	31 Jan 2007 16:01:17 -0000	1.380
+++ modules/forum/forum.module	31 Jan 2007 18:12:55 -0000
@@ -461,11 +461,12 @@ function forum_form_container($edit = ar
   $form['vid'] = array('#type' => 'hidden',
     '#value' => _forum_get_vid());
   $form['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
+    '#callback' => array('forum_form_submit' => array()),
     '#value' => t('Submit')
   );
   if ($edit['tid']) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['delete'] = array('#type' => 'button', '#callback' => array('forum_form_submit' => array()), '#value' => t('Delete'));
     $form['tid'] = array('#type' => 'value', '#value' => $edit['tid']);
   }
   $form['#base'] = 'forum_form';
@@ -514,9 +515,9 @@ function forum_form_forum($edit = array(
   );
 
   $form['vid'] = array('#type' => 'hidden', '#value' => _forum_get_vid());
-  $form['submit' ] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit' ] = array('#type' => 'button', '#callback' => array('forum_form_submit' => array()), '#value' => t('Submit'));
   if ($edit['tid']) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['delete'] = array('#type' => 'button','#callback' => array('forum_form_submit' => array()), '#value' => t('Delete'));
     $form['tid'] = array('#type' => 'hidden', '#value' => $edit['tid']);
   }
   $form['#base'] = 'forum_form';
Index: modules/menu/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v
retrieving revision 1.101
diff -u -p -r1.101 menu.module
--- modules/menu/menu.module	24 Jan 2007 14:48:36 -0000	1.101
+++ modules/menu/menu.module	31 Jan 2007 18:12:55 -0000
@@ -322,7 +322,7 @@ function menu_edit_menu_form($type, $mid
   $form['path'] = array('#type' => 'value', '#value' => $item['path']);
   $form['weight'] = array('#type' => 'value', '#value' => $item['weight']);
   $form['type'] = array('#type' => 'value', '#value' => $item['type']);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('menu_edit_menu_form_submit' => array()), '#value' => t('Submit'));
   // Reuse the submit function of menu_edit_item_form.
   $form['#base'] = 'menu_edit_item_form';
 
@@ -402,7 +402,7 @@ function menu_edit_item_form($type, $mid
 
   $form['type'] = array('#type' => 'value', '#value' => $item['type']);
   $form['mid'] = array('#type' => 'value', '#value' => $item['mid']);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('menu_edit_item_form_submit' => array()), '#value' => t('Submit'));
 
   return $form;
 }
Index: modules/node/content_types.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/content_types.inc,v
retrieving revision 1.24
diff -u -p -r1.24 content_types.inc
--- modules/node/content_types.inc	9 Jan 2007 07:53:26 -0000	1.24
+++ modules/node/content_types.inc	31 Jan 2007 18:12:56 -0000
@@ -192,21 +192,24 @@ function node_type_form($type = NULL) {
   );
 
   $form['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
+    '#callback' => array('node_type_form_submit' => array()),
     '#value' => t('Save content type'),
   );
 
   if ($type->custom) {
     if (!empty($type->type)) {
       $form['delete'] = array(
-        '#type' => 'submit',
+        '#type' => 'button',
+        '#callback' => array('node_type_form_submit' => array()),
         '#value' => t('Delete content type'),
       );
     }
   }
   else {
     $form['reset'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('node_type_form_submit' => array()),
       '#value' => t('Reset to defaults'),
     );
   }
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.780
diff -u -p -r1.780 node.module
--- modules/node/node.module	31 Jan 2007 15:49:25 -0000	1.780
+++ modules/node/node.module	31 Jan 2007 18:12:58 -0000
@@ -974,7 +974,7 @@ function node_configure() {
 
     $form['access'] = array('#type' => 'fieldset', '#title' => t('Node access status'));
     $form['access']['status'] = array('#value' => $status);
-    $form['access']['rebuild'] = array('#type' => 'submit', '#value' => t('Rebuild permissions'));
+    $form['access']['rebuild'] = array('#type' => 'button', '#callback' => array('node_configure_submit' => array()), '#value' => t('Rebuild permissions'));
   }
 
   $form['default_nodes_main'] = array(
@@ -1380,10 +1380,10 @@ function node_filter_form() {
   }
 
   $form['filters']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'status');
-  $form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter')));
+  $form['filters']['buttons']['submit'] = array('#type' => 'button', '#callback' => array('node_filter_form_submit' => array()), '#value' => (count($session) ? t('Refine') : t('Filter')));
   if (count($session)) {
-    $form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
-    $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
+    $form['filters']['buttons']['undo'] = array('#type' => 'button', '#callback' => array('node_filter_form_submit' => array()), '#value' => t('Undo'));
+    $form['filters']['buttons']['reset'] = array('#type' => 'button', '#callback' => array('node_filter_form_submit' => array()), '#value' => t('Reset'));
   }
 
   return $form;
@@ -1522,7 +1522,7 @@ function node_admin_nodes() {
     $options[$operation] = $array['label'];
   }
   $form['options']['operation'] = array('#type' => 'select', '#options' => $options,  '#default_value' => 'approve');
-  $form['options']['submit'] = array('#type' => 'submit', '#value' => t('Update'));
+  $form['options']['submit'] = array('#type' => 'button', '#callback' => array('node_admin_nodes_submit' => array()), '#value' => t('Update'));
 
   $destination = drupal_get_destination();
   while ($node = db_fetch_object($result)) {
@@ -2034,7 +2034,18 @@ function node_form($node, $form_values =
 
   // Add the buttons.
   $form['preview'] = array('#type' => 'button', '#value' => t('Preview'), '#weight' => 40);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'), '#weight' => 45);
+  $form['submit'] = array(
+    '#type' => 'button',
+    '#callback' => array('node_form_submit' => array()),
+    '#value' => t('Submit'),
+    '#weight' => 45,
+    '#callback' => array(
+      $node->type .'_node_submit_early' => array(),
+      'node_form_submit' => array(),
+      $node->type .'_node_submit' => array(),
+    ),
+  );
+ 
   if (!empty($node->nid) && node_access('delete', $node)) {
     $form['delete'] = array('#type' => 'button', '#value' => t('Delete'), '#weight' => 50);
   }
@@ -2519,7 +2530,8 @@ function node_form_alter($form_id, &$for
       '#options' => $types,
     );
     $form['advanced']['submit'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('search_form_submit' => array()),
       '#value' => t('Advanced search'),
       '#prefix' => '<div class="action clear-block">',
       '#suffix' => '</div>',
Index: modules/path/path.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/path/path.module,v
retrieving revision 1.107
diff -u -p -r1.107 path.module
--- modules/path/path.module	31 Jan 2007 15:49:25 -0000	1.107
+++ modules/path/path.module	31 Jan 2007 18:12:59 -0000
@@ -200,10 +200,10 @@ function path_form($edit = '') {
 
   if ($edit['pid']) {
     $form['pid'] = array('#type' => 'hidden', '#value' => $edit['pid']);
-    $form['submit'] = array('#type' => 'submit', '#value' => t('Update alias'));
+    $form['submit'] = array('#type' => 'button', '#callback' => array('path_form_submit' => array()), '#value' => t('Update alias'));
   }
   else {
-    $form['submit'] = array('#type' => 'submit', '#value' => t('Create new alias'));
+    $form['submit'] = array('#type' => 'button', '#callback' => array('path_form_submit' => array()), '#value' => t('Create new alias'));
   }
 
   return $form;
Index: modules/poll/poll.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v
retrieving revision 1.223
diff -u -p -r1.223 poll.module
--- modules/poll/poll.module	24 Jan 2007 14:48:36 -0000	1.223
+++ modules/poll/poll.module	31 Jan 2007 18:12:59 -0000
@@ -369,7 +369,7 @@ function poll_view_voting($node, $block)
     );
   }
   $form['nid'] = array('#type' => 'hidden', '#value' => $node->nid);
-  $form['vote'] = array('#type' => 'submit', '#value' => t('Vote'));
+  $form['vote'] = array('#type' => 'button', '#value' => t('Vote'));
   $form['#action'] = url('node/'. $node->nid);
   return $form;
 }
@@ -436,7 +436,7 @@ function theme_poll_results($title, $res
 
 function poll_cancel_form($nid) {
   $form['#action'] = url("poll/cancel/$nid");
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Cancel your vote'));
+  $form['submit'] = array('#type' => 'button', '#value' => t('Cancel your vote'));
   return $form;
 }
 
Index: modules/profile/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v
retrieving revision 1.192
diff -u -p -r1.192 profile.module
--- modules/profile/profile.module	31 Jan 2007 15:49:25 -0000	1.192
+++ modules/profile/profile.module	31 Jan 2007 18:13:00 -0000
@@ -297,7 +297,8 @@ Unless you know what you are doing, it i
     '#title' => t('Visible in user registration form.'),
     '#default_value' => $edit['register'],
   );
-  $form['submit'] = array('#type' => 'submit',
+  $form['submit'] = array('#type' => 'button',
+    '#callback' => array('profile_field_form_submit' => array()),
     '#value' => t('Save field'),
   );
   return $form;
Index: modules/search/search.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.module,v
retrieving revision 1.210
diff -u -p -r1.210 search.module
--- modules/search/search.module	24 Jan 2007 14:48:36 -0000	1.210
+++ modules/search/search.module	31 Jan 2007 18:13:01 -0000
@@ -228,7 +228,7 @@ function search_admin_settings() {
   $status = '<p><strong>'. t('%percentage of the site has been indexed.', array('%percentage' => $percentage)) .' '. $count .'</strong></p>';
   $form['status'] = array('#type' => 'fieldset', '#title' => t('Indexing status'));
   $form['status']['status'] = array('#value' => $status);
-  $form['status']['wipe'] = array('#type' => 'submit', '#value' => t('Re-index site'));
+  $form['status']['wipe'] = array('#type' => 'button', '#value' => t('Re-index site'));
 
   $items = drupal_map_assoc(array(10, 20, 50, 100, 200, 500));
 
@@ -1009,7 +1009,7 @@ function search_form($action = '', $keys
   // processed_keys is used to coordinate keyword passing between other forms
   // that hook into the basic search form.
   $form['basic']['inline']['processed_keys'] = array('#type' => 'value', '#value' => array());
-  $form['basic']['inline']['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+  $form['basic']['inline']['submit'] = array('#type' => 'button', '#callback' => array('search_form_submit' => array()), '#value' => t('Search'));
 
   return $form;
 }
@@ -1049,7 +1049,7 @@ function search_box($form_id) {
     '#default_value' => '',
     '#attributes' => array('title' => t('Enter the terms you wish to search for.')),
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('search_box_form_submit' => array()), '#value' => t('Search'));
   // Always go to the search page since the search form is not guaranteed to be
   // on every page.
   $form['#action'] = url('search/node');
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.446
diff -u -p -r1.446 system.module
--- modules/system/system.module	31 Jan 2007 15:49:25 -0000	1.446
+++ modules/system/system.module	31 Jan 2007 18:13:03 -0000
@@ -59,8 +59,7 @@ function system_elements() {
 
   // Inputs
   $type['checkbox'] = array('#input' => TRUE, '#return_value' => 1);
-  $type['submit'] = array('#input' => TRUE, '#name' => 'op', '#button_type' => 'submit', '#executes_submit_callback' => TRUE);
-  $type['button'] = array('#input' => TRUE, '#name' => 'op', '#button_type' => 'submit', '#executes_submit_callback' => FALSE);
+  $type['button'] = array('#input' => TRUE, '#name' => 'op', '#button_type' => 'submit');
   $type['textfield'] = array('#input' => TRUE, '#size' => 60, '#maxlength' => 128, '#autocomplete_path' => FALSE);
   $type['password'] = array('#input' => TRUE, '#size' => 60, '#maxlength' => 128);
   $type['password_confirm'] = array('#input' => TRUE, '#process' => array('expand_password_confirm' => array()));
@@ -424,12 +423,13 @@ function system_admin_theme_settings() {
     '#default_value' => variable_get('admin_theme', '0'),
   );
 
+  $form = system_settings_form($form);
   // In order to give it our own submit, we have to give it the default submit
-  // too because the presence of a #submit will prevent the default #submit
+  // too because the presence of a #callback will prevent the default submit
   // from being used. Also we want ours first.
-  $form['#submit']['system_admin_theme_submit'] = array();
-  $form['#submit']['system_settings_form_submit'] = array();
-  return system_settings_form($form);
+  $form['buttons']['submit']['#callback']['system_admin_theme_submit'] = array();
+  $form['buttons']['submit']['#callback']['system_settings_form_submit'] = array();
+  return $form;
 }
 
 
@@ -1058,8 +1058,8 @@ function system_initialize_theme_blocks(
  * Add default buttons to a form and set its prefix
  */
 function system_settings_form($form) {
-  $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') );
-  $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults') );
+  $form['buttons']['submit'] = array('#type' => 'button', '#callback' => array('system_settings_form_submit' => array()), '#value' => t('Save configuration') );
+  $form['buttons']['reset'] = array('#type' => 'button', '#callback' => array('system_settings_form_submit' => array()), '#value' => t('Reset to defaults') );
 
   if (!empty($_POST) && form_get_errors()) {
     drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
@@ -1151,8 +1151,8 @@ function system_themes() {
 
   $form['status'] = array('#type' => 'checkboxes', '#options' => $options, '#default_value' => $status);
   $form['theme_default'] = array('#type' => 'radios', '#options' => $options, '#default_value' => variable_get('theme_default', 'garland'));
-  $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') );
-  $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults') );
+  $form['buttons']['submit'] = array('#type' => 'button', '#callback' => array('system_themes_submit' => array()), '#value' => t('Save configuration'));
+  $form['buttons']['reset'] = array('#type' => 'button', '#callback' => array('system_themes_submit' => array()), '#value' => t('Reset to defaults'));
 
   return $form;
 }
@@ -1346,8 +1346,9 @@ function system_modules($form_values = N
   }
 
   $form['buttons']['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
     '#value' => t('Save configuration'),
+    '#callback' => array('system_modules_submit' => array()),
   );
   $form['#multistep'] = TRUE;
   $form['#action'] = url('admin/build/modules/list/confirm');
@@ -1613,6 +1614,7 @@ function system_modules_uninstall($form_
     $form['buttons']['submit'] = array(
       '#type' => 'button',
       '#value' => t('Uninstall'),
+      '#callback' => array('system_modules_uninstall_submit' => array()),
     );
     $form['#multistep'] = TRUE;
     $form['#action'] = url('admin/build/modules/uninstall/confirm');
@@ -2148,7 +2150,7 @@ function confirm_form($form, $question, 
   $form[$name] = array('#type' => 'hidden', '#value' => 1);
 
   $form['actions'] = array('#prefix' => '<div class="container-inline">', '#suffix' => '</div>');
-  $form['actions']['submit'] = array('#type' => 'submit', '#value' => $yes ? $yes : t('Confirm'));
+  $form['actions']['submit'] = array('#type' => 'button', '#value' => $yes ? $yes : t('Confirm'));
   $form['actions']['cancel'] = array('#value' => $cancel);
   $form['#base'] = 'confirm_form';
   return $form;
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.336
diff -u -p -r1.336 taxonomy.module
--- modules/taxonomy/taxonomy.module	31 Jan 2007 15:49:26 -0000	1.336
+++ modules/taxonomy/taxonomy.module	31 Jan 2007 18:13:04 -0000
@@ -267,9 +267,9 @@ function taxonomy_form_vocabulary($edit 
     '#description' => t('In listings, the heavier vocabularies will sink and the lighter vocabularies will be positioned nearer the top.'),
   );
 
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['submit'] = array('#type' => 'button', '#callback' => array('taxonomy_form_vocabulary_submit' => array()), '#value' => t('Submit'));
   if ($edit['vid']) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['delete'] = array('#type' => 'button', '#callback' => array('taxonomy_form_vocabulary_submit' => array()), '#value' => t('Delete'));
     $form['vid'] = array('#type' => 'value', '#value' => $edit['vid']);
     $form['module'] = array('#type' => 'value', '#value' => $edit['module']);
   }
@@ -420,12 +420,14 @@ function taxonomy_form_term($vocabulary,
     '#type' => 'value',
     '#value' => $vocabulary->vid);
   $form['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
+    '#callback' => array('taxonomy_form_term_submit' => array()),
     '#value' => t('Submit'));
 
   if ($edit['tid']) {
     $form['delete'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
+      '#callback' => array('taxonomy_form_term_submit' => array()),
       '#value' => t('Delete'));
     $form['tid'] = array(
       '#type' => 'value',
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.751
diff -u -p -r1.751 user.module
--- modules/user/user.module	31 Jan 2007 15:49:26 -0000	1.751
+++ modules/user/user.module	31 Jan 2007 18:13:07 -0000
@@ -494,8 +494,9 @@ function user_login_block() {
     '#size' => 15,
     '#required' => TRUE,
   );
-  $form['submit'] = array('#type' => 'submit',
-    '#value' => t('Log in'),
+  $form['submit'] = array('#type' => 'button',
+    '#value' => t('Log in'), 
+    '#callback' => array('user_login_submit' => array()),
   );
   $items = array();
   if (variable_get('user_register', 1)) {
@@ -1004,7 +1005,7 @@ function user_login($msg = '') {
     '#required' => TRUE,
     '#attributes' => array('tabindex' => '2'),
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Log in'), '#weight' => 2, '#attributes' => array('tabindex' => '3'));
+  $form['submit'] = array('#type' => 'button', '#value' => t('Log in'), '#callback' => array('user_login_submit' => array()), '#weight' => 2, '#attributes' => array('tabindex' => '3'));
 
   return $form;
 }
@@ -1128,8 +1129,9 @@ function user_pass() {
     '#maxlength' => max(USERNAME_MAX_LENGTH, EMAIL_MAX_LENGTH),
     '#required' => TRUE,
   );
-  $form['submit'] = array('#type' => 'submit',
+  $form['submit'] = array('#type' => 'button',
     '#value' => t('E-mail new password'),
+    '#callback' => array('user_pass_submit' => array()),
     '#weight' => 2,
   );
   return $form;
@@ -1212,7 +1214,7 @@ function user_pass_reset($uid, $timestam
         else {
           $form['message'] = array('#value' => t('<p>This is a one-time login for %user_name and will expire on %expiration_date</p><p>Click on this button to login to the site and change your password.</p>', array('%user_name' => $account->name, '%expiration_date' => format_date($timestamp + $timeout))));
           $form['help'] = array('#value' => '<p>'. t('This login can be used only once.') .'</p>');
-          $form['submit'] = array('#type' => 'submit', '#value' => t('Log in'));
+          $form['submit'] = array('#type' => 'button', '#value' => t('Log in'));
           $form['#action'] = url("user/reset/$uid/$timestamp/$hashed_pass/login");
           return $form;
         }
@@ -1288,7 +1290,7 @@ function user_register() {
   else {
     $form = array_merge($form, $extra);
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Create new account'), '#weight' => 30);
+  $form['submit'] = array('#type' => 'button', '#value' => t('Create new account'), '#callback' => array('user_register_submit' => array()), '#weight' => 30);
 
   return $form;
 }
@@ -1523,9 +1525,9 @@ function user_edit($category = 'account'
   $form = _user_forms($edit, $account, $category);
   $form['_category'] = array('#type' => 'value', '#value' => $category);
   $form['_account'] = array('#type' => 'value', '#value' => $account);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'), '#weight' => 30);
+  $form['submit'] = array('#type' => 'button', '#value' => t('Submit'), '#callback' => array('user_edit_submit' => array()), '#weight' => 30);
   if (user_access('administer users')) {
-    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'), '#weight' => 31);
+    $form['delete'] = array('#type' => 'button', '#value' => t('Delete'), '#callback' => array('user_edit_submit' => array()), '#weight' => 31);
   }
   $form['#attributes']['enctype'] = 'multipart/form-data';
 
@@ -1647,7 +1649,7 @@ function user_admin_check_user() {
   $form['user'] = array('#type' => 'fieldset', '#title' => t('Username'));
   $form['user']['test'] = array('#type' => 'textfield', '#title' => '', '#description' => t('Enter a username to check if it will be denied or allowed.'), '#size' => 30, '#maxlength' => USERNAME_MAX_LENGTH);
   $form['user']['type'] = array('#type' => 'hidden', '#value' => 'user');
-  $form['user']['submit'] = array('#type' => 'submit', '#value' => t('Check username'));
+  $form['user']['submit'] = array('#type' => 'button', '#value' => t('Check username'), '#callback' => array('user_admin_access_check_submit' => array()));
   $form['#base'] = 'user_admin_access_check';
   return $form;
 }
@@ -1656,7 +1658,7 @@ function user_admin_check_mail() {
   $form['mail'] = array('#type' => 'fieldset', '#title' => t('E-mail'));
   $form['mail']['test'] = array('#type' => 'textfield', '#title' => '', '#description' => t('Enter an e-mail address to check if it will be denied or allowed.'), '#size' => 30, '#maxlength' => EMAIL_MAX_LENGTH);
   $form['mail']['type'] = array('#type' => 'hidden', '#value' => 'mail');
-  $form['mail']['submit'] = array('#type' => 'submit', '#value' => t('Check e-mail'));
+  $form['mail']['submit'] = array('#type' => 'button', '#value' => t('Check e-mail'), '#callback' => array('user_admin_access_check_submit' => array()));
   $form['#base'] = 'user_admin_access_check';
   return $form;
 }
@@ -1665,7 +1667,7 @@ function user_admin_check_host() {
   $form['host'] = array('#type' => 'fieldset', '#title' => t('Hostname'));
   $form['host']['test'] = array('#type' => 'textfield', '#title' => '', '#description' => t('Enter a hostname or IP address to check if it will be denied or allowed.'), '#size' => 30, '#maxlength' => 64);
   $form['host']['type'] = array('#type' => 'hidden', '#value' => 'host');
-  $form['host']['submit'] = array('#type' => 'submit', '#value' => t('Check hostname'));
+  $form['host']['submit'] = array('#type' => 'button', '#value' => t('Check hostname'), '#callback' => array('user_admin_access_check_submit' => array()));
   $form['#base'] = 'user_admin_access_check';
   return $form;
 }
@@ -1806,7 +1808,7 @@ function user_admin_access_form($edit, $
     '#description' => '%: '. t('Matches any number of characters, even zero characters') .'.<br />_: '. t('Matches exactly one character.'),
     '#required' => TRUE,
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => $submit);
+  $form['submit'] = array('#type' => 'button', '#value' => $submit);
 
   return $form;
 }
@@ -1915,7 +1917,7 @@ function user_admin_perm($rid = NULL) {
     $form['checkboxes'][$rid] = array('#type' => 'checkboxes', '#options' => $options, '#default_value' => $status[$rid]);
     $form['role_names'][$rid] = array('#value' => $name, '#tree' => TRUE);
   }
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save permissions'));
+  $form['submit'] = array('#type' => 'button', '#value' => t('Save permissions'), '#callback' => array('user_admin_perm_submit' => array()));
 
   return $form;
 }
@@ -1998,12 +2000,14 @@ function user_admin_role() {
       '#value' => $id,
     );
     $form['submit'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
       '#value' => t('Save role'),
+      '#callback' => array('user_admin_role_submit' => array()),
     );
     $form['delete'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
       '#value' => t('Delete role'),
+      '#callback' => array('user_admin_role_submit' => array()),
     );
   }
   else {
@@ -2013,8 +2017,9 @@ function user_admin_role() {
       '#maxlength' => 64,
     );
     $form['submit'] = array(
-      '#type' => 'submit',
+      '#type' => 'button',
       '#value' => t('Add role'),
+      '#callback' => array('user_admin_role_submit' => array()),
     );
     $form['#base'] = 'user_admin_role';
   }
@@ -2111,8 +2116,9 @@ function user_admin_account() {
     '#default_value' => 'unblock',
   );
   $form['options']['submit'] = array(
-    '#type' => 'submit',
+    '#type' => 'button',
     '#value' => t('Update'),
+    '#callback' => array('user_admin_account_submit' => array()),
   );
 
   $destination = drupal_get_destination();
@@ -2651,15 +2657,18 @@ function user_filter_form() {
   $form['filters']['filter'] = array('#type' => 'radios',
                                  '#options' => $names,
                                );
-  $form['filters']['buttons']['submit'] = array('#type' => 'submit',
-                                            '#value' => (count($session) ? t('Refine') : t('Filter'))
+  $form['filters']['buttons']['submit'] = array('#type' => 'button',
+                                            '#value' => (count($session) ? t('Refine') : t('Filter')),
+                                            '#callback' => array('user_filter_form_submit' => array()),
                                           );
   if (count($session)) {
-    $form['filters']['buttons']['undo'] = array('#type' => 'submit',
-                                            '#value' => t('Undo')
+    $form['filters']['buttons']['undo'] = array('#type' => 'button',
+                                            '#value' => t('Undo'),
+                                            '#callback' => array('user_filter_form_submit' => array()),
                                           );
-    $form['filters']['buttons']['reset'] = array('#type' => 'submit',
-                                             '#value' => t('Reset')
+    $form['filters']['buttons']['reset'] = array('#type' => 'button',
+                                             '#value' => t('Reset'),
+                                             '#callback' => array('user_filter_form_submit' => array()),
                                            );
   }
 
Index: modules/watchdog/watchdog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/watchdog/watchdog.module,v
retrieving revision 1.169
diff -u -p -r1.169 watchdog.module
--- modules/watchdog/watchdog.module	31 Jan 2007 15:49:26 -0000	1.169
+++ modules/watchdog/watchdog.module	31 Jan 2007 18:13:07 -0000
@@ -100,7 +100,7 @@ function watchdog_form_overview() {
     '#options' => $names,
     '#default_value' => $_SESSION['watchdog_overview_filter']
   );
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Filter'));
+  $form['submit'] = array('#type' => 'button', '#value' =>t('Filter'), '#callback' => array('watchdog_form_overview_submit' => array()));
   $form['#redirect'] = FALSE;
 
   return $form;
