diff --git a/poky/scripts/oe-pkgdata-browser b/poky/scripts/oe-pkgdata-browser
new file mode 100755
index 0000000..8d22318
--- /dev/null
+++ b/poky/scripts/oe-pkgdata-browser
@@ -0,0 +1,253 @@
+#! /usr/bin/env python3
+
+import os, sys, enum, ast
+
+scripts_path = os.path.dirname(os.path.realpath(__file__))
+lib_path = scripts_path + '/lib'
+sys.path = sys.path + [lib_path]
+
+import scriptpath
+bitbakepath = scriptpath.add_bitbake_lib_path()
+if not bitbakepath:
+    print("Unable to find bitbake by searching parent directory of this script or PATH")
+    sys.exit(1)
+import bb
+
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk, Gdk, GObject
+
+RecipeColumns = enum.IntEnum("RecipeColumns", {"Recipe": 0})
+PackageColumns = enum.IntEnum("PackageColumns", {"Package": 0, "Size": 1})
+FileColumns = enum.IntEnum("FileColumns", {"Filename": 0, "Size": 1})
+
+import time
+def timeit(f):
+    def timed(*args, **kw):
+        ts = time.time()
+        print ("func:%r calling" % f.__name__)
+        result = f(*args, **kw)
+        te = time.time()
+        print ('func:%r args:[%r, %r] took: %2.4f sec' % \
+          (f.__name__, args, kw, te-ts))
+        return result
+    return timed
+
+def human_size(nbytes):
+    import math
+    suffixes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB']
+    human = nbytes
+    rank = 0
+    if nbytes != 0:
+        rank = int((math.log10(nbytes)) / 3)
+        rank = min(rank, len(suffixes) - 1)
+        human = nbytes / (1000.0 ** rank)
+    f = ('%.2f' % human).rstrip('0').rstrip('.')
+    return '%s %s' % (f, suffixes[rank])
+
+def load(filename, suffix=None):
+    from configparser import ConfigParser
+    from itertools import chain
+
+    parser = ConfigParser()
+    if suffix:
+        parser.optionxform = lambda option: option.replace("_" + suffix, "")
+    with open(filename) as lines:
+        lines = chain(("[fake]",), lines)
+        parser.read_file(lines)
+
+    # TODO extract the data and put it into a real dict so we can transform some
+    # values to ints?
+    return parser["fake"]
+
+def find_pkgdata():
+    import subprocess
+    output = subprocess.check_output(("bitbake", "-e"), universal_newlines=True)
+    for line in output.splitlines():
+        if line.startswith("PKGDATA_DIR="):
+            return line.split("=", 1)[1].strip("\'\"")
+    # TODO exception or something
+    return None
+
+def packages_in_recipe(pkgdata, recipe):
+    """
+    Load the recipe pkgdata to determine the list of runtime packages.
+    """
+    data = load(os.path.join(pkgdata, recipe))
+    packages = data["PACKAGES"].split()
+    return packages
+
+def load_runtime_package(pkgdata, package):
+    return load(os.path.join(pkgdata, "runtime", package), suffix=package)
+
+def recipe_from_package(pkgdata, package):
+    data = load(os.path.join(pkgdata, "runtime", package), suffix=package)
+    return data["PN"]
+
+def summary(data):
+    s = ""
+    s += "{0[PKG]} {0[PKGV]}-{0[PKGR]}\n{0[LICENSE]}\n{0[SUMMARY]}\n".format(data)
+
+    return s
+
+
+class PkgUi():
+    def __init__(self, pkgdata):
+        self.pkgdata = pkgdata
+        self.current_recipe = None
+        self.recipe_iters = {}
+        self.package_iters = {}
+
+        builder = Gtk.Builder()
+        builder.add_from_file(os.path.join(os.path.dirname(__file__), "oe-pkgdata-browser.glade"))
+
+        self.window = builder.get_object("window")
+        self.window.connect("delete-event", Gtk.main_quit)
+
+        self.recipe_store = builder.get_object("recipe_store")
+        self.recipe_view = builder.get_object("recipe_view")
+        self.package_store = builder.get_object("package_store")
+        self.package_view = builder.get_object("package_view")
+
+        # Somehow resizable does not get set via builder xml
+        package_name_column = builder.get_object("package_name_column")
+        package_name_column.set_resizable(True)
+        file_name_column = builder.get_object("file_name_column")
+        file_name_column.set_resizable(True)
+
+        self.recipe_view.get_selection().connect("changed", self.on_recipe_changed)
+        self.package_view.get_selection().connect("changed", self.on_package_changed)
+
+        self.package_store.set_sort_column_id(PackageColumns.Package, Gtk.SortType.ASCENDING)
+        builder.get_object("package_size_column").set_cell_data_func(builder.get_object("package_size_cell"), lambda column, cell, model, iter, data: cell.set_property("text", human_size(model[iter][PackageColumns.Size])))
+
+        self.label = builder.get_object("label1")
+        self.depends_label = builder.get_object("depends_label")
+        self.recommends_label = builder.get_object("recommends_label")
+        self.suggests_label = builder.get_object("suggests_label")
+        self.provides_label = builder.get_object("provides_label")
+
+        self.depends_label.connect("activate-link", self.on_link_activate)
+        self.recommends_label.connect("activate-link", self.on_link_activate)
+        self.suggests_label.connect("activate-link", self.on_link_activate)
+
+        self.file_store = builder.get_object("file_store")
+        self.file_store.set_sort_column_id(FileColumns.Filename, Gtk.SortType.ASCENDING)
+        builder.get_object("file_size_column").set_cell_data_func(builder.get_object("file_size_cell"), lambda column, cell, model, iter, data: cell.set_property("text", human_size(model[iter][FileColumns.Size])))
+
+        self.files_view = builder.get_object("files_scrollview")
+        self.files_label = builder.get_object("files_label")
+
+        self.load_recipes()
+
+        self.recipe_view.set_cursor(Gtk.TreePath.new_first())
+
+        self.window.show()
+
+    def on_link_activate(self, label, url_string):
+        from urllib.parse import urlparse
+        url = urlparse(url_string)
+        if url.scheme == "package":
+            package = url.path
+            recipe = recipe_from_package(self.pkgdata, package)
+
+            it = self.recipe_iters[recipe]
+            path = self.recipe_store.get_path(it)
+            self.recipe_view.set_cursor(path)
+            self.recipe_view.scroll_to_cell(path)
+
+            self.on_recipe_changed(self.recipe_view.get_selection())
+
+            it = self.package_iters[package]
+            path = self.package_store.get_path(it)
+            self.package_view.set_cursor(path)
+            self.package_view.scroll_to_cell(path)
+
+            return True
+        else:
+            return False
+
+    def on_recipe_changed(self, selection):
+        self.package_store.clear()
+        self.package_iters = {}
+
+        (model, it) = selection.get_selected()
+        if not it:
+            return
+
+        recipe = model[it][RecipeColumns.Recipe]
+        packages = packages_in_recipe(self.pkgdata, recipe)
+        for package in packages:
+            # TODO also show PKG after debian-renaming?
+            data = load_runtime_package(self.pkgdata, package)
+            # TODO stash data to avoid reading in on_package_changed
+            self.package_iters[package] = self.package_store.append([package, int(data["PKGSIZE"])])
+
+        package = recipe if recipe in packages else sorted(packages)[0]
+        path = self.package_store.get_path(self.package_iters[package])
+        self.package_view.set_cursor(path)
+        self.package_view.scroll_to_cell(path)
+
+    def on_package_changed(self, selection):
+        self.label.set_text("")
+        self.file_store.clear()
+        self.depends_label.hide()
+        self.recommends_label.hide()
+        self.suggests_label.hide()
+        self.provides_label.hide()
+        self.files_view.hide()
+        self.files_label.hide()
+
+        (model, it) = selection.get_selected()
+        if it is None:
+            return
+
+        package = model[it][PackageColumns.Package]
+        data = load_runtime_package(self.pkgdata, package)
+
+        self.label.set_text(summary(data))
+
+        files = ast.literal_eval(data["FILES_INFO"])
+        if files:
+            self.files_label.set_text("{0} files take {1}.".format(len(files), human_size(int(data["PKGSIZE"]))))
+            self.files_view.show()
+            for filename, size in files.items():
+                self.file_store.append([filename, size])
+        else:
+            self.files_view.hide()
+            self.files_label.set_text("This package has no files.")
+        self.files_label.show()
+
+        def update_deps(field, prefix, label, clickable=True):
+            if field in data:
+                l = []
+                for name, version in bb.utils.explode_dep_versions2(data[field]).items():
+                    if clickable:
+                        l.append("<a href='package:{0}'>{0}</a> {1}".format(name, " ".join(version)).strip())
+                    else:
+                        l.append("{0} {1}".format(name, " ".join(version)).strip())
+                label.set_markup(prefix + ", ".join(l))
+                label.show()
+            else:
+                label.hide()
+        update_deps("RDEPENDS", "Depends: ", self.depends_label)
+        update_deps("RRECOMMENDS", "Recommends: ", self.recommends_label)
+        update_deps("RSUGGESTS", "Suggests: ", self.suggests_label)
+        update_deps("RPROVIDES", "Provides: ", self.provides_label, clickable=False)
+
+    def load_recipes(self):
+        for recipe in sorted(os.listdir(pkgdata)):
+            if os.path.isfile(os.path.join(pkgdata, recipe)):
+                self.recipe_iters[recipe] = self.recipe_store.append([recipe])
+
+if __name__ == "__main__":
+    import argparse
+
+    parser = argparse.ArgumentParser(description='pkgdata browser')
+    parser.add_argument('-p', '--pkgdata', help="Optional location of pkgdata")
+
+    args = parser.parse_args()
+    pkgdata = args.pkgdata if args.pkgdata else find_pkgdata()
+    # TODO assert pkgdata is a directory
+    window = PkgUi(pkgdata)
+    Gtk.main()
