diff --git a/tools/diff_package_overlays.py b/tools/diff_package_overlays.py
new file mode 100755
index 0000000..0e2c773
--- /dev/null
+++ b/tools/diff_package_overlays.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# 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.
+
+"""
+Prints to stdout the package names that have overlay changes between
+current_overlays.txt and previous_overlays.txt.
+
+Usage: diff_package_overlays.py <current_packages.txt> <current_overlays.txt> <previous_overlays.txt>
+current_packages.txt contains all package names separated by space in the current build.
+This script modfies current_packages.txt if necessary: if there is a package in
+previous_overlays.txt but absent from current_packages.txt, we copy that line
+from previous_overlays.txt over to current_packages.txt. Usually that means we
+just don't care that package in the current build (for example we are switching
+from a full build to a partial build with mm/mmm), and we should carry on the
+previous overlay config so current_overlays.txt always reflects the current
+status of the entire tree.
+
+Format of current_overlays.txt and previous_overlays.txt:
+  <package_name> <resource_overlay> [resource_overlay ...]
+  <package_name> <resource_overlay> [resource_overlay ...]
+  ...
+"""
+
+import sys
+
+def main(argv):
+  if len(argv) != 4:
+    print >> sys.stderr, __doc__
+    sys.exit(1)
+
+  f = open(argv[1])
+  all_packages = set(f.read().split())
+  f.close()
+
+  def load_overlay_config(filename):
+    f = open(filename)
+    result = {}
+    for line in f:
+      line = line.strip()
+      if not line or line.startswith("#"):
+        continue
+      words = line.split()
+      result[words[0]] = " ".join(words[1:])
+    f.close()
+    return result
+
+  current_overlays = load_overlay_config(argv[2])
+  previous_overlays = load_overlay_config(argv[3])
+
+  result = []
+  carryon = []
+  for p in current_overlays:
+    if p not in previous_overlays:
+      result.append(p)
+    elif current_overlays[p] != previous_overlays[p]:
+      result.append(p)
+  for p in previous_overlays:
+    if p not in current_overlays:
+      if p in all_packages:
+        # overlay changed
+        result.append(p)
+      else:
+        # we don't build p in the current build.
+        carryon.append(p)
+
+  # Add carryon to the current overlay config file.
+  if carryon:
+    f = open(argv[2], "a")
+    for p in carryon:
+      f.write(p + " " + previous_overlays[p] + "\n")
+    f.close()
+
+  # Print out the package names that have overlay change.
+  for r in result:
+    print r
+
+if __name__ == "__main__":
+  main(sys.argv)
