diff --git a/modules/comment/comment.api.php b/modules/comment/comment.api.php
index a486dd9320433abdbe8d36eb42a750db949355a4..9b431e98d142e492ada37edafac6d17bfa281dff 100644
--- a/modules/comment/comment.api.php
+++ b/modules/comment/comment.api.php
@@ -12,37 +12,99 @@
  */
 
 /**
- * Act on comments.
+ * The comment is being inserted.
  *
- * This hook allows modules to extend the comments system.
+ * @param $form_values
+ *   Passes in an array of form values submitted by the user.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_insert(&$form_values) {
+  $nid = $form_values['nid'];
+
+  cache_clear_all_like(drupal_url(array('id' => $nid)));
+}
+
+/**
+ *  The user has just finished editing the comment and is trying to 
+ *  preview or submit it. This hook can be used to check or
+ *  even modify the node. Errors should be set with form_set_error().
  *
- * @param $a1
- *   Dependent on the action being performed.
- *   - For "validate","update","insert", passes in an array of form values submitted by the user.
- *   - For all other operations, passes in the comment the action is being performed on.
- * @param $op
- *   What kind of action is being performed. Possible values:
- *   - "insert": The comment is being inserted.
- *   - "update": The comment is being updated.
- *   - "view": The comment is being viewed. This hook can be used to add additional data to the comment before theming.
- *   - "validate": The user has just finished editing the comment and is
- *     trying to preview or submit it. This hook can be used to check or
- *     even modify the node. Errors should be set with form_set_error().
- *   - "publish": The comment is being published by the moderator.
- *   - "unpublish": The comment is being unpublished by the moderator.
- *   - "delete": The comment is being deleted by the moderator.
+ * @param $form_values
+ *   Passes in an array of form values submitted by the user.
  * @return
- *   Dependent on the action being performed.
- *   - For all other operations, nothing.
+ *   Nothing.
  */
