diff --git a/mollom.module b/mollom.module
index 6536d47..2b94ce8 100644
--- a/mollom.module
+++ b/mollom.module
@@ -2732,6 +2732,7 @@ function mollom_moderate_validate_oauth() {
  */
 function mollom_moderate($data, $action) {
   $result = FALSE;
+  $messages = array();
 
   // Verify that action is supported or respond with a 404.
   if (!in_array($action, array('approve', 'spam', 'delete'))) {
@@ -2742,54 +2743,74 @@ function mollom_moderate($data, $action) {
   $form_info = mollom_form_load($data->form_id);
 
   if ($form_info) {
+    if (isset($form_info['entity load callback'])) {
+      $load_callback = $form_info['entity load callback'];
+      $messages[] = "May load $form_info[entity] entity via {$form_info['entity load callback']}().";
+    }
+    elseif (function_exists($data->entity . '_load')) {
+      $load_callback = $data->entity . '_load';
+      $messages[] = "May load $form_info[entity] entity via {$data->entity}_load().";
+    }
+    if (isset($form_info['entity save callback'])) {
+      $save_callback = $form_info['entity save callback'];
+      $messages[] = "May save $form_info[entity] entity via {$form_info['entity save callback']}().";
+    }
+    elseif (function_exists($data->entity . '_save')) {
+      $save_callback = $data->entity . '_save';
+      $messages[] = "May save $form_info[entity] entity via {$data->entity}_save().";
+    }
+    if (isset($form_info['entity delete multiple callback'])) {
+      $delete_callback = $form_info['entity delete multiple callback'];
+      $messages[] = "May delete $form_info[entity] entity via {$form_info['entity delete multiple callback']}().";
+    }
+    elseif (function_exists($data->entity . '_delete')) {
+      $delete_callback = $data->entity . '_delete';
+      $messages[] = "May delete $form_info[entity] entity via {$data->entity}_delete().";
+    }
+
     // Programmatically invoke publish action.
     if ($action == 'approve') {
       // @todo Abstract this. Possibly requires Entity module as dependency.
       if ($data->entity == 'comment') {
+        $messages[] = 'Invoked comment-specific code.';
         if ($comment = _comment_load($data->id)) {
+          $messages[] = "Loaded comment {$data->id} via _comment_load().";
           // comment_invoke_comment() is a mess, so we abuse the action.
           comment_publish_action($comment);
+          $messages[] = 'Invoked comment publish action.';
           // comment_admin_overview_submit() additionally updates node statistics
           // and invokes hooks, but the action does not.
           _comment_update_node_statistics($comment->nid);
           comment_invoke_comment($comment, 'publish');
+          $messages[] = 'Invoked comment publish hooks.';
 
           $result = TRUE;
         }
       }
-      else {
-        if (isset($form_info['entity load callback'])) {
-          $load_callback = $form_info['entity load callback'];
-        }
-        elseif (function_exists($data->entity . '_load')) {
-          $load_callback = $data->entity . '_load';
-        }
-        if (isset($form_info['entity save callback'])) {
-          $save_callback = $form_info['entity save callback'];
-        }
-        elseif (function_exists($data->entity . '_save')) {
-          $save_callback = $data->entity . '_save';
-        }
-      }
-      if (isset($load_callback) && isset($save_callback) && ($entity = $load_callback($data->id))) {
+      elseif (isset($load_callback) && isset($save_callback) && ($entity = $load_callback($data->id))) {
         $entity = (object) $entity;
         $entity->status = 1;
         $save_callback($entity);
+        $messages[] = "Updated status of $form_info[entity] via $load_callback() and $save_callback().";
+
         $result = TRUE;
       }
     }
     // Invoke entity delete multiple callback.
-    elseif (!empty($form_info['entity delete multiple callback'])) {
-      if (function_exists($form_info['entity delete multiple callback'])) {
-        $function = $form_info['entity delete multiple callback'];
-        $function(array($data->id));
+    elseif (isset($delete_callback)) {
+      $messages[] = "Attempt to delete $form_info[entity] via $delete_callback().";
+      if (function_exists($delete_callback)) {
+        $delete_callback(array($data->id));
+        $messages[] = "Deleted $form_info[entity] via $delete_callback().";
+
         // Entity delete callbacks do not return success or failure, so we can
         // only assume success.
         $result = TRUE;
       }
     }
     // Programmatically invoke delete confirmation form.
-    elseif (isset($form_info['delete form'])) {
+    elseif (isset($form_info['delete form']) && isset($load_callback)) {
+      $messages[] = "Attempt to delete $form_info[entity] via {$form_info['delete form']} form.";
       if (isset($form_info['delete form file'])) {
         $file = $form_info['delete form file'] + array(
           'type' => 'inc',
@@ -2797,6 +2818,7 @@ function mollom_moderate($data, $action) {
           'name' => NULL,
         );
         module_load_include($file['type'], $file['module'], $file['name']);
+        $messages[] = "Loaded {$file['name']}.{$file['type']} in {$file['module']}.";
       }
       // Programmatic form submissions are not able to automatically use the
       // primary form submit button/action, so we need to resemble
@@ -2806,7 +2828,7 @@ function mollom_moderate($data, $action) {
       // We assume that all delete confirmation forms take the fully loaded
       // entity as (only) argument.
       $args = array($form_id, &$form_state);
-      $args[] = $form_info['entity loader']($data->id);
+      $args[] = $load_callback($data->id);
       $form = call_user_func_array('drupal_retrieve_form', $args);
 
       $form_state['values'] = array();
@@ -2822,11 +2844,13 @@ function mollom_moderate($data, $action) {
       drupal_prepare_form($form_id, $form, $form_state);
       drupal_process_form($form_id, $form, $form_state);
 
-      // @todo Check actual result.
-      $result = TRUE;
+      $errors = form_get_errors();
+      $result = empty($errors);
     }
   }
 
+  $messages = implode("\n", $messages);
+
   if ($result) {
     _mollom_watchdog(array(
       '%action moderation success for @entity @id' => array(
@@ -2834,26 +2858,28 @@ function mollom_moderate($data, $action) {
         '@entity' => $data->entity,
         '@id' => $data->id,
       ),
-      'Mollom data:<pre>@data</pre>' => array('@data' => (array) $data),
-      'Messages:<pre>@messages</pre>' => array('@messages' => drupal_get_messages()),
     ));
   }
   else {
+    // 400 is not really appropriate, but comes closest.
+    drupal_set_header($_SERVER['SERVER_PROTOCOL'] . ' 400 Unable to process moderation request');
+
     _mollom_watchdog(array(
       '%action moderation failure for @entity @id' => array(
         '%action' => $action,
         '@entity' => $data->entity,
         '@id' => $data->id,
       ),
+      'Form ID:<pre>@form_id</pre>' => array('@form_id' => $data->form_id),
+      'Actions:<pre>@actions</pre>' => array('@actions' => $messages),
       'Mollom data:<pre>@data</pre>' => array('@data' => (array) $data),
       'Mollom form:<pre>@form</pre>' => array('@form' => $form_info),
-      'Messages:<pre>@messages</pre>' => array('@messages' => drupal_get_messages()),
+      'System messages:<pre>@messages</pre>' => array('@messages' => drupal_get_messages()),
     ), WATCHDOG_ERROR);
   }
 
   // Report back result as success status.
   echo (int) $result;
-  exit;
 }
 
 /**
@@ -3015,7 +3041,7 @@ function comment_mollom_form_list() {
     'title' => t('Comment form'),
     'entity' => 'comment',
     //'entity delete multiple callback' => 'comment_mollom_report_delete',
-    'entity loader' => '_comment_load',
+    'entity load callback' => '_comment_load',
     'delete form' => 'comment_confirm_delete',
     'delete form file' => array(
       'name' => 'comment.admin',
diff --git a/tests/mollom.test b/tests/mollom.test
index 4b29f05..3a5b930 100644
--- a/tests/mollom.test
+++ b/tests/mollom.test
@@ -178,7 +178,7 @@ class MollomWebTestCase extends DrupalWebTestCase {
     module_load_include('inc', 'dblog', 'dblog.admin');
 
     $this->messages = array();
-    $result = db_query("SELECT * FROM {watchdog} WHERE type = 'mollom' ORDER BY timestamp ASC");
+    $result = db_query("SELECT * FROM {watchdog} ORDER BY timestamp ASC");
 
     // The comparison logic applied in this function is a bit confusing, since
     // the values of the watchdog severity level constants in Drupal core are
@@ -4014,6 +4014,7 @@ class MollomModerationIntegrationTestCase extends MollomWebTestCase {
   function testModeration() {
     // Also test invalid/unsupported moderation actions.
     $actions = array('approve', 'spam', 'delete', 'invalid', '');
+    $actions = array('spam');
 
     foreach ($actions as $action) {
       // Post something.
diff --git a/tests/mollom_test.module b/tests/mollom_test.module
index 4689189..a44f644 100644
--- a/tests/mollom_test.module
+++ b/tests/mollom_test.module
@@ -15,6 +15,12 @@ function mollom_test_menu() {
     'page arguments' => array('mollom_test_form'),
     'access callback' => TRUE,
   );
+  $items['mollom-test/form/%mollom_test/delete'] = array(
+    'title' => 'Delete Mollom test item',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('mollom_test_delete_form', 2),
+    'access callback' => TRUE,
+  );
   return $items;
 }
 
@@ -35,8 +41,8 @@ function mollom_test_mollom_form_list() {
   $forms['mollom_test_form'] = array(
     'title' => 'Mollom test form',
     'entity' => 'mollom_test',
-    'entity delete multiple callback' => 'mollom_test_delete_multiple',
     'moderation callback' => 'mollom_test_mollom_form_moderation',
+    'delete form' => 'mollom_test_delete_form',
   );
   // The basic test form is identical to the mollom_test_form, but only
   // registers minimal information (e.g., no entity or moderation callback) to
@@ -47,6 +53,13 @@ function mollom_test_mollom_form_list() {
   // Same as above, but supports elements for text analysis.
   $forms['mollom_basic_elements_test_form'] = array(
     'title' => 'Mollom basic elements test form',
+    'entity delete multiple callback' => 'mollom_test_delete_multiple',
+  );
+  // Same as mollom_test_form, but supports an entity delete callback.
+  $forms['mollom_entity_test_form'] = array(
+    'title' => 'Mollom entity test form',
+    'entity' => 'mollom_test',
+    'entity delete multiple callback' => 'mollom_test_delete_multiple',
   );
   return $forms;
 }
@@ -283,3 +296,25 @@ function mollom_test_delete_multiple(array $mids) {
 function mollom_entity_delete($entity, $type) {
   mollom_data_delete('mollom_test', $entity->mid);
 }
+
+/**
+ * Form constructor for deleting a Mollom test item.
+ */
+function mollom_test_delete_form(&$form_state, $record) {
+  $form['mid'] = array('#type' => 'value', '#value' => $record['mid']);
+  return confirm_form($form,
+    t('Are you sure you want to delete the %title?', array('%title' => $record['title'])),
+    'mollom-test/form/' . $record['mid'],
+    NULL,
+    t('Delete')
+  );
+}
+
+/**
+ * Form submission handler for mollom_test_delete_form().
+ */
+function mollom_test_delete_form_submit($form, &$form_state) {
+  mollom_test_delete_multiple(array($form_state['values']['mid']));
+  drupal_set_message('The record has been deleted.');
+  $form_state['redirect'] = 'mollom-test/form';
+}
