diff --git a/notify_impact.py b/notify_impact.py
new file mode 100755
index 0000000..5c8ba8c
--- /dev/null
+++ b/notify_impact.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+# Copyright (c) 2012 OpenStack, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# This is designed to be called by a gerrit hook.  It searched new
+# patchsets for strings like "bug FOO" and updates corresponding Launchpad
+# bugs status.
+
+import argparse
+import re
+import subprocess
+import smtplib
+
+from email.mime.text import MIMEText
+
+BASE_DIR = '/home/gerrit2/review_site'
+EMAIL_TEMPLATE = """
+Hi, I'd like you to take a look at this patch for potential
+%s.
+%s
+
+Log:
+%s
+"""
+
+def process_impact(git_log, args):
+    """Notify mail list of impact"""
+    email_content = EMAIL_TEMPLATE % (args.impact, args.change_url, git_log)
+    msg = MIMEText(email_content)
+    msg['Subject'] = '[%s] %s review request change %s' % \
+        (args.project, args.impact, args.change)
+    msg['From'] = 'gerrit2@review.openstack.org'
+    msg['To'] = args.dest_address
+
+    s = smtplib.SMTP('localhost')
+    s.sendmail('gerrit2@review.openstack.org',
+               args.dest_address, msg.as_string())
+    s.quit()
+
+def impacted(git_log, impact_string):
+    """Determine if a changes log indicates there is an impact"""
+    return re.search(impact_string, git_log, re.IGNORECASE)
+
+def extract_git_log(args):
+    """Extract git log of all merged commits"""
+    cmd = ['git',
+           '--git-dir=' + BASE_DIR + '/git/' + args.project + '.git',
+           'log', '--no-merges', args.commit + '^1..' + args.commit]
+    return subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('hook')
+    #common
+    parser.add_argument('--change', default=None)
+    parser.add_argument('--change-url', default=None)
+    parser.add_argument('--project', default=None)
+    parser.add_argument('--branch', default=None)
+    parser.add_argument('--commit', default=None)
+    #change-merged
+    parser.add_argument('--submitter', default=None)
+    #patchset-created
+    parser.add_argument('--uploader', default=None)
+    parser.add_argument('--patchset', default=None)
+    # Not passed by gerrit:
+    parser.add_argument('--impact', default=None)
+    parser.add_argument('--dest-address', default=None)
+
+    args = parser.parse_args()
+
+    # Get git log
+    git_log = extract_git_log(args)
+
+    # Process impacts found in git log
+    if impacted(git_log, args.impact):
+        process_impact(git_log, args)
+
+
+if __name__ == '__main__':
+    main()
