diff --git a/import-layers/yocto-poky/scripts/oe-depends-dot b/import-layers/yocto-poky/scripts/oe-depends-dot
new file mode 100755
index 0000000..5cec23b
--- /dev/null
+++ b/import-layers/yocto-poky/scripts/oe-depends-dot
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 Wind River Systems, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import os
+import sys
+import argparse
+import logging
+import re
+
+class Dot(object):
+    def __init__(self):
+        parser = argparse.ArgumentParser(
+            description="Analyse recipe-depends.dot generated by bitbake -g",
+            epilog="Use %(prog)s --help to get help")
+        parser.add_argument("dotfile",
+            help = "Specify the dotfile", nargs = 1, action='store', default='')
+        parser.add_argument("-k", "--key",
+            help = "Specify the key, e.g., recipe name",
+            action="store", default='')
+        parser.add_argument("-d", "--depends",
+            help = "Print the key's dependencies",
+            action="store_true", default=False)
+        parser.add_argument("-w", "--why",
+            help = "Print why the key is built",
+            action="store_true", default=False)
+        parser.add_argument("-r", "--remove",
+            help = "Remove duplicated dependencies to reduce the size of the dot files."
+                    " For example, A->B, B->C, A->C, then A->C can be removed.",
+            action="store_true", default=False)
+
+        self.args = parser.parse_args()
+
+        if len(sys.argv) != 3 and len(sys.argv) < 5:
+            print('ERROR: Not enough args, see --help for usage')
+
+    def main(self):
+        #print(self.args.dotfile[0])
+        # The format is {key: depends}
+        depends = {}
+        with open(self.args.dotfile[0], 'r') as f:
+            for line in f.readlines():
+                if ' -> ' not in line:
+                    continue
+                line_no_quotes = line.replace('"', '')
+                m = re.match("(.*) -> (.*)", line_no_quotes)
+                if not m:
+                    print('WARNING: Found unexpected line: %s' % line)
+                    continue
+                key = m.group(1)
+                if key == "meta-world-pkgdata":
+                    continue
+                dep = m.group(2)
+                if key in depends:
+                    if not key in depends[key]:
+                        depends[key].add(dep)
+                    else:
+                        print('WARNING: Fonud duplicated line: %s' % line)
+                else:
+                    depends[key] = set()
+                    depends[key].add(dep)
+
+        if self.args.remove:
+            reduced_depends = {}
+            for k, deps in depends.items():
+                child_deps = set()
+                added = set()
+                # Both direct and indirect depends are already in the dict, so
+                # we don't have to do this recursively.
+                for dep in deps:
+                    if dep in depends:
+                        child_deps |= depends[dep]
+
+                reduced_depends[k] = deps - child_deps
+                outfile= '%s-reduced%s' % (self.args.dotfile[0][:-4], self.args.dotfile[0][-4:])
+            with open(outfile, 'w') as f:
+                print('Saving reduced dot file to %s' % outfile)
+                f.write('digraph depends {\n')
+                for k, v in reduced_depends.items():
+                    for dep in v:
+                        f.write('"%s" -> "%s"\n' % (k, dep))
+                f.write('}\n')
+            sys.exit(0)
+
+        if self.args.key not in depends:
+            print("ERROR: Can't find key %s in %s" % (self.args.key, self.args.dotfile[0]))
+            sys.exit(1)
+
+        if self.args.depends:
+            if self.args.key in depends:
+                print('Depends: %s' % ' '.join(depends[self.args.key]))
+
+        reverse_deps = []
+        if self.args.why:
+            for k, v in depends.items():
+                if self.args.key in v and not k in reverse_deps:
+                    reverse_deps.append(k)
+            print('Because: %s' % ' '.join(reverse_deps))
+
+if __name__ == "__main__":
+    try:
+        dot = Dot()
+        ret = dot.main()
+    except Exception as esc:
+        ret = 1
+        import traceback
+        traceback.print_exc()
+    sys.exit(ret)
