diff --git a/flag.api.php b/flag.api.php
index dff8521..b230e8f 100644
--- a/flag.api.php
+++ b/flag.api.php
@@ -82,10 +82,8 @@ function hook_flag_options_alter(&$options, $flag) {
 }
 
 /**
- * Act on a flagging.
+ * Act on an object being flagged.
  *
- * @param $op
- *  The operation being performed: one of 'flag' or 'unflag'.
  * @param $flag
  *  The flag object.
  * @param $entity_id
@@ -95,7 +93,23 @@ function hook_flag_options_alter(&$options, $flag) {
  * @param $flagging_id
  *  The id of the flagging in the {flagging} table.
  */
-function hook_flag($op, $flag, $entity_id, $account, $flagging_id) {
+function hook_flag($flag, $entity_id, $account, $flagging_id) {
+
+}
+
+/**
+ * Act on an object being unflagged.
+ *
+ * @param $flag
+ *  The flag object.
+ * @param $entity_id
+ *  The id of the entity the flag is on.
+ * @param $account
+ *  The user account performing the action.
+ * @param $flagging_id
+ *  The id of the flagging in the {flagging} table.
+ */
+function hook_flag_unflag($flag, $entity_id, $account, $flagging_id) {
 
 }
 
diff --git a/flag.module b/flag.module
index 1236cc6..2c1c010 100644
--- a/flag.module
+++ b/flag.module
@@ -1022,31 +1022,58 @@ function flag($action, $flag_name, $entity_id, $account = NULL) {
 }
 
 /**
- * Implements hook_flag(). Trigger actions if any are available.
+ * Implements hook_flag_flag().
  */
-function flag_flag($action, $flag, $entity_id, $account) {
+function flag_flag_flag($flag, $entity_id, $account, $flagging_id) {
   if (module_exists('trigger')) {
-    $context['hook'] = 'flag';
-    $context['account'] = $account;
-    $context['flag'] = $flag;
-    $context['op'] = $action;
-    // We add to the $context all the objects we know about:
-    $context = array_merge($flag->get_relevant_action_objects($entity_id), $context);
-    // The primary object the actions work on.
-    $object = $flag->fetch_entity($entity_id);
-
-    // Generic "all flags" actions.
-    foreach (trigger_get_assigned_actions('flag_' . $action)  as $aid => $action_info) {
-      // The 'if ($aid)' is a safeguard against http://drupal.org/node/271460#comment-886564
-      if ($aid) {
-        actions_do($aid, $object, $context);
-      }
+    flag_flag_trigger('flag', $flag, $entity_id, $account, $flagging_id);
+  }
+}
+
+/**
+ * Implements hook_flag_unflag().
+ */
+function flag_flag_unflag($flag, $entity_id, $account, $flagging_id) {
+  if (module_exists('trigger')) {
+    flag_flag_trigger('unflag', $flag, $entity_id, $account, $flagging_id);
+  }
+}
+
+/**
+ * Trigger actions if any are available.
+ *
+ * @param $op
+ *  The operation being performed: one of 'flag' or 'unflag'.
+ * @param $flag
+ *  The flag object.
+ * @param $entity_id
+ *  The id of the entity the flag is on.
+ * @param $account
+ *  The user account performing the action.
+ * @param $flagging_id
+ *  The id of the flagging in the {flagging} table.
+ */
+function flag_flag_trigger($action, $flag, $entity_id, $account, $flagging_id) {
+  $context['hook'] = 'flag';
+  $context['account'] = $account;
+  $context['flag'] = $flag;
+  $context['op'] = $action;
+  // We add to the $context all the objects we know about:
+  $context = array_merge($flag->get_relevant_action_objects($entity_id), $context);
+  // The primary object the actions work on.
+  $object = $flag->fetch_entity($entity_id);
+
+  // Generic "all flags" actions.
+  foreach (trigger_get_assigned_actions('flag_' . $action)  as $aid => $action_info) {
+    // The 'if ($aid)' is a safeguard against http://drupal.org/node/271460#comment-886564
+    if ($aid) {
+      actions_do($aid, $object, $context);
     }
-    // Actions specifically for this flag.
-    foreach (trigger_get_assigned_actions('flag_' . $action . '_' . $flag->name) as $aid => $action_info) {
-      if ($aid) {
-        actions_do($aid, $object, $context);
-      }
+  }
+  // Actions specifically for this flag.
+  foreach (trigger_get_assigned_actions('flag_' . $action . '_' . $flag->name) as $aid => $action_info) {
+    if ($aid) {
+      actions_do($aid, $object, $context);
     }
   }
 }
diff --git a/includes/flag/flag_flag.inc b/includes/flag/flag_flag.inc
index 748de1d..df49edc 100644
--- a/includes/flag/flag_flag.inc
+++ b/includes/flag/flag_flag.inc
@@ -581,7 +581,7 @@ class flag_flag {
         // delete the {flagging} record.
         $this->_delete_flagging($existing_flagging_id);
         $this->_unflag($entity_id, $uid, $sid);
-        module_invoke_all('flag', 'unflag', $this, $entity_id, $account, $existing_flagging_id);
+        module_invoke_all('flag_unflag', $this, $entity_id, $account, $existing_flagging_id);
         // Invoke Rules event.
         if (module_exists('rules')) {
           $event_name = 'flag_unflagged_' . $this->name;
@@ -611,7 +611,7 @@ class flag_flag {
         // (e.g., when flagging via JavaScript toggle links); in this case
         // Field API will assign the fields their default values.
         $this->_insert_flagging($flagging, $entity_id, $flagging_id);
-        module_invoke_all('flag', 'flag', $this, $entity_id, $account, $flagging_id);
+        module_invoke_all('flag_flag', $this, $entity_id, $account, $flagging_id);
         // Invoke Rules event.
         if (module_exists('rules')) {
           $event_name = 'flag_flagged_' . $this->name;