-function hook_comment(&$a1, $op) {
-  if ($op == 'insert' || $op == 'update') {
-    $nid = $a1['nid'];
+function hook_comment_validate(&$form_values) {
+  // if the subject is the same as the comment.
+  if ($form_values['subject'] == $form_values['comment']) {
+    form_set_error('comment', t('you should write more text than in the subject'));
   }
+}
+
+/**
+ * The comment is being updated.
+ *
+ * @param $form_values
+ *   Passes in an array of form values submitted by the user.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_update(&$form_values) {
+  $nid = $form_values['nid'];
 
   cache_clear_all_like(drupal_url(array('id' => $nid)));
 }
 
+/**
+ * The comment is being viewed. This hook can be used to add additional data to the comment before theming.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_view(&$comment) {
+  // how old is the comment
+  $comment->time_ago = time() - $comment->timestamp;
+}
+
+/**
+ * The comment is being published by the moderator.
+ *
+ * @param $form_values
+ *   Passes in an array of form values submitted by the user.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_publish($form_values) {
+  drupal_set_message(t('Comment: @subject has been published', array('@subject' => $form_values['subject'])));
+}
+
+/**
+ * The comment is being unpublished by the moderator.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_unpublish(&$comment) {
+  drupal_set_message(t('Comment: @subject has been unpublished', array('@subject' => $comment->subject)));
+}
+
+/**
+ * The comment is being deleted by the moderator.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_delete(&$comment) {
+  drupal_set_message(t('Comment: @subject has been deleted', array('@subject' => $comment->subject)));
+}
+
 /**
  * @} End of "addtogroup hooks".
  */
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index bafb8059c49edceb79c4bec590cb406586521347..44f648ca341b849ba9bd7159d848911c1da644a2 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -1990,7 +1990,7 @@ function _comment_update_node_statistics($nid) {
 }
 
 /**
- * Invoke a hook_comment() operation in all modules.
+ * Invoke a hook_comment_[$op]() operation in all modules.
  *
  * @param &$comment
  *   A comment object.
@@ -2001,9 +2001,9 @@ function _comment_update_node_statistics($nid) {
  */
 function comment_invoke_comment(&$comment, $op) {
   $return = array();
-  foreach (module_implements('comment') as $module) {
-    $function = $module . '_comment';
-    $result = $function($comment, $op);
+  foreach (module_implements('comment_' . $op) as $module) {
+    $function = $module . '_comment_' . $op;
+    $result = $function($comment);
     if (isset($result) && is_array($result)) {
       $return = array_merge($return, $result);
     }
diff --git a/modules/search/search.module b/modules/search/search.module
index 5c07acb319d59abe635667ff9e52f6c226ec7524..4f13ec0300efea504ff2a9743471e2e09aa94937 100644
--- a/modules/search/search.module
+++ b/modules/search/search.module
@@ -659,19 +659,43 @@ function search_nodeapi_update($node) {
 }
 
 /**
- * Implementation of hook_comment().
+ * Implementation of hook_comment_insert().
  */
-function search_comment($a1, $op) {
-  switch ($op) {
-    // Reindex the node when comments are added or changed
-    case 'insert':
-    case 'update':
-    case 'delete':
-    case 'publish':
-    case 'unpublish':
-      search_touch_node(is_array($a1) ? $a1['nid'] : $a1->nid);
-      break;
-  }
+function search_comment_insert($form_values) {
+  // Reindex the node when comments are added.
+  search_touch_node($form_values['nid']);
+}
+
+/**
+ * Implementation of hook_comment_update().
+ */
+function search_comment_update($form_values) {
+  // Reindex the node when comments are changed.
+  search_touch_node($form_values['nid']);
+}
+
+/**
+ * Implementation of hook_comment_delete().
+ */
+function search_comment_delete($comment) {
+  // Reindex the node when comments are deleted.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Implementation of hook_comment_publish().
+ */
+function search_comment_publish($form_values) {
+  // Reindex the node when comments are published.
+  search_touch_node($form_values['nid']);
+}
+
+/**
+ * Implementation of hook_comment_unpublish().
+ */
+function search_comment_unpublish($comment) {
+  // Reindex the node when comments are unpublished.
+  search_touch_node($comment->nid);
 }
 
 /**
diff --git a/modules/trigger/trigger.module b/modules/trigger/trigger.module
index 0eb4b50fe305a1805c5509d6f6c77df99fba12ac..9979a8b7c21d8fafe971e52a3aed41df2d564c13 100644
--- a/modules/trigger/trigger.module
+++ b/modules/trigger/trigger.module
@@ -303,15 +303,45 @@ function _trigger_normalize_comment_context($type, $comment) {
 }
 
 /**
- * Implementation of hook_comment().
+ * Implementation of hook_comment_insert().
  */
-function trigger_comment($a1, $op) {
+function trigger_comment_insert($form_values) {
+  _trigger_coment($form_values, 'insert');
+}
+
+/**
+ * Implementation of hook_comment_update().
+ */
+function trigger_comment_update($form_values) {
+  _trigger_coment($form_values, 'update');
+}
+
+/**
+ * Implementation of hook_comment_delete().
+ */
+function trigger_comment_delete($comment) {
+  _trigger_coment($comment, 'delete');
+}
+
+/**
+ * Implementation of hook_comment_view().
+ */
+function trigger_comment_view($comment) {
+  _trigger_coment($comment, 'view');
+}
+
+/**
+ * Helper function for implementations of hook_comment_op().
+ *
+ * @param $a1
+ *   Argument, which will be passed to the action.
+ *   It can be a array of form values or a comment.
+ * @param $op
+ *   What kind of action is being performed.
+ */
+function _trigger_comment($a1, $op) {
   // Keep objects for reuse so that changes actions make to objects can persist.
   static $objects;
-  // We support a subset of operations.
-  if (!in_array($op, array('insert', 'update', 'delete', 'view'))) {
-    return;
-  }
   $aids = _trigger_get_hook_aids('comment', $op);
   $context = array(
     'hook' => 'comment',
diff --git a/modules/user/user.module b/modules/user/user.module
index 366e92a4f5db4e2847e4eac7b67420aa6dce1b3f..d0710f739ba5524ac192c6f8c91ddd82aeb07492 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -2037,17 +2037,14 @@ function user_forms() {
 }
 
 /**
- * Implementation of hook_comment().
+ * Implementation of hook_comment_view().
  */
-function user_comment(&$comment, $op) {
-  // Validate signature.
-  if ($op == 'view') {
-    if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
-      $comment->signature = check_markup($comment->signature, $comment->format);
-    }
-    else {
-      $comment->signature = '';
-    }
+function user_comment_view(&$comment) {
+  if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
+    $comment->signature = check_markup($comment->signature, $comment->format);
+  }
+  else {
+    $comment->signature = '';
   }
 }