diff --git a/README.md b/README.md
index 75063ce..6ce4bbb 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,7 @@
 ### Project Administrators
 
 * [`autobump`](infra/): Update commit IDs in bitbake recipes to bring in new changes
+* [`openbmc-autobump.py`](infra/): Update commit IDs in bitbake recipes to bring in new changes
 
 ## Sending patches
 
diff --git a/infra/openbmc-autobump.py b/infra/openbmc-autobump.py
new file mode 100755
index 0000000..6716f4f
--- /dev/null
+++ b/infra/openbmc-autobump.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python3
+
+# Contributors Listed Below - COPYRIGHT 2018
+# [+] International Business Machines Corp.
+#
+#
+# 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.
+
+import argparse
+import os
+import sh
+import sys
+
+git = sh.git.bake('--no-pager')
+
+
+def log(msg, args):
+    if args.noisy:
+        sys.stderr.write('{}\n'.format(msg))
+
+
+def git_clone_or_reset(local_name, remote, args):
+    if not os.path.exists(local_name):
+        log('cloning into {}...'.format(local_name), args)
+        git.clone(remote, local_name)
+    else:
+        log('{} exists, updating...'.format(local_name), args)
+        git.fetch(_cwd=local_name)
+        git.reset('--hard', 'FETCH_HEAD', _cwd=local_name)
+
+
+def extract_sha_from_recipe(recipe):
+    with open(recipe) as fp:
+        project = None
+        sha = None
+
+        for line in fp:
+            if 'SRCREV' in line:
+                sha = line.split('=')[-1].replace('"', '').strip()
+            elif '_URI' in line and 'github.com/openbmc' in line:
+                uri = line.split(';')[0].split('=')[-1].replace('"', '').strip()
+                project = uri.split('/')[-1].replace('.git', '')
+
+            if project and sha:
+                return (project, sha)
+
+        raise RuntimeError('No SRCREV or URI found in {}'.format(recipe))
+
+
+def find_candidate_recipes(meta, args):
+    remote_fmt_args = (args.ssh_config_host, meta)
+    remote = 'ssh://{}/openbmc/{}'.format(*remote_fmt_args)
+    try:
+        git_clone_or_reset(meta, remote, args)
+    except sh.ErrorReturnCode as e:
+        log('{}'.format(e), args)
+        return []
+
+    grep_args = ['-l', '-e', '_URI', '--and', '-e', 'github.com/openbmc']
+    try:
+        return git.grep(*grep_args, _cwd=meta).stdout.decode('utf-8').split()
+    except sh.ErrorReturnCode_1:
+        pass
+    except sh.ErrorReturnCode as e:
+        log('{}'.format(e), args)
+
+    return []
+
+
+def find_and_process_bumps(meta, args):
+    candidate_recipes = find_candidate_recipes(meta, args)
+
+    for recipe in candidate_recipes:
+        full_recipe_path = os.path.join(meta, recipe)
+        recipe_basename = os.path.basename(full_recipe_path)
+        project_name, recipe_sha = extract_sha_from_recipe(full_recipe_path)
+
+        remote_fmt_args = (args.ssh_config_host, project_name)
+        remote = 'ssh://{}/openbmc/{}'.format(*remote_fmt_args)
+        ls_remote_args = [remote, 'refs/heads/{}'.format(args.branch)]
+        try:
+            project_sha = git('ls-remote', *ls_remote_args)
+            project_sha = project_sha.stdout.decode('utf-8').split()[0]
+        except sh.ErrorReturnCode as e:
+            log('{}'.format(e), args)
+            continue
+
+        if project_sha == recipe_sha:
+            message_args = (recipe_basename, recipe_sha[:10])
+            print('{} is up to date ({})'.format(*message_args))
+            continue
+
+        change_id = 'autobump {} {} {}'.format(recipe, recipe_sha, project_sha)
+        hash_object_args = ['-t', 'blob', '--stdin']
+        change_id = git(sh.echo(change_id), 'hash-object', *hash_object_args)
+        change_id = 'I{}'.format(change_id.strip())
+
+        query_args = ['query', 'change:{}'.format(change_id)]
+        gerrit_query_result = args.gerrit(*query_args)
+        gerrit_query_result = gerrit_query_result.stdout.decode('utf-8')
+
+        if (change_id in gerrit_query_result):
+            message_args = (recipe_basename, change_id)
+            print('{} {} already exists'.format(*message_args))
+            continue
+
+        message_args = (recipe_basename, recipe_sha[:10], project_sha[:10])
+        print('{} updating from {} to {}'.format(*message_args))
+
+        remote_args = (args.ssh_config_host, project_name)
+        remote = 'ssh://{}/openbmc/{}'.format(*remote_args)
+        git_clone_or_reset(project_name, remote, args)
+
+        try:
+            revlist = '{}..{}'.format(recipe_sha, project_sha)
+            shortlog = git.shortlog(revlist, _cwd=project_name)
+            shortlog = shortlog.stdout.decode('utf-8')
+        except sh.ErrorReturnCode as e:
+            log('{}'.format(e), args)
+            continue
+
+        reset_args = ['--hard', 'origin/{}'.format(args.branch)]
+        git.reset(*reset_args, _cwd=meta)
+
+        recipe_content = None
+        with open(full_recipe_path) as fd:
+            recipe_content = fd.read()
+
+        recipe_content = recipe_content.replace(recipe_sha, project_sha)
+        with open(full_recipe_path, 'w') as fd:
+            fd.write(recipe_content)
+
+        git.add(recipe, _cwd=meta)
+
+        commit_summary_args = (project_name, recipe_sha[:10], project_sha[:10])
+        commit_msg = '{}: srcrev bump {}..{}'.format(*commit_summary_args)
+        commit_msg += '\n\n{}'.format(shortlog)
+        commit_msg += '\n\nChange-Id: {}'.format(change_id)
+
+        git.commit(sh.echo(commit_msg), '-s', '-F', '-', _cwd=meta)
+
+        push_args = ['origin', 'HEAD:refs/for/{}/autobump'.format(args.branch)]
+        git.push(*push_args, _cwd=meta)
+
+
+def main():
+    app_description = '''OpenBMC bitbake recipe bumping tool.
+
+Find bitbake metadata files (recipes) that use the git fetcher
+and check the project repository for newer revisions.
+
+Generate commits that update bitbake metadata files with SRCREV.
+
+Push generated commits to the OpenBMC Gerrit instance for review.
+    '''
+    parser = argparse.ArgumentParser(
+        description=app_description,
+        formatter_class=argparse.RawDescriptionHelpFormatter)
+
+    parser.set_defaults(branch='master')
+    parser.add_argument(
+        '-m', '--meta-repository', dest='meta_repository', action='append',
+        help='meta repository to check for updates')
+    parser.add_argument(
+        '-v', '--verbose', dest='noisy', action='store_true',
+        help='enable verbose status messages')
+    parser.add_argument(
+        'ssh_config_host', metavar='SSH_CONFIG_HOST_ENTRY',
+        help='SSH config host entry for Gerrit connectivity')
+
+    args = parser.parse_args()
+    setattr(args, 'gerrit', sh.ssh.bake(args.ssh_config_host, 'gerrit'))
+
+    metas = getattr(args, 'meta_repository')
+    if metas is None:
+        metas = args.gerrit('ls-projects', '-m', 'meta-')
+        metas = metas.stdout.decode('utf-8').split()
+        metas = [os.path.split(x)[-1] for x in metas]
+
+    for meta in metas:
+        find_and_process_bumps(meta, args)
+
+
+if __name__ == '__main__':
+    sys.exit(0 if main() else 1)
