diff --git a/public_html/sites/all/modules/contrib/modr8/modr8.module b/public_html/sites/all/modules/contrib/modr8/modr8.module
index 8c7ba4c..296f8d5 100644
--- a/public_html/sites/all/modules/contrib/modr8/modr8.module
+++ b/public_html/sites/all/modules/contrib/modr8/modr8.module
@@ -328,3 +328,148 @@ function theme_modr8_message($teaser = FALSE, $nodetype = 'page', $op = 'view')
   }
   $already_messaged = TRUE;
 }
+
+/**
+ * Implementation of hook_node_operations().
+ */
+function modr8_node_operations() {
+  return array(
+    'modr8_approve' => array(
+      'label' => t('Approve moderated nodes'),
+      'callback' => 'modr8_bulk_approve',
+    ),
+    'modr8_delete' => array(
+      'label' => t('Delete moderated nodes'),
+      'callback' => 'modr8_bulk_delete',
+    ),
+    'modr8_moderate' => array(
+      'label' => t('Mark for moderation'),
+      'callback' => 'modr8_bulk_moderate',
+    ),
+  );
+}
+
+/**
+ * Node operations API Function
+ * Mark the specified nodes for moderation.
+ *
+ * @param $nodes
+ *   An array of node ids.
+ */
+function modr8_bulk_moderate($nodes) {
+  foreach($nodes as $nid) {
+    $node = node_load($nid);
+    modr8_moderate_node($node);
+  }
+}
+
+/**
+ * Node operations API Function
+ * Approve the specified nodes.
+ *
+ * @param $nodes
+ *   An array of node ids.
+ */
+function modr8_bulk_approve($nodes) {
+  foreach($nodes as $nid) {
+    $node = node_load($nid);
+    modr8_approve_node($node);
+  }
+}
+
+/**
+ * Node operations API Function
+ * Delete the specified nodes.
+ *
+ * @param $nodes
+ *   An array of node ids.
+ */
+function modr8_bulk_delete($nodes) {
+  foreach($nodes as $nid) {
+    $node = node_load($nid);
+    modr8_delete_node($node);
+  }
+}
+
+/**
+ * Public API function to place the given node into moderation.
+ *
+ * @param $node
+ *   The node to moderate.
+ */
+function modr8_moderate_node($node) {
+  db_query('UPDATE {node} SET moderate = %d WHERE nid = %d', 1, $node->nid);
+  return db_affected_rows();
+}
+
+/**
+ * Public API function to approve the given node.
+ *
+ * @param $node
+ *   The node to approve.
+ * @param $note
+ *   An optional note to be used in emails being sent out.
+ */
+function modr8_approve_node($node, $note = NULL) {
+  module_load_include('inc', 'modr8', 'modr8_admin');
+
+  $values = _modr8_build_values($node, $note);
+  if (variable_get('modr8_send_approve', FALSE)) {
+    $message = modr8_usermail('approve', $node->nid, $values);
+  }
+
+  if (user_access('administer nodes')) {
+    $node->status = 1;
+  }
+  $node->moderate = 0;
+  node_save($node);
+
+  drupal_set_message(t('The %type with title %title has been approved.', array('%title' => $values['title'], '%type' => $values['type'])));
+  modr8_log_action('approve', $nid, $values, $message);
+}
+
+/**
+ * Public API function to delete the given node.
+ *
+ * @param $node
+ *   The node to delete.
+ * @param $note
+ *   An optional note to be used in emails being sent out.
+ */
+function modr8_delete_node($node, $note = NULL) {
+  module_load_include('inc', 'modr8', 'modr8_admin');
+  $values = _modr8_build_values($node, $note);
+  if (variable_get('modr8_send_deny', FALSE)) {
+    $message = modr8_usermail('deny', $node->nid, $values);
+  }
+
+  node_delete($node->nid);
+  // drupal does its own message
+  modr8_log_action('delete', $node->nid, $values, $message);
+}
+
+/**
+ * Build the values array needed for so many internal functions.
+ *
+ * @param $node
+ *   The node in the current context.
+ * @param $note
+ *   An optional note to be used in emails being sent out.
+ */
+function _modr8_build_values($node, $note = NULL) {
+  $log_link = '';
+  $events = db_query("SELECT modid FROM {modr8_log} WHERE nid = %d", $node->nid);
+  $count = db_result(db_query("SELECT COUNT(modid) FROM {modr8_log} WHERE nid = %d", $node->nid));
+  if ($count) {
+    $url = ($count == 1) ? ('admin/reports/modr8/event/'. db_result($events)) : ('node/'. $node->nid .'/modr8/');
+    $message = format_plural($count, 'See the 1 moderation log event for this post', 'Overview of the @count moderation log events for this post');
+    $log_link .= l($message, $url);
+  }
+  return array(
+    'note' => $note,
+    'author_uid' => $node->uid,
+    'log_link' => $log_link,
+    'title' => check_plain($node->title),
+    'type' => node_get_types('name', $node),
+  );
+}
diff --git a/public_html/sites/all/modules/contrib/modr8/modr8_admin.inc b/public_html/sites/all/modules/contrib/modr8/modr8_admin.inc
index dad4cf6..30dc4e7 100644
--- a/public_html/sites/all/modules/contrib/modr8/modr8_admin.inc
+++ b/public_html/sites/all/modules/contrib/modr8/modr8_admin.inc
@@ -342,26 +342,15 @@ function modr8_form_submit($form, &$form_state) {
     $message = '';
     switch ($values['ops']) {
       case 'approve':
-        if (variable_get('modr8_send_approve', FALSE)) {
-          $message = modr8_usermail('approve', $nid, $values);
-        }
         $node = node_load($nid);
-        if (user_access('administer nodes')) {
-          $node->status = 1;
-        }
-        $node->moderate = 0;
-        node_save($node);
-        drupal_set_message(t('The %type with title %title has been approved.', array('%title' => $values['title'], '%type' => $values['type'])));
-        modr8_log_action('approve', $nid, $values, $message);
+        modr8_approve_node($node, $value);
         break;
+
       case 'delete':
-        if (variable_get('modr8_send_deny', FALSE)) {
-          $message = modr8_usermail('deny', $nid, $values);
-        }
-        node_delete($nid);
-        // drupal does its own message
-        modr8_log_action('delete', $nid, $values, $message);
+        $node = node_load($nid);
+        modr8_delete_node($node, $value);
         break;
+
       case 'nada':
         if (variable_get('modr8_send_noact', FALSE) && !empty($values['note'])) {
           $message = modr8_usermail('nada', $nid, $values);
