diff --git a/comment_abuse.form.inc b/comment_abuse.form.inc
index e380f64..27bc8ed 100644
--- a/comment_abuse.form.inc
+++ b/comment_abuse.form.inc
@@ -164,9 +164,31 @@ function comment_abuse_complaint_form_validate($form, &$form_state) {
  * Submit complaint form.
  */
 function comment_abuse_complaint_form_submit($form, &$form_state) {
-  module_load_include('inc', 'comment_abuse', 'comment_abuse.pages');
   $cid = $form_state['build_info']['args'][0]['cid'];
-  comment_abuse_content($cid, $form_state);
+
+  $values = $form_state['values'];
+
+  $message = !empty($values['comment_abuse_complaint_message'])
+    ? $values['comment_abuse_complaint_message']
+    : '';
+  $reason =  !empty($values['comment_abuse_complaint_reason'])
+    ? $values['comment_abuse_complaint_reason']
+    : '';
+
+  $data = array('message' => $message, 'reason' => $reason);
+  $js = !empty($form_state['ajax']);
+
+  if ($result = comment_abuse_add_comment_abuse($cid, $data)) {
+    $message = comment_abuse_success_message($cid, $js);
+  }
+  else {
+    $message = comment_abuse_failure_message($cid, $js);
+  }
+
+  drupal_set_message(
+    $message,
+    $result ? 'status' : 'error'
+  );
 }
 
 /**
diff --git a/comment_abuse.module b/comment_abuse.module
index a900773..96a112d 100644
--- a/comment_abuse.module
+++ b/comment_abuse.module
@@ -16,11 +16,10 @@ require_once 'comment_abuse.form.inc';
 function comment_abuse_menu() {
   $items = array();
 
-  $items['comment-abuse/comment/%'] = array(
+  $items['comment-abuse/comment/%/%ctools_js'] = array(
     'page callback' => 'comment_abuse_content',
-    'page arguments' => array(2),
+    'page arguments' => array(2, 3),
     'access arguments' => array('send complaints on comments'),
-    'delivery callback' => 'ajax_deliver',
     'type' => MENU_CALLBACK,
     'file' => 'comment_abuse.pages.inc',
   );
@@ -195,11 +194,19 @@ function comment_abuse_remove_abuses($comment, $context = array()) {
 
 /**
  * Add new abuse for a comment.
+ *
+ * @param $cid int
+ *  Comment identifier
+ * @param $data array
+ *  Abuse data. Could contain:
+ *  - message - Message added to abuse
+ *  - reason  - Abuse reason
+ *
+ * @return bool
  */
-function comment_abuse_add_comment_abuse($cid, $form_state) {
+function comment_abuse_add_comment_abuse($cid, $data = array()) {
   global $user;
 
-  $data = $form_state['values'];
   $user_ip = ip2long(ip_address());
 
   $query = db_select('comment', 'c')
@@ -219,12 +226,13 @@ function comment_abuse_add_comment_abuse($cid, $form_state) {
       array(':uid' => $user->uid)
     );
   }
+
   $result = $query->condition('c.cid', $cid)
     ->isNull('ca.aid')
     ->execute()
     ->fetch();
 
-  if ($result->nid != NULL) {
+  if (!empty($result->nid)) {
     // Insert new abuse in database.
     $aid = db_insert('comment_abuse')
       ->fields(
@@ -232,8 +240,8 @@ function comment_abuse_add_comment_abuse($cid, $form_state) {
           'nid' => $result->nid,
           'cid' => $cid,
           'timestamp' => REQUEST_TIME,
-          'message' => isset($data['comment_abuse_complaint_message']) ? $data['comment_abuse_complaint_message'] : '',
-          'reason' => isset($data['comment_abuse_complaint_reason']) ? $data['comment_abuse_complaint_reason'] : '',
+          'message' => isset($data['message']) ? $data['message'] : '',
+          'reason' => isset($data['reason']) ? $data['reason'] : '',
           'uid' => $user->uid,
           'ip' => $user_ip,
         )
@@ -248,10 +256,15 @@ function comment_abuse_add_comment_abuse($cid, $form_state) {
     $abuse->timestamp = REQUEST_TIME;
     $abuse->uid = $user->uid;
     $abuse->ip = ip_address();
-    $abuse->reason_id = isset($data['comment_abuse_complaint_reason']) ? $data['comment_abuse_complaint_reason'] : '';
-    $abuse->message = isset($data['comment_abuse_complaint_message']) ? $data['comment_abuse_complaint_message'] : '';
+    $abuse->reason_id = isset($data['reason']) ? $data['reason'] : '';
+    $abuse->message = isset($data['message']) ? $data['message'] : '';
     // Invoke hook comment_abuse.
     module_invoke_all('comment_abuse', $abuse);
+    // Invoke Rules event.
+    if (module_exists('rules')) {
+      $comment = comment_load($cid);
+      rules_invoke_event('complaint_insert', $comment);
+    }
 
     return TRUE;
   }
@@ -321,7 +334,7 @@ function comment_abuse_get_link($text, $cid, $popup = NULL) {
   else {
     return l(
       $text,
-      "comment-abuse/comment/$cid",
+      "comment-abuse/comment/$cid/nojs",
       array(
         'attributes' => array(
           'title' => $text,
@@ -550,3 +563,104 @@ function comment_abuse_locale_refresh($textgroup = 'comment_abuse') {
   // Update completed with no issues.
   return TRUE;
 }
+
+/**
+ * Prepare success message for rendering.
+ *
+ * @param $cid integer
+ *  Comment identifier
+ * @param $js boolean
+ *  Determines if we should use an ajax renderer.
+ *
+ * @return string
+ *  Returns string in case if we should render message without JS.
+ *  Otherwise it will break Drupal execution and render collected commands with
+ *  a ajax_render.
+ */
+function comment_abuse_success_message($cid, $js) {
+  $message = comment_abuse_get_text_for('success');
+
+  if ($js) {
+    // Render message as a commands array.
+    $commands[] = ajax_command_replace(
+      '.comment-abuse-' . $cid,
+      '<span class="abuse-notice">' . check_plain($message) . '</span>'
+    );
+
+    $commands[] = ajax_command_remove('#modal-content .messages');
+
+    if (variable_get('comment_abuse_use_popup', 1)) {
+      $commands[] = comment_abuse_ajax_command_replace_wrapper($message, TRUE);
+    }
+    // Render commands.
+    print ajax_render($commands);
+    drupal_exit();
+  }
+  else {
+    return $message;
+  }
+}
+
+/**
+ * Prepare failure message for rendering or render it as JS commands.
+ *
+ * @param $cid integer
+ *  Comment identifier
+ * @param $js boolean
+ *  Determines if we should use an ajax renderer.
+ *
+ * @return string
+ *  Returns string in case if we should render message without JS.
+ *  Otherwise it will break Drupal execution and render collected commands with
+ *  a ajax_render.
+ */
+function comment_abuse_failure_message($cid, $js) {
+  // Check if we didn't receive comment ID. In this case we should alert site
+  // manager about this issue.
+  if (!$cid) {
+    watchdog('Comment Abuse', 'Comment ID is missing');
+  }
+
+  $message = comment_abuse_get_text_for('fail');
+
+  if ($js) {
+    $commands[] = ajax_command_remove('#modal-content .messages');
+    // Render as a command.
+    $commands[] = ajax_command_replace(
+      '.comment-abuse-' . $cid,
+      '<span class="abuse-notice">' . check_plain($message) . '</span>'
+    );
+
+    if (variable_get('comment_abuse_use_popup', 1)) {
+      $commands[] = comment_abuse_ajax_command_replace_wrapper($message, FALSE);
+    }
+    // Render commands.
+    print ajax_render($commands);
+    drupal_exit();
+  }
+  else {
+    return $message;
+  }
+}
+
+/**
+ * Returns command to
+ * @param $message string
+ *  A message to display.
+ * @param $result bool
+ *  Result of the adding abuse.
+ *
+ * @return array.
+ */
+function comment_abuse_ajax_command_replace_wrapper($message, $result = TRUE) {
+  return ajax_command_replace(
+    '#complaint-form-wrapper',
+    theme(
+      'comment_abuse_complaint_popup_result',
+      array(
+        'message' => check_plain($message),
+        'result' => $result,
+      )
+    )
+  );
+}
diff --git a/comment_abuse.pages.inc b/comment_abuse.pages.inc
index 398b4b8..5cabeef 100644
--- a/comment_abuse.pages.inc
+++ b/comment_abuse.pages.inc
@@ -8,67 +8,15 @@
 /**
  * Callback function for abuse comment.
  */
-function comment_abuse_content($cid, $form_state) {
-
-  // Create ajax commands.
-  $commands = array();
-
-  $abuse_result = FALSE;
-  if (!empty($cid)) {
-    // Add new abuse.
-    $abuse_result = comment_abuse_add_comment_abuse($cid, $form_state);
-  }
-
-  if ($abuse_result) {
-    // Translate message.
-    $message = comment_abuse_get_text_for('success');
-
-    // Replace abuse link with received message.
-    $commands[] = ajax_command_replace(
-      '.comment-abuse-' . $cid,
-      '<span class="abuse-notice">' . check_plain($message) . '</span>'
-    );
-
-    // Invoke rules event.
-    if (module_exists('rules')) {
-      $comment = comment_load($cid);
-      rules_invoke_event('complaint_insert', $comment);
-    }
+function comment_abuse_content($cid, $js = TRUE) {
+  if (!empty($cid) && comment_abuse_add_comment_abuse($cid)) {
+    $result = comment_abuse_success_message($cid, $js);
   }
   else {
-    // Translate message.
-    $message = comment_abuse_get_text_for('fail');
-
-    // Replace abuse link with received message.
-    $commands[] = ajax_command_replace(
-      '.comment-abuse-' . $cid,
-      '<span class="abuse-notice">' . check_plain($message) . '</span>'
-    );
+    $result = comment_abuse_failure_message($cid, $js);
   }
 
-  // Remove old error messages.
-  $commands[] = ajax_command_remove('#modal-content .messages');
-
-  // Complaint form mode.
-  if (variable_get('comment_abuse_use_popup', 1)) {
-    $commands[] = ajax_command_replace(
-      '#complaint-form-wrapper',
-      theme(
-        'comment_abuse_complaint_popup_result',
-        array(
-          'message' => check_plain($message),
-          'result' => $abuse_result,
-        )
-      )
-    );
-
-    print ajax_render($commands);
-    drupal_exit();
-  }
-  // Single link mode.
-  else {
-    return array('#type' => 'ajax', '#commands' => $commands);
-  }
+  return $result;
 }
 
 /**
