diff --git a/BUILD.gn b/BUILD.gn
index e395dad..c56b824 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/fuchsia/zircon.gni")
-import("//build/gn/packages.gni")
 import("//build/testing/platforms.gni")
 
 declare_args() {
@@ -33,6 +32,12 @@
   # A list of package labels to include in the 'base' package set. Used by the
   # board definition rather than the product definition.
   board_package_labels = []
+
+  # Does nothing.
+  #
+  # Will be removed after 30 April 2019.
+  allow_layer_guesswork = false
+  board_packages = []
 }
 
 # Write a file that can be sourced by `fx`.  This file is produced
@@ -65,14 +70,10 @@
     "//build/images:packages",
     "//sdk:core",
   ]
-  if (preinstall_package_labels != []
-      || monolith_package_labels != []
-      || base_package_labels != []
-      || cache_package_labels != []) {
+  if (base_package_labels != [] || cache_package_labels != []) {
     deps += [ "//build/images" ]
   }
-  if (available_package_labels != []
-      || universe_package_labels != []) {
+  if (universe_package_labels != []) {
     deps += [ "//build/images:updates" ]
   }
 }
diff --git a/build/gn/BUILD.gn b/build/gn/BUILD.gn
index e08ab94..d4b1d87 100644
--- a/build/gn/BUILD.gn
+++ b/build/gn/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/compiled_action.gni")
-import("//build/gn/packages.gni")
 
 # Generates breakpad symbol data for unstripped binaries.
 #
diff --git a/build/gn/check-layer-dependencies.py b/build/gn/check-layer-dependencies.py
deleted file mode 100755
index 8d40019..0000000
--- a/build/gn/check-layer-dependencies.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import os
-import subprocess
-import sys
-
-FUCHSIA_ROOT = os.path.dirname(  # $root
-    os.path.dirname(             # build
-    os.path.dirname(             # gn
-    os.path.abspath(__file__))))
-GN = os.path.join(FUCHSIA_ROOT, "buildtools", "gn")
-
-# The layers of the Fuchsia cake
-# Note that these must remain ordered by increasing proximity to the silicon.
-LAYERS = [
-  'topaz',
-  'peridot',
-  'garnet',
-  'zircon',
-]
-
-def main():
-    parser = argparse.ArgumentParser('check-layer-dependencies',
-            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument('--layer',
-                        help='[required] Name of the layer to inspect',
-                        choices=LAYERS)
-    parser.add_argument('--out',
-                        help='Build output directory',
-                        default='out/debug-x64')
-    args = parser.parse_args()
-    layer = args.layer
-    out = args.out
-    if not layer:
-        parser.print_help()
-        return 1
-
-    layer_index = LAYERS.index(layer)
-    create_labels = lambda layers: list(map(lambda l: '//%s' % l, layers))
-    upper_layers = create_labels(LAYERS[0:layer_index])
-    lower_layers = create_labels(LAYERS[layer_index:])
-    public_labels = subprocess.check_output(
-            [GN, 'ls', out, '//%s/public/*' % layer]).splitlines()
-    is_valid = True
-
-    for label in public_labels:
-        deps = subprocess.check_output(
-            [GN, 'desc', out, label, 'deps']).splitlines()
-        for dep in deps:
-            # We should never depend on upper layers.
-            for upper_layer in upper_layers:
-                if dep.startswith(upper_layer):
-                    is_valid = False
-                    print('Upper layer violation')
-                    print('  Label %s' % label)
-                    print('  Dep   %s' % dep)
-            # If we depend on the same layer or a layer below, that dependency
-            # should be located in its layer's public directory.
-            for lower_layer in lower_layers:
-                if (dep.startswith(lower_layer)
-                        and not dep.startswith('%s/public' % lower_layer)):
-                    is_valid = False
-                    print('Lower layer violation')
-                    print('  Label %s' % label)
-                    print('  Dep   %s' % dep)
-    return 0 if is_valid else 1
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/build/gn/find_vendor_repo.py b/build/gn/find_vendor_repo.py
deleted file mode 100755
index c4b3c90..0000000
--- a/build/gn/find_vendor_repo.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import print_function
-
-import argparse
-import os
-import sys
-import xml.etree.ElementTree
-
-
-def main():
-    parser = argparse.ArgumentParser(
-        description='Identify the vendor repository, if specified, in the Jiri manifest file',
-        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    args = parser.parse_args()
-
-    manifest = os.path.join(os.path.dirname(__file__),
-                            os.path.pardir, os.path.pardir, '.jiri_manifest')
-
-    tree = xml.etree.ElementTree.parse(manifest)
-
-    for elt in tree.iter('overrides'):
-      for project in elt.findall('project'):
-        name = project.attrib.get('name', '')
-        if name.startswith('vendor/'):
-            print(name)
-            return 0
-    return 0
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/build/gn/packages.gni b/build/gn/packages.gni
deleted file mode 100644
index 637e3e7c..0000000
--- a/build/gn/packages.gni
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-declare_args() {
-  # If a package is referenced in monolith and in preinstall, monolith takes
-  # priority, and the package will be added to OTA images as part of the
-  # verified boot set of static packages.
-
-  # Does nothing.
-  #
-  # Will be removed after 30 April 2019.
-  allow_layer_guesswork = false
-
-  # These arguments should be set by the board definition gni file.
-
-  # A list of packages included in the monolith from the board definition.
-  # This list is appended with the list from the product definition and any
-  # additional specified packages
-  board_packages = []
-}
-
-monolith = []
-preinstall = []
-available = []
-
-monolith += board_packages
-
-# Resolve all the JSON files and their dependencies
-# into lists of GN labels:
-# monolith - package labels for base system and verified boot image
-# preinstall - package labels for preinstall, but not OTA
-# available - package labels for the install and update repository
-_preprocessed_products = exec_script("preprocess_products.py",
-                                     [
-                                       "--monolith=$monolith",
-                                       "--preinstall=$preinstall",
-                                       "--available=$available",
-                                     ],
-                                     "json")
-
-# Tell GN that the files preprocess_products.py ran are inputs to the
-# generation step, by declaring them as file inputs to a (silly) exec_script
-# invocation.
-exec_script("/bin/sh",
-            [
-              "-c",
-              ":",
-            ],
-            "",
-            _preprocessed_products.files_read)
-
-monolith_package_labels = []
-foreach(pkg, _preprocessed_products.monolith) {
-  monolith_package_labels += [ get_label_info(pkg, "label_no_toolchain") ]
-}
-preinstall_package_labels = []
-foreach(pkg, _preprocessed_products.preinstall) {
-  preinstall_package_labels += [ get_label_info(pkg, "label_no_toolchain") ]
-}
-available_package_labels = []
-foreach(pkg, _preprocessed_products.available) {
-  available_package_labels += [ get_label_info(pkg, "label_no_toolchain") ]
-}
diff --git a/build/gn/paths.py b/build/gn/paths.py
deleted file mode 100644
index a50d9eb..0000000
--- a/build/gn/paths.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import platform
-
-SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
-FUCHSIA_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))
-GN_PATH = os.path.join(FUCHSIA_ROOT, "buildtools", "gn")
-BUILDTOOLS_PATH = os.path.join(FUCHSIA_ROOT, "buildtools", '%s-%s' % (
-    platform.system().lower().replace('darwin', 'mac'),
-    {
-        'x86_64': 'x64',
-        'aarch64': 'arm64',
-    }[platform.machine()],
-))
-DEBUG_OUT_DIR = os.path.join(FUCHSIA_ROOT, "out", "debug-x64")
-RELEASE_OUT_DIR = os.path.join(FUCHSIA_ROOT, "out", "release-x64")
-
-_BUILD_TOOLS = {}
-
-def build_tool(package, tool):
-    """Return the full path of TOOL binary in PACKAGE.
-
-    This will raise an assertion failure if the binary doesn't exist.
-    This function memoizes its results, so there's not much need to
-    cache its results in calling code.
-    """
-
-    path = _BUILD_TOOLS.get((package, tool))
-    if path is None:
-        path = os.path.join(BUILDTOOLS_PATH, package, 'bin', tool)
-        assert os.path.exists(path), "No '%s' tool in '%s'" % (tool, package)
-        _BUILD_TOOLS[package, tool] = path
-    return path
diff --git a/build/gn/prepreprocess_build_packages.py b/build/gn/prepreprocess_build_packages.py
deleted file mode 100755
index 14f5834..0000000
--- a/build/gn/prepreprocess_build_packages.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import json
-import os.path
-import paths
-import sys
-
-
-USE_GN_LABELS = True
-
-
-class PackageImportsResolver:
-    """Recursively resolves imports in build packages. See
-       https://fuchsia.googlesource.com/fuchsia/+/master/docs/development/build/packages.md
-       for more information about build packages.
-
-       An observer may be used to perform additional work whenever an
-       import is resolved. This observer needs to implement a method with this
-       signature:
-
-       def import_resolved(self, config, config_path)
-
-       where config is the JSON file representing the build package.
-
-       If there was an error reading some of the input files, `None` will be
-       returned.
-       """
-
-    def __init__(self, observer=None):
-        self.observer = observer
-        self._errored = False
-
-    def resolve(self, imports):
-        return self.resolve_imports(imports)
-
-    def errored(self):
-        return self._errored
-
-    def resolve_imports(self, import_queue):
-
-        def detect_duplicate_keys(pairs):
-            keys = set()
-            result = {}
-            for k, v in pairs:
-                if k in keys:
-                    raise Exception("Duplicate key %s" % k)
-                keys.add(k)
-                result[k] = v
-            return result
-
-        imported = set(import_queue)
-        while import_queue:
-            config_name = import_queue.pop()
-            config_path = os.path.join(paths.FUCHSIA_ROOT, config_name)
-            if USE_GN_LABELS and not os.path.isfile(config_path):
-                # If the bundle starts with "//", then it is already a label.
-                if config_name.startswith("//"):
-                    self.observer.import_resolved_from_gn(config_name)
-                    continue
-                dir_path = os.path.dirname(config_path)
-                if os.path.isfile(os.path.join(dir_path, "BUILD.gn")):
-                    self.observer.import_resolved_from_gn_legacy(config_name)
-                    continue
-            try:
-                with open(config_path) as f:
-                    try:
-                        config = json.load(f,
-                            object_pairs_hook=detect_duplicate_keys)
-                        self.observer.import_resolved(config, config_path)
-                        for i in config.get("imports", []):
-                            if i not in imported:
-                                import_queue.append(i)
-                                imported.add(i)
-                    except Exception as e:
-                        import traceback
-                        traceback.print_exc()
-                        sys.stderr.write(
-                            "Failed to parse config %s, error %s\n" %
-                            (config_path, str(e)))
-                        self._errored = True
-                        return None
-            except IOError, e:
-                self._errored = True
-                sys.stderr.write("Failed to read package '%s' from '%s'.\n" %
-                                 (config_name, config_path))
-                if "/" not in config_name:
-                    sys.stderr.write("""
-Package names are relative to the root of the source tree but the requested
-path did not contain a '/'. Did you mean 'build/gn/%s' instead?
-    """ % config_name)
-                return None
-        return imported
-
-
-def legacy_config_name_to_label(config_name):
-    parts = config_name.rsplit('/', 1)
-    return "//%s:%s" % (parts[0], parts[1])
-
-
-class PackageLabelObserver:
-    def __init__(self):
-        self.json_result = {
-            'targets': [],
-            'data_deps': [],
-            'host_tests': [],
-            'files_read': [],
-        }
-
-    def import_resolved_from_gn(self, config_name):
-        self.json_result["targets"].append(config_name)
-
-    def import_resolved_from_gn_legacy(self, config_name):
-        self.import_resolved_from_gn(legacy_config_name_to_label(config_name))
-
-    def import_resolved(self, config, config_path):
-        self.json_result['targets'] += config.get('packages', [])
-        self.json_result['data_deps'] += config.get('labels', [])
-        self.json_result['host_tests'] += config.get('host_tests', [])
-        self.json_result['files_read'].append(config_path)
-
-
-def main():
-    parser = argparse.ArgumentParser(description='''
-Determine labels and Fuchsia packages included in the current build.
-''')
-    parser.add_argument('--packages',
-                        help='JSON list of packages',
-                        required=True)
-    args = parser.parse_args()
-
-    observer = PackageLabelObserver()
-    imports_resolver = PackageImportsResolver(observer)
-    imported = imports_resolver.resolve_imports(json.loads(args.packages))
-
-    if imported == None:
-        return 1
-
-    json.dump(observer.json_result, sys.stdout, sort_keys=True)
-
-    return 0
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/build/gn/preprocess_products.py b/build/gn/preprocess_products.py
deleted file mode 100755
index 89adf13..0000000
--- a/build/gn/preprocess_products.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import json
-import os.path
-import paths
-import sys
-from prepreprocess_build_packages import PackageImportsResolver, PackageLabelObserver
-
-
-def preprocess_packages(packages):
-    observer = PackageLabelObserver()
-    imports_resolver = PackageImportsResolver(observer)
-    imported = imports_resolver.resolve_imports(packages)
-
-    if imports_resolver.errored():
-        raise ImportError
-
-    if imported == None:
-        return None
-
-    return observer.json_result
-
-
-def main():
-    parser = argparse.ArgumentParser(description="""
-Merge a list of product definitions to unique lists of GN labels:
-
-monolith   - the list of packages included in the base system images
-preinstall - the list of packages preinstall, but not part of OTA
-available  - the list of packages installable and updatable
-files_read - a list of files used to compute all of the above
-""")
-    parser.add_argument("--monolith",
-                        help="List of package definitions for the monolith",
-                        required=True)
-    parser.add_argument("--preinstall",
-                        help="List of package definitions for preinstalled packages",
-                        required=True)
-    parser.add_argument("--available",
-                        help="List of package definitions for available packages",
-                        required=True)
-    args = parser.parse_args()
-
-    build_packages = {
-        "monolith": set(),
-        "preinstall": set(),
-        "available": set(),
-        "files_read": set(),
-    }
-
-
-    # Parse monolith, preinstall, and available sets.
-    build_packages["monolith"].update(json.loads(args.monolith))
-    build_packages["preinstall"].update(json.loads(args.preinstall))
-    build_packages["available"].update(json.loads(args.available))
-
-    try:
-        monolith_results = preprocess_packages(list(build_packages["monolith"]))
-        preinstall_results = preprocess_packages(list(build_packages["preinstall"]))
-        available_results = preprocess_packages(list(build_packages["available"]))
-    except ImportError:
-        return 1
-
-    for res in (monolith_results, preinstall_results, available_results):
-        if res is None:
-            continue
-        if res["files_read"]:
-            build_packages["files_read"].update(res["files_read"])
-
-    monolith_targets = set(monolith_results["targets"] if monolith_results else ())
-    preinstall_targets = set(preinstall_results["targets"] if preinstall_results else ())
-    available_targets = set(available_results["targets"] if available_results else ())
-
-    # preinstall_targets must not include monolith targets
-    preinstall_targets -= monolith_targets
-
-    # available_targets must include monolith and preinstall targets
-    available_targets |= monolith_targets | preinstall_targets
-
-    print(json.dumps({
-        "monolith": list(monolith_targets),
-        "preinstall": list(preinstall_targets),
-        "available": list(available_targets),
-        "files_read": list(build_packages["files_read"]),
-    }))
-
-    return 0
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/build/images/BUILD.gn b/build/images/BUILD.gn
index 2309c58..2ad8b3b 100644
--- a/build/images/BUILD.gn
+++ b/build/images/BUILD.gn
@@ -7,7 +7,6 @@
 import("//build/config/clang/clang.gni")
 import("//build/config/fuchsia/zbi.gni")
 import("//build/config/fuchsia/zircon.gni")
-import("//build/gn/packages.gni")
 import("//build/images/boot.gni")
 import("//build/images/collect_blob_manifest.gni")
 import("//build/images/custom_signing.gni")
@@ -104,19 +103,19 @@
 group("monolith_packages") {
   testonly = true
   visibility = [ ":*" ]
-  public_deps = monolith_package_labels + [ "//:additional_base_packages" ]
+  public_deps = [ "//:additional_base_packages" ]
 }
 
 group("preinstall_packages") {
   testonly = true
   visibility = [ ":*" ]
-  public_deps = preinstall_package_labels + [ "//:additional_cache_packages" ]
+  public_deps = [ "//:additional_cache_packages" ]
 }
 
 group("available_packages") {
   testonly = true
   visibility = [ ":*" ]
-  public_deps = available_package_labels + [
+  public_deps = [
                   ":monolith_packages",
                   ":preinstall_packages",
                   "//:additional_universe_packages",
diff --git a/docs/development/build/products.md b/docs/development/build/products.md
index 17e5e3a..ec039b9 100644
--- a/docs/development/build/products.md
+++ b/docs/development/build/products.md
@@ -51,17 +51,4 @@
 By convention, the `default` product for a higher layer should be additive
 from the layer below.
 
-## Inspecting Products
-
-As products reference [packages](packages.md) and packages may reference
-other packages, it is useful to be able to inspect the expanded and filtered
-set of build labels that will make up each package set in a product. The
-[preprocess products][preprocess-products-py] script is the tool that
-produces this for the build and can be run by hand:
-
-```bash
-$ python build/gn/preprocess_products.py --products '["garnet/products/default"]'
-```
-
 [products-source]: /products/
-[preprocess-products-py]: /build/gn/preprocess_products.py
