form submit handler is not called I tried to mimic the multiple user deletion feature of user.module but for some reason the confirm form submit handler never get called. I don't know where the problem lies in. Following is a working sample of module except for the function delete_multiple_server_confirm_form_submit which never gets executed.

function mymodule_menu() {

  $items['testservers'] = array(
    'title' =&gt; 'Manage Servers',
    'page callback' =&gt; 'display_servers_callback',
    'page arguments' =&gt; array('delete'),
    'access callback' =&gt; true,
  );

  return $items;
}


function display_servers_callback($args = '') {

  $op = isset($_POST['op']) ? $_POST['op'] : $args;
  $op = strtolower($op);
  $build_form = array();

  if (!empty($_POST['table']) &amp;&amp; isset($_POST['operation']) &amp;&amp; ($_POST['operation'] == 'delete')) {
    $options = $_POST['table'];
    $build_form['delete_multiple_server_confirm_form'] = drupal_get_form('delete_multiple_server_confirm_form', $options);
  }
  else {


    $build_form['display_servers_form'] = drupal_get_form('display_servers_form');
  }

  return $build_form;
}


function delete_multiple_server_confirm_form($form, &amp;$form_state, $servers) {


  $path = current_path();

  return confirm_form($form, t('Are you sure you want to delete %title?'), $path, t('This action cannot be undone.'), t('Delete'), t('Cancel')
  );
}


function display_servers_form($form, $form_state) {


  $header = array(
    'server_name' =&gt; array('data' =&gt; t('Server Name')),
    'location' =&gt; array('data' =&gt; t('Location')),
    'protocols' =&gt; array('data' =&gt; t('Protocols')),
    'status' =&gt; array('data' =&gt; t('server status ')),
  );

  $servers = array(
    array('server_name' =&gt; 'us1', 'location' =&gt; 'us', 'protocols' =&gt; 'test', 'status' =&gt; 'ok'),
    array('server_name' =&gt; 'us2', 'location' =&gt; 'us', 'protocols' =&gt; 'test', 'status' =&gt; 'ok'),
    array('server_name' =&gt; 'us3', 'location' =&gt; 'us', 'protocols' =&gt; 'test', 'status' =&gt; 'ok'),
  );

  $options = array();



  for ($index = 0; $index &lt; count($servers); $index++) {


    $options[$index] = array(
      'server_name' =&gt; $servers[$index]['server_name'],
      'location' =&gt; $servers[$index]['location'],
      'protocols' =&gt; $servers[$index]['protocols'],
      'status' =&gt; $servers[$index]['status'],
    );
  }


  $form['table'] = array(
    '#type' =&gt; 'tableselect',
    '#header' =&gt; $header,
    '#options' =&gt; $options,
    '#empty' =&gt; t('No servers found'),
  );



  $options = array();
  $operations = array('delete' =&gt; array(
      'label' =&gt; t('delete servers'),
      'callback' =&gt; 'delete_multiples',
    ),
    'suspend' =&gt; array(
      'label' =&gt; t('suspend servers'),
    ),
  );

  foreach ($operations as $operation =&gt; $array) {
    $options[$operation] = $array['label'];
  }




  $form['options']['operation'] = array(
    '#type' =&gt; 'select',
    '#title' =&gt; t('Operation'),
    '#title_display' =&gt; 'invisible',
    '#options' =&gt; $options,
    '#default_value' =&gt; 'delete',
  );


  $form['options']['submit'] = array(
    '#type' =&gt; 'submit',
    '#value' =&gt; t('Update'),
  );


  return $form;
}


function delete_multiple_server_confirm_form_submit($form, &amp;$form_state, $servers) {

  drupal_set_message('working');
}
After careful rereading of the user module, i realize that 2 more hidden form values need to be added so  the same delete_multiple_server_confirm_form will get called again after confirming action,otherwise the display_server_form will be rendered.

$form['table'] = array('#prefix' =&gt; '&lt;ul&gt;', '#suffix' =&gt; '&lt;/ul&gt;', '#tree' =&gt; TRUE);
$form['operation'] = array('#type' =&gt; 'hidden', '#value' =&gt; 'delete');

 foreach($servers as $id) {


    $form['table'][$id] = array(
         '#type' =&gt; 'hidden',
         '#value' =&gt; $id,
         );
   }