Index: modules/contact/contact.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.pages.inc,v
retrieving revision 1.16
diff -u -r1.16 contact.pages.inc
--- modules/contact/contact.pages.inc	8 Mar 2009 05:08:22 -0000	1.16
+++ modules/contact/contact.pages.inc	16 Mar 2009 14:43:11 -0000
@@ -151,6 +151,9 @@
   watchdog('mail', '%name-from sent an e-mail regarding %category.', array('%name-from' => $values['name'] . " [$from]", '%category' => $contact['category']));
   drupal_set_message(t('Your message has been sent.'));
 
+  // Fire the contact form trigger with the 'insert' operation.
+  module_invoke_all('contact', 'insert');
+
   // Jump to home page rather than back to contact page to avoid
   // contradictory messages if flood control has been activated.
   $form_state['redirect'] = '';
Index: modules/contact/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v
retrieving revision 1.112
diff -u -r1.112 contact.module
--- modules/contact/contact.module	8 Mar 2009 05:08:22 -0000	1.112
+++ modules/contact/contact.module	16 Mar 2009 14:43:11 -0000
@@ -49,6 +49,21 @@
 }
 
 /**
+ * Implementation of hook_hook_info().
+ */
+function contact_hook_info() {
+  return array(
+    'contact' => array(
+      'contact' => array(
+        'insert' => array(
+          'runs when' => t('After completing the contact form'),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
  * Implementation of hook_menu().
  */
 function contact_menu() {
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.671
diff -u -r1.671 system.module
--- modules/system/system.module	9 Mar 2009 11:44:54 -0000	1.671
+++ modules/system/system.module	16 Mar 2009 14:43:13 -0000
@@ -1602,6 +1602,7 @@
         'comment' => array('view', 'insert', 'update', 'delete'),
         'user' => array('view', 'insert', 'update', 'delete', 'login'),
         'taxonomy' => array('insert', 'update', 'delete'),
+        'contact' => array('insert'),
       ),
     ),
     'system_send_email_action' => array(
@@ -1613,7 +1614,8 @@
         'comment' => array('view', 'insert', 'update', 'delete'),
         'user' => array('view', 'insert', 'update', 'delete', 'login'),
         'taxonomy' => array('insert', 'update', 'delete'),
-      )
+        'contact' => array('insert'),
+      ),
     ),
     'system_block_ip_action' => array(
       'description' => t('Ban IP address of current user'),
@@ -1629,7 +1631,8 @@
         'node' => array('view', 'insert', 'update', 'delete'),
         'comment' => array('view', 'insert', 'update', 'delete'),
         'user' => array('view', 'insert', 'update', 'delete', 'login'),
-      )
+        'contact' => array('insert'),
+      ),
     )
   );
 }
Index: modules/trigger/trigger.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/trigger/trigger.module,v
retrieving revision 1.29
diff -u -r1.29 trigger.module
--- modules/trigger/trigger.module	8 Mar 2009 04:25:07 -0000	1.29
+++ modules/trigger/trigger.module	16 Mar 2009 14:43:14 -0000
@@ -382,6 +382,21 @@
 }
 
 /**
+ * Implementation of hook_trigger_name().
+ */
+function trigger_contact($op) {
+  if ($op == 'insert') {
+    $aids = _trigger_get_hook_aids('contact', $op);
+    $context = array(
+      'hook' => 'contact',
+      'op' => $op,
+   );
+
+   actions_do(array_keys($aids), NULL, $context);
+  }
+}
+
+/**
  * When an action is called in a context that does not match its type,
  * the object that the action expects must be retrieved. For example, when
  * an action that works on nodes is called during the user hook, the
