diff --git a/tools/dev/bin/clean-branches.py b/tools/dev/bin/clean-branches.py
new file mode 100755
index 0000000..3de7cb7
--- /dev/null
+++ b/tools/dev/bin/clean-branches.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+
+from subprocess import check_output
+import sys
+
+def get_merged_branches_by_change_id():
+    '''a list of merged branches, by change id excluding support branches and master'''
+    raw_changeIds = check_output('git log origin/master | grep -i change-id | awk {\' print $2 \'}', shell=True)
+    changeIds = [b.strip() for b in raw_changeIds.split('\n') if b.strip()]
+    raw_branches = check_output('git branch -a', shell=True)
+    branches = [b.strip() for b in raw_branches.split('\n')
+        if b.strip() and not b.startswith('*') and \
+            not b.strip().startswith('onos') and not b.strip().startswith('remotes') and b.strip() != 'master']
+    to_delete = []
+    for branch in branches:
+        raw_local_change_ids = check_output('git show %s | grep -i change-id | awk {\' print $2 \'}' % branch, shell=True)
+        local_change_ids = [ b.strip() for b in raw_local_change_ids.split('\n') if b.strip() ]
+        for local_change_id in local_change_ids:
+            if local_change_id in changeIds and branch not in to_delete:
+                to_delete.append(branch)
+
+    return to_delete
+
+
+def delete_branch(branch):
+    return check_output('git branch -D %s' % branch, shell=True).strip()
+
+
+if __name__ == '__main__':
+    dry_run = '--confirm' not in sys.argv
+    one_by_one = '--one-by-one' in sys.argv
+    to_delete = get_merged_branches_by_change_id()
+    if len(to_delete) == 0:
+        print "Nothing to clean"
+        sys.exit(0)
+    for branch in to_delete:
+        if dry_run:
+            print branch
+        else:
+            if one_by_one:
+                print 'Do you want to delete branch %s [y/N]' % branch
+                ans = raw_input()
+                if ans == 'y' or ans == 'Y':
+                    print delete_branch(branch)
+            else:
+                    print delete_branch(branch)
+    
+    if dry_run:
+        print '*****************************************************************'
+        print 'Did not actually delete anything yet, pass in --confirm to delete'
+        print 
