=== modified file 'modules/node/node.module'
--- modules/node/node.module	
+++ modules/node/node.module	
@@ -907,21 +907,47 @@ function node_last_changed($nid) {
 }
 
 /**
- * List node administration operations that can be performed.
+ * Implementation of hook_node_operations().
  */
-function node_operations() {
+function node_node_operations() {
   $operations = array(
-    'approve' =>   array(t('Approve the selected posts'), 'UPDATE {node} SET status = 1 WHERE nid = %d'),
-    'promote' =>   array(t('Promote the selected posts'), 'UPDATE {node} SET status = 1, promote = 1 WHERE nid = %d'),
-    'sticky' =>    array(t('Make the selected posts sticky'), 'UPDATE {node} SET status = 1, sticky = 1 WHERE nid = %d'),
-    'demote' =>    array(t('Demote the selected posts'), 'UPDATE {node} SET promote = 0 WHERE nid = %d'),
-    'unpublish' => array(t('Unpublish the selected posts'), 'UPDATE {node} SET status = 0 WHERE nid = %d'),
-    'delete' =>    array(t('Delete the selected posts'), '')
+    'approve' =>   array(t('Approve the selected posts'), 'node_node_operations_execute', array('approve')),
+    'promote' =>   array(t('Promote the selected posts'), 'node_node_operations_execute', array('promote')),
+    'sticky' =>    array(t('Make the selected posts sticky'), 'node_node_operations_execute', array('sticky')),
+    'demote' =>    array(t('Demote the selected posts'), 'node_node_operations_execute', array('demote')),
+    'unpublish' => array(t('Unpublish the selected posts'), 'node_node_operations_execute', array('unpublish')),
+    'delete' =>    array(t('Delete the selected posts'), ''),
   );
   return $operations;
 }
 
 /**
+ * Perform the basic node administration operations.
+ */
+function node_node_operations_execute($nodes, $operation) {
+  switch ($operation) {
+    case 'approve':
+      $query = 'UPDATE {node} SET status = 1 WHERE nid = %d';
+      break;
+    case 'promote':
+      $query = 'UPDATE {node} SET status = 1, promote = 1 WHERE nid = %d';
+      break;
+    case 'sticky':
+      $query = 'UPDATE {node} SET status = 1, sticky = 1 WHERE nid = %d';
+      break;
+    case 'demote':
+      $query = 'UPDATE {node} SET promote = 0 WHERE nid = %d';
+      break;
+    case 'unpublish':
+      $query = 'UPDATE {node} SET status = 0 WHERE nid = %d';
+      break;
+  }
+  foreach ($nodes as $nid) {
+  	db_query($query, $nid);
+  }
+}
+
+/**
  * List node administration filters that can be applied.
  */
 function node_filters() {
@@ -1086,18 +1112,23 @@ function node_filter_form_submit() {
 }
 
 /**
- * Generate the content administration overview.
+ * Submit the node administration update form.
  */
 function node_admin_nodes_submit($form_id, $edit) {
-  $operations = node_operations();
-  if ($operations[$edit['operation']][1]) {
-    // Flag changes
-    $operation = $operations[$edit['operation']][1];
-    foreach ($edit['nodes'] as $nid => $value) {
-      if ($value) {
-        db_query($operation, $nid);
-      }
+  $operations = module_invoke_all('node_operations');
+  $operation = $operations[$edit['operation']];
+  // Filter out unchecked nodes
+  $nodes = array_diff($edit['nodes'], array(0));
+  if ($function = $operation[1]) {
+    // Add in callback arguments if present.
+    if ($operation[2]) {
+      $args = array_merge(array($nodes), $operation[2]);
+    }
+    else {
+      $args = array($nodes);
     }
+    call_user_func_array($function, $args);
+
     cache_clear_all();
     drupal_set_message(t('The update has been performed.'));
   }
@@ -1136,7 +1167,7 @@ function node_admin_nodes() {
     '#suffix' => '</div>',
   );
   $options = array();
-  foreach (node_operations() as $key => $value) {
+  foreach (module_invoke_all('node_operations') as $key => $value) {
     $options[$key] = $value[0];
   }
   $form['options']['operation'] = array('#type' => 'select', '#options' => $options,  '#default_value' => 'approve');
