Snap for 6963596 from 57eacf50cd83dd0919a8b4478bf07fa000c74d5c to sc-d1-release

Change-Id: I96f6b39ca704140e5544a3df8977965b9e56a8a8
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..3b0b4d0
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,11 @@
+# This is the list of Fuchsia Authors.
+
+# Names should be added to this file as one of
+#     Organization's name
+#     Individual's name <submission email address>
+#     Individual's name <submission email address> <email2> <emailN>
+
+Google Inc.
+The Chromium Authors
+The Chromium OS Authors
+The Go Authors
diff --git a/Android.bp.UNUSED b/Android.bp.UNUSED
deleted file mode 100644
index 9c321eb..0000000
--- a/Android.bp.UNUSED
+++ /dev/null
@@ -1,872 +0,0 @@
-// DO NOT EDIT! This file was generated by
-// ../../fuchsia/scripts/gen_sdk_bp.py.
-// Any changes made to this file will be discarded.
-
-cc_defaults {
-    name: "fuchsia_cc_defaults",
-    c_std: "c11",
-    cflags: ["-Wno-unused-parameter"],
-    relative_install_path: "fuchsia",
-
-    // Only enable on fuchsia.
-    enabled: false,
-    target: {
-      fuchsia: {
-        enabled: true,
-      }
-    },
-}
-
-cc_library {
-  name: "libfuchsia.bluetooth.gatt",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.bluetooth.gatt"],
-  fidl_hdrs: ["fuchsia.bluetooth.gatt"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.bluetooth"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.bluetooth"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.bluetooth.gatt",
-  srcs: ["fidl/fuchsia.bluetooth.gatt/client.fidl","fidl/fuchsia.bluetooth.gatt/server.fidl","fidl/fuchsia.bluetooth.gatt/types.fidl"],
-  deps: ["fuchsia.bluetooth"],
-}
-
-cc_library {
-  name: "libfuchsia.bluetooth.le",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.bluetooth.le"],
-  fidl_hdrs: ["fuchsia.bluetooth.le"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.bluetooth.gatt","libfuchsia.bluetooth"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.bluetooth.gatt","libfuchsia.bluetooth"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.bluetooth.le",
-  srcs: ["fidl/fuchsia.bluetooth.le/central.fidl","fidl/fuchsia.bluetooth.le/peripheral.fidl","fidl/fuchsia.bluetooth.le/types.fidl"],
-  deps: ["fuchsia.bluetooth.gatt","fuchsia.bluetooth"],
-}
-
-cc_library {
-  name: "libfuchsia.bluetooth",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.bluetooth"],
-  fidl_hdrs: ["fuchsia.bluetooth"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.bluetooth",
-  srcs: ["fidl/fuchsia.bluetooth/status.fidl","fidl/fuchsia.bluetooth/nullables.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.developer.tiles",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.developer.tiles"],
-  fidl_hdrs: ["fuchsia.developer.tiles"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.app","libfuchsia.sys","libfuchsia.mem","libfuchsia.math"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.app","libfuchsia.sys","libfuchsia.mem","libfuchsia.math"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.developer.tiles",
-  srcs: ["fidl/fuchsia.developer.tiles/tiles.fidl"],
-  deps: ["fuchsia.ui.app","fuchsia.sys","fuchsia.mem","fuchsia.math"],
-}
-
-cc_library {
-  name: "libfuchsia.fonts",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.fonts"],
-  fidl_hdrs: ["fuchsia.fonts"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.fonts",
-  srcs: ["fidl/fuchsia.fonts/font_provider.fidl"],
-  deps: ["fuchsia.mem"],
-}
-
-cc_library {
-  name: "libfuchsia.images",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.images"],
-  fidl_hdrs: ["fuchsia.images"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.images",
-  srcs: ["fidl/fuchsia.images/encoded_image.fidl","fidl/fuchsia.images/image_info.fidl","fidl/fuchsia.images/image_pipe.fidl","fidl/fuchsia.images/memory_type.fidl","fidl/fuchsia.images/presentation_info.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.io",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.io"],
-  fidl_hdrs: ["fuchsia.io"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.io",
-  srcs: ["fidl/fuchsia.io/io.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.ldsvc",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ldsvc"],
-  fidl_hdrs: ["fuchsia.ldsvc"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ldsvc",
-  srcs: ["fidl/fuchsia.ldsvc/ldsvc.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.logger",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.logger"],
-  fidl_hdrs: ["fuchsia.logger"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.logger",
-  srcs: ["fidl/fuchsia.logger/logger.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.math",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.math"],
-  fidl_hdrs: ["fuchsia.math"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.math",
-  srcs: ["fidl/fuchsia.math/math.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.media",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.media"],
-  fidl_hdrs: ["fuchsia.media"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.media",
-  srcs: ["fidl/fuchsia.media/audio.fidl","fidl/fuchsia.media/audio_capturer.fidl","fidl/fuchsia.media/audio_device_enumerator.fidl","fidl/fuchsia.media/audio_renderer.fidl","fidl/fuchsia.media/gain_control.fidl","fidl/fuchsia.media/stream.fidl","fidl/fuchsia.media/stream_type.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.mediacodec",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.mediacodec"],
-  fidl_hdrs: ["fuchsia.mediacodec"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.mediacodec",
-  srcs: ["fidl/fuchsia.mediacodec/codec_common.fidl","fidl/fuchsia.mediacodec/codec_factory.fidl","fidl/fuchsia.mediacodec/codec.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.mem",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.mem"],
-  fidl_hdrs: ["fuchsia.mem"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.mem",
-  srcs: ["fidl/fuchsia.mem/buffer.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.net.http",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.net.http"],
-  fidl_hdrs: ["fuchsia.net.http"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.net.http",
-  srcs: ["fidl/fuchsia.net.http/client.fidl"],
-  deps: ["fuchsia.mem"],
-}
-
-cc_library {
-  name: "libfuchsia.net.oldhttp",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.net.oldhttp"],
-  fidl_hdrs: ["fuchsia.net.oldhttp"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.netstack","libzircon.ethernet","libfuchsia.net","libfuchsia.mem"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.netstack","libzircon.ethernet","libfuchsia.net","libfuchsia.mem"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.net.oldhttp",
-  srcs: ["fidl/fuchsia.net.oldhttp/http_error.fidl","fidl/fuchsia.net.oldhttp/http_header.fidl","fidl/fuchsia.net.oldhttp/http_service.fidl","fidl/fuchsia.net.oldhttp/url_body.fidl","fidl/fuchsia.net.oldhttp/url_loader.fidl","fidl/fuchsia.net.oldhttp/url_request.fidl","fidl/fuchsia.net.oldhttp/url_response.fidl"],
-  deps: ["fuchsia.netstack","zircon.ethernet","fuchsia.net","fuchsia.mem"],
-}
-
-cc_library {
-  name: "libfuchsia.net",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.net"],
-  fidl_hdrs: ["fuchsia.net"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.net",
-  srcs: ["fidl/fuchsia.net/connectivity.fidl","fidl/fuchsia.net/net.fidl","fidl/fuchsia.net/socket.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.netstack",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.netstack"],
-  fidl_hdrs: ["fuchsia.netstack"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libzircon.ethernet","libfuchsia.net"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libzircon.ethernet","libfuchsia.net"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.netstack",
-  srcs: ["fidl/fuchsia.netstack/netstack.fidl"],
-  deps: ["zircon.ethernet","fuchsia.net"],
-}
-
-cc_library {
-  name: "libfuchsia.process",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.process"],
-  fidl_hdrs: ["fuchsia.process"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ldsvc","libfuchsia.io"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ldsvc","libfuchsia.io"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.process",
-  srcs: ["fidl/fuchsia.process/launcher.fidl","fidl/fuchsia.process/resolver.fidl"],
-  deps: ["fuchsia.ldsvc","fuchsia.io"],
-}
-
-cc_library {
-  name: "libfuchsia.simplecamera",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.simplecamera"],
-  fidl_hdrs: ["fuchsia.simplecamera"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.images"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.images"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.simplecamera",
-  srcs: ["fidl/fuchsia.simplecamera/simple_camera.fidl"],
-  deps: ["fuchsia.images"],
-}
-
-cc_library {
-  name: "libfuchsia.sys",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.sys"],
-  fidl_hdrs: ["fuchsia.sys"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.sys",
-  srcs: ["fidl/fuchsia.sys/component_controller.fidl","fidl/fuchsia.sys/environment.fidl","fidl/fuchsia.sys/environment_controller.fidl","fidl/fuchsia.sys/flat_namespace.fidl","fidl/fuchsia.sys/job_provider.fidl","fidl/fuchsia.sys/launcher.fidl","fidl/fuchsia.sys/loader.fidl","fidl/fuchsia.sys/runner.fidl","fidl/fuchsia.sys/service_provider.fidl"],
-  deps: ["fuchsia.mem"],
-}
-
-cc_library {
-  name: "libfuchsia.sysinfo",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.sysinfo"],
-  fidl_hdrs: ["fuchsia.sysinfo"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.sysinfo",
-  srcs: ["fidl/fuchsia.sysinfo/sysinfo.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.ui.app",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.app"],
-  fidl_hdrs: ["fuchsia.ui.app"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.sys","libfuchsia.mem"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.sys","libfuchsia.mem"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.app",
-  srcs: ["fidl/fuchsia.ui.app/view_provider.fidl"],
-  deps: ["fuchsia.sys","fuchsia.mem"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.gfx",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.gfx"],
-  fidl_hdrs: ["fuchsia.ui.gfx"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.math","libfuchsia.images"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.math","libfuchsia.images"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.gfx",
-  srcs: ["fidl/fuchsia.ui.gfx/commands.fidl","fidl/fuchsia.ui.gfx/display_info.fidl","fidl/fuchsia.ui.gfx/events.fidl","fidl/fuchsia.ui.gfx/hit.fidl","fidl/fuchsia.ui.gfx/nodes.fidl","fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl","fidl/fuchsia.ui.gfx/renderer.fidl","fidl/fuchsia.ui.gfx/resources.fidl","fidl/fuchsia.ui.gfx/shapes.fidl","fidl/fuchsia.ui.gfx/types.fidl"],
-  deps: ["fuchsia.mem","fuchsia.math","fuchsia.images"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.input",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.input"],
-  fidl_hdrs: ["fuchsia.ui.input"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.input",
-  srcs: ["fidl/fuchsia.ui.input/commands.fidl","fidl/fuchsia.ui.input/ime_service.fidl","fidl/fuchsia.ui.input/input_connection.fidl","fidl/fuchsia.ui.input/input_device_registry.fidl","fidl/fuchsia.ui.input/input_dispatcher.fidl","fidl/fuchsia.ui.input/input_event_constants.fidl","fidl/fuchsia.ui.input/input_events.fidl","fidl/fuchsia.ui.input/input_reports.fidl","fidl/fuchsia.ui.input/text_editing.fidl","fidl/fuchsia.ui.input/text_input.fidl","fidl/fuchsia.ui.input/usages.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.ui.policy",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.policy"],
-  fidl_hdrs: ["fuchsia.ui.policy"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.viewsv1token","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.mem","libfuchsia.math","libfuchsia.images"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.viewsv1token","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.mem","libfuchsia.math","libfuchsia.images"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.policy",
-  srcs: ["fidl/fuchsia.ui.policy/display_usage.fidl","fidl/fuchsia.ui.policy/presentation.fidl","fidl/fuchsia.ui.policy/presenter.fidl"],
-  deps: ["fuchsia.ui.viewsv1token","fuchsia.ui.input","fuchsia.ui.gfx","fuchsia.mem","fuchsia.math","fuchsia.images"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.scenic",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.scenic"],
-  fidl_hdrs: ["fuchsia.ui.scenic"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.ui.views","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.math","libfuchsia.images","libfuchsia.sys","libfuchsia.ui.vectorial"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.ui.views","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.math","libfuchsia.images","libfuchsia.sys","libfuchsia.ui.vectorial"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.scenic",
-  srcs: ["fidl/fuchsia.ui.scenic/commands.fidl","fidl/fuchsia.ui.scenic/events.fidl","fidl/fuchsia.ui.scenic/scenic.fidl","fidl/fuchsia.ui.scenic/session.fidl"],
-  deps: ["fuchsia.mem","fuchsia.ui.views","fuchsia.ui.input","fuchsia.ui.gfx","fuchsia.math","fuchsia.images","fuchsia.sys","fuchsia.ui.vectorial"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.vectorial",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.vectorial"],
-  fidl_hdrs: ["fuchsia.ui.vectorial"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.vectorial",
-  srcs: ["fidl/fuchsia.ui.vectorial/commands.fidl","fidl/fuchsia.ui.vectorial/events.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.ui.views",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.views"],
-  fidl_hdrs: ["fuchsia.ui.views"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.mem","libfuchsia.math","libfuchsia.images","libfuchsia.sys"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.mem","libfuchsia.math","libfuchsia.images","libfuchsia.sys"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.views",
-  srcs: ["fidl/fuchsia.ui.views/commands.fidl","fidl/fuchsia.ui.views/events.fidl"],
-  deps: ["fuchsia.ui.input","fuchsia.ui.gfx","fuchsia.mem","fuchsia.math","fuchsia.images","fuchsia.sys"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.viewsv1",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.viewsv1"],
-  fidl_hdrs: ["fuchsia.ui.viewsv1"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.ui.viewsv1token","libfuchsia.ui.scenic","libfuchsia.ui.views","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.math","libfuchsia.images","libfuchsia.sys","libfuchsia.ui.vectorial"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.mem","libfuchsia.ui.viewsv1token","libfuchsia.ui.scenic","libfuchsia.ui.views","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.math","libfuchsia.images","libfuchsia.sys","libfuchsia.ui.vectorial"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.viewsv1",
-  srcs: ["fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl","fidl/fuchsia.ui.viewsv1/view_containers.fidl","fidl/fuchsia.ui.viewsv1/view_manager.fidl","fidl/fuchsia.ui.viewsv1/view_properties.fidl","fidl/fuchsia.ui.viewsv1/view_provider.fidl","fidl/fuchsia.ui.viewsv1/view_snapshot.fidl","fidl/fuchsia.ui.viewsv1/view_tree_token.fidl","fidl/fuchsia.ui.viewsv1/view_trees.fidl","fidl/fuchsia.ui.viewsv1/views.fidl"],
-  deps: ["fuchsia.mem","fuchsia.ui.viewsv1token","fuchsia.ui.scenic","fuchsia.ui.views","fuchsia.ui.input","fuchsia.ui.gfx","fuchsia.math","fuchsia.images","fuchsia.sys","fuchsia.ui.vectorial"],
-}
-
-cc_library {
-  name: "libfuchsia.ui.viewsv1token",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.ui.viewsv1token"],
-  fidl_hdrs: ["fuchsia.ui.viewsv1token"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.ui.viewsv1token",
-  srcs: ["fidl/fuchsia.ui.viewsv1token/view_token.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.wlan.minstrel",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.wlan.minstrel"],
-  fidl_hdrs: ["fuchsia.wlan.minstrel"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.wlan.minstrel",
-  srcs: ["fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libfuchsia.wlan.mlme",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.wlan.mlme"],
-  fidl_hdrs: ["fuchsia.wlan.mlme"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.wlan.minstrel","libfuchsia.wlan.stats"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.wlan.minstrel","libfuchsia.wlan.stats"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.wlan.mlme",
-  srcs: ["fidl/fuchsia.wlan.mlme/wlan_mlme.fidl","fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl"],
-  deps: ["fuchsia.wlan.minstrel","fuchsia.wlan.stats"],
-}
-
-cc_library {
-  name: "libfuchsia.wlan.service",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.wlan.service"],
-  fidl_hdrs: ["fuchsia.wlan.service"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.wlan.stats","libfuchsia.wlan.mlme","libfuchsia.wlan.minstrel"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default","libfuchsia.wlan.stats","libfuchsia.wlan.mlme","libfuchsia.wlan.minstrel"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.wlan.service",
-  srcs: ["fidl/fuchsia.wlan.service/wlan_service.fidl"],
-  deps: ["fuchsia.wlan.stats","fuchsia.wlan.mlme","fuchsia.wlan.minstrel"],
-}
-
-cc_library {
-  name: "libfuchsia.wlan.stats",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["fuchsia.wlan.stats"],
-  fidl_hdrs: ["fuchsia.wlan.stats"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "fuchsia.wlan.stats",
-  srcs: ["fidl/fuchsia.wlan.stats/wlan_stats.fidl"],
-  deps: [],
-}
-
-cc_library {
-  name: "libzircon.ethernet",
-  defaults: ["fuchsia_cc_defaults"],
-  fidl_srcs: ["zircon.ethernet"],
-  fidl_hdrs: ["zircon.ethernet"],
-  shared_libs: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-  export_shared_lib_headers: ["libfidl","libfidl_cpp_sync","libzx","libfit","libfidl-async","libasync","libfidl_cpp_base","libfidl_cpp","libasync-default"],
-}
-
-fidl_gen_cc {
-  name: "zircon.ethernet",
-  srcs: ["fidl/zircon.ethernet/ethernet.fidl"],
-  deps: [],
-}
-
-cc_prebuilt_library_shared {
-  name: "libasync-default",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libasync-default.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libasync-default.so"],
-    },
-  },
-  export_include_dirs: ["pkg/async-default/include"]
-}
-
-cc_library {
-  name: "libasync-loop-cpp",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/async-loop-cpp/loop_wrapper.cpp"],
-  local_include_dirs: ["pkg/async-loop-cpp/include"],
-  export_include_dirs: ["pkg/async-loop-cpp/include"],
-  shared_libs: ["libzx","libasync-loop","libasync-default","libasync"],
-  export_shared_lib_headers: ["libzx","libasync-loop","libasync-default","libasync"],
-}
-
-cc_library {
-  name: "libasync-loop",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/async-loop/loop.c"],
-  local_include_dirs: ["pkg/async-loop/include"],
-  export_include_dirs: ["pkg/async-loop/include"],
-  shared_libs: ["libasync-default","libasync"],
-  export_shared_lib_headers: ["libasync-default","libasync"],
-}
-
-cc_library {
-  name: "libasync",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/async/ops.c"],
-  local_include_dirs: ["pkg/async/include"],
-  export_include_dirs: ["pkg/async/include"],
-  shared_libs: [],
-  export_shared_lib_headers: [],
-}
-
-cc_prebuilt_library_shared {
-  name: "libfdio",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libfdio.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libfdio.so"],
-    },
-  },
-  export_include_dirs: ["pkg/fdio/include"]
-}
-
-cc_library {
-  name: "libfidl-async",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fidl-async/bind.c"],
-  local_include_dirs: ["pkg/fidl-async/include"],
-  export_include_dirs: ["pkg/fidl-async/include"],
-  shared_libs: ["libfidl","libasync"],
-  export_shared_lib_headers: ["libfidl","libasync"],
-}
-
-cc_library {
-  name: "libfidl",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fidl/builder.cpp","pkg/fidl/decoding.cpp","pkg/fidl/encoding.cpp","pkg/fidl/epitaph.c","pkg/fidl/formatting.cpp","pkg/fidl/handle_closing.cpp","pkg/fidl/message.cpp","pkg/fidl/message_buffer.cpp","pkg/fidl/message_builder.cpp","pkg/fidl/transport.cpp","pkg/fidl/validating.cpp"],
-  local_include_dirs: ["pkg/fidl/include"],
-  export_include_dirs: ["pkg/fidl/include"],
-  shared_libs: [],
-  export_shared_lib_headers: [],
-}
-
-cc_library {
-  name: "libfidl_cpp",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fidl_cpp/internal/message_handler.cc","pkg/fidl_cpp/internal/message_reader.cc","pkg/fidl_cpp/internal/pending_response.cc","pkg/fidl_cpp/internal/proxy.cc","pkg/fidl_cpp/internal/proxy_controller.cc","pkg/fidl_cpp/internal/stub.cc","pkg/fidl_cpp/internal/stub_controller.cc","pkg/fidl_cpp/internal/weak_stub_controller.cc"],
-  local_include_dirs: ["pkg/fidl_cpp/include"],
-  export_include_dirs: ["pkg/fidl_cpp/include"],
-  shared_libs: ["libzx","libfit","libfidl-async","libfidl","libasync","libasync-default","libfidl_cpp_sync","libfidl_cpp_base"],
-  export_shared_lib_headers: ["libzx","libfit","libfidl-async","libfidl","libasync","libasync-default","libfidl_cpp_sync","libfidl_cpp_base"],
-}
-
-cc_library {
-  name: "libfidl_cpp_base",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fidl_cpp_base/clone.cc","pkg/fidl_cpp_base/coding_traits.cc","pkg/fidl_cpp_base/decoder.cc","pkg/fidl_cpp_base/encoder.cc","pkg/fidl_cpp_base/internal/logging.cc","pkg/fidl_cpp_base/string.cc"],
-  local_include_dirs: ["pkg/fidl_cpp_base/include"],
-  export_include_dirs: ["pkg/fidl_cpp_base/include"],
-  shared_libs: ["libzx","libfidl-async","libfidl","libasync","libfit"],
-  export_shared_lib_headers: ["libzx","libfidl-async","libfidl","libasync","libfit"],
-}
-
-cc_library {
-  name: "libfidl_cpp_sync",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fidl_cpp_sync/internal/synchronous_proxy.cc"],
-  local_include_dirs: ["pkg/fidl_cpp_sync/include"],
-  export_include_dirs: ["pkg/fidl_cpp_sync/include"],
-  shared_libs: ["libzx","libfit","libfidl-async","libfidl","libasync","libfidl_cpp_base"],
-  export_shared_lib_headers: ["libzx","libfit","libfidl-async","libfidl","libasync","libfidl_cpp_base"],
-}
-
-cc_library {
-  name: "libfit",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/fit/promise.cpp","pkg/fit/scheduler.cpp","pkg/fit/sequencer.cpp","pkg/fit/single_threaded_executor.cpp"],
-  local_include_dirs: ["pkg/fit/include"],
-  export_include_dirs: ["pkg/fit/include"],
-  shared_libs: [],
-  export_shared_lib_headers: [],
-}
-
-cc_library {
-  name: "libimages_cpp",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/images_cpp/images.cc"],
-  local_include_dirs: ["pkg/images_cpp/include"],
-  export_include_dirs: ["pkg/images_cpp/include"],
-  shared_libs: ["libfuchsia.images"],
-  export_shared_lib_headers: [],
-}
-
-cc_prebuilt_library_shared {
-  name: "libmemfs",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libmemfs.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libmemfs.so"],
-    },
-  },
-  export_include_dirs: ["pkg/memfs/include"]
-}
-
-cc_library {
-  name: "libscenic_cpp",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/scenic_cpp/commands.cc","pkg/scenic_cpp/host_image_cycler.cc","pkg/scenic_cpp/host_memory.cc","pkg/scenic_cpp/resources.cc","pkg/scenic_cpp/session.cc"],
-  local_include_dirs: ["pkg/scenic_cpp/include"],
-  export_include_dirs: ["pkg/scenic_cpp/include"],
-  shared_libs: ["libfuchsia.ui.scenic","libfuchsia.mem","libfuchsia.ui.views","libfuchsia.ui.input","libfuchsia.ui.gfx","libfuchsia.math","libfuchsia.images","libfuchsia.sys","libfuchsia.ui.vectorial","libzx","libfit","libimages_cpp","libfidl_cpp","libfidl-async","libfidl","libasync","libasync-default","libfidl_cpp_sync","libfidl_cpp_base"],
-  export_shared_lib_headers: ["libzx","libfit","libimages_cpp","libfuchsia.images","libfidl_cpp","libfidl-async","libfidl","libasync","libasync-default","libfidl_cpp_sync","libfidl_cpp_base"],
-}
-
-cc_prebuilt_library_shared {
-  name: "libsvc",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libsvc.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libsvc.so"],
-    },
-  },
-  export_include_dirs: ["pkg/svc/include"]
-}
-
-cc_prebuilt_library_static {
-  name: "libsync_fuchsia",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/lib/libsync.a"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/lib/libsync.a"],
-    },
-  },
-  export_include_dirs: ["pkg/sync/include"]
-}
-
-cc_prebuilt_library_shared {
-  name: "libsyslog",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libsyslog.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libsyslog.so"],
-    },
-  },
-  export_include_dirs: ["pkg/syslog/include"]
-}
-
-cc_prebuilt_library_shared {
-  name: "libtrace-engine",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libtrace-engine.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libtrace-engine.so"],
-    },
-  },
-  export_include_dirs: []
-}
-
-cc_prebuilt_library_shared {
-  name: "libvulkan_fuchsia",
-  defaults: ["fuchsia_cc_defaults"],
-  arch: {
-    x86_64: {
-      srcs: ["arch/x64/dist/libvulkan.so"],
-    },
-    arm64: {
-      srcs: ["arch/arm64/dist/libvulkan.so"],
-    },
-  },
-  export_include_dirs: []
-}
-
-cc_library {
-  name: "libzx",
-  defaults: ["fuchsia_cc_defaults"],
-  srcs: ["pkg/zx/bti.cpp","pkg/zx/channel.cpp","pkg/zx/debuglog.cpp","pkg/zx/event.cpp","pkg/zx/eventpair.cpp","pkg/zx/fifo.cpp","pkg/zx/guest.cpp","pkg/zx/interrupt.cpp","pkg/zx/iommu.cpp","pkg/zx/job.cpp","pkg/zx/log.cpp","pkg/zx/port.cpp","pkg/zx/process.cpp","pkg/zx/profile.cpp","pkg/zx/resource.cpp","pkg/zx/socket.cpp","pkg/zx/thread.cpp","pkg/zx/timer.cpp","pkg/zx/vcpu.cpp","pkg/zx/vmar.cpp","pkg/zx/vmo.cpp"],
-  local_include_dirs: ["pkg/zx/include"],
-  export_include_dirs: ["pkg/zx/include"],
-  shared_libs: [],
-  export_shared_lib_headers: [],
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_bootserver",
-  srcs: ["tools/bootserver"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_far",
-  srcs: ["tools/far"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_fidl-format",
-  srcs: ["tools/fidl-format"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_fidlc",
-  srcs: ["tools/fidlc"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_fidlgen",
-  srcs: ["tools/fidlgen"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_fvm",
-  srcs: ["tools/fvm"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_loglistener",
-  srcs: ["tools/loglistener"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_merkleroot",
-  srcs: ["tools/merkleroot"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_minfs",
-  srcs: ["tools/minfs"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_netaddr",
-  srcs: ["tools/netaddr"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_netcp",
-  srcs: ["tools/netcp"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_netls",
-  srcs: ["tools/netls"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_netruncmd",
-  srcs: ["tools/netruncmd"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_pm",
-  srcs: ["tools/pm"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_zbi",
-  srcs: ["tools/zbi"],
-  host_supported: true,
-}
-
-cc_prebuilt_binary {
-  name: "fuchsia_zxdb",
-  srcs: ["tools/zxdb"],
-  host_supported: true,
-}
-
diff --git a/COPYRIGHT.musl b/COPYRIGHT.musl
new file mode 100644
index 0000000..faebed7
--- /dev/null
+++ b/COPYRIGHT.musl
@@ -0,0 +1,129 @@
+musl as a whole is licensed under the following standard MIT license:
+
+----------------------------------------------------------------------
+Copyright © 2005-2014 Rich Felker, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+----------------------------------------------------------------------
+
+Authors/contributors include:
+
+Alex Dowad
+Alexander Monakov
+Anthony G. Basile
+Arvid Picciani
+Bobby Bingham
+Boris Brezillon
+Brent Cook
+Chris Spiegel
+Clément Vasseur
+Daniel Micay
+Denys Vlasenko
+Emil Renner Berthing
+Felix Fietkau
+Felix Janda
+Gianluca Anzolin
+Hauke Mehrtens
+Hiltjo Posthuma
+Isaac Dunham
+Jaydeep Patil
+Jens Gustedt
+Jeremy Huntwork
+Jo-Philipp Wich
+Joakim Sindholt
+John Spencer
+Josiah Worcester
+Justin Cormack
+Khem Raj
+Kylie McClain
+Luca Barbato
+Luka Perkov
+M Farkas-Dyck (Strake)
+Mahesh Bodapati
+Michael Forney
+Natanael Copa
+Nicholas J. Kain
+orc
+Pascal Cuoq
+Petr Hosek
+Pierre Carrier
+Rich Felker
+Richard Pennington
+Shiz
+sin
+Solar Designer
+Stefan Kristiansson
+Szabolcs Nagy
+Timo Teräs
+Trutz Behn
+Valentin Ochs
+William Haddon
+
+Portions of this software are derived from third-party works licensed
+under terms compatible with the above MIT license:
+
+Much of the math library code (third_party/math/* and
+third_party/complex/*, and third_party/include/libm.h) is
+Copyright © 1993,2004 Sun Microsystems or
+Copyright © 2003-2011 David Schultz or
+Copyright © 2003-2009 Steven G. Kargl or
+Copyright © 2003-2009 Bruce D. Evans or
+Copyright © 2008 Stephen L. Moshier
+and labelled as such in comments in the individual source files. All
+have been licensed under extremely permissive terms.
+
+The smoothsort implementation (third_party/smoothsort/qsort.c) is
+Copyright © 2011 Valentin Ochs and is licensed under an MIT-style
+license.
+
+The x86_64 files in third_party/arch were written by Nicholas J. Kain
+and is licensed under the standard MIT terms.
+
+All other files which have no copyright comments are original works
+produced specifically for use as part of this library, written either
+by Rich Felker, the main author of the library, or by one or more
+contibutors listed above. Details on authorship of individual files
+can be found in the git version control history of the project. The
+omission of copyright and license comments in each file is in the
+interest of source tree size.
+
+In addition, permission is hereby granted for all public header files
+(include/* and arch/*/bits/*) and crt files intended to be linked into
+applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit
+the copyright notice and permission notice otherwise required by the
+license, and to use these files without any requirement of
+attribution. These files include substantial contributions from:
+
+Bobby Bingham
+John Spencer
+Nicholas J. Kain
+Rich Felker
+Richard Pennington
+Stefan Kristiansson
+Szabolcs Nagy
+
+all of whom have explicitly granted such permission.
+
+This file previously contained text expressing a belief that most of
+the files covered by the above exception were sufficiently trivial not
+to be subject to copyright, resulting in confusion over whether it
+negated the permissions granted in the license. In the spirit of
+permissive licensing, and of not having licensing issues being an
+obstacle to adoption, that text has been removed.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..87f152c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright 2019 The Fuchsia Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/PATENTS b/PATENTS
new file mode 100644
index 0000000..2746e78
--- /dev/null
+++ b/PATENTS
@@ -0,0 +1,22 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Fuchsia project.
+
+Google hereby grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this
+section) patent license to make, have made, use, offer to sell, sell,
+import, transfer, and otherwise run, modify and propagate the contents
+of this implementation of Fuchsia, where such license applies only to
+those patent claims, both currently owned by Google and acquired in
+the future, licensable by Google that are necessarily infringed by
+this implementation. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute
+or order or agree to the institution of patent litigation or any other
+patent enforcement activity against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that this
+implementation of Fuchsia constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of
+Fuchsia shall terminate as of the date such litigation is filed.
diff --git a/README.md b/README.md
index b63aee1..4c4c077 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,115 @@
-Fuchsia SDK without the following packages that were removed to save space:
-- zxdb
-- images
+# Fuchsia Integrator Development Kit (IDK)
+
+This archive contains the Fuchsia Integrator Development Kit (IDK),
+which is a small set of Fuchsia-specific libraries and tools required to start
+building and running programs for Fuchsia.
+
+The Fuchsia IDK is not suitable for immediate consumption.
+It does not contain any reference to toolchains or build systems, and in fact
+does not require any specific instance of these.
+While this might be viewed as a drawback, this is actually a feature, an
+integral part of a layered approach to building a fully-functional SDK.
+Even though it is not tied to a particular build system, the IDK contains
+metadata that may be used to produce support for a large variety of build
+systems, thereby producing various SDK distributions.
+Having the IDK cleanly separated from these various distributions allows
+for very flexible release schemes and iteration cycles.
+
+Most developers who wish to build something for Fuchsia should not need to
+deal directly with the IDK.
+They will instead consume a transformed version of it, for instance within the
+development environment and ecosystem supporting a given language runtime.
+Maintainers of development environments who wish to add support for Fuchsia are
+the main audience for the IDK.
+See [the section below](#ingestion) for a description of how to process this
+SDK.
+
+As such, the Fuchsia IDK is the representation of the Fuchsia platform developers'
+contract with other developers who work with Fuchsia.
+While that contract is absolutely necessary, as this IDK contains the very bits
+that are unique to Fuchsia, it is not sufficient and will be complemented by
+other "contracts".
+The Fuchsia IDK is mirroring the Fuchsia platform in that respect: highly
+composable and extensible, with a clear separation of concerns.
+
+## Structure
+
+From this point on, the root of the IDK archive will be referred to as `//`.
+
+### Metadata
+
+Metadata is present throughout this IDK in the form of JSON files.
+Every element in this IDK has its own metadata file: for example, a FIDL library
+`//fidl/fuchsia.foobar` has its metadata encoded in
+`//fidl/fuchsia.foobar/meta.json`.
+
+Every metadata file follows a JSON schema available under `//meta/schemas`: for
+example, a FIDL library's metadata file conforms to
+`//meta/schemas/fidl_library.json`.
+Schemas act as the documentation for the metadata and may be used to facilitate
+the IDK ingestion process.
+
+### Documentation
+
+General documentation is available under [`//docs`](docs/README.md).
+Some individual IDK elements will also provide documentation directly under the
+path where they are hosted in the SDK.
+
+### Target prebuilts
+
+Target prebuilts are hosted under `//arch/<architecture>`.
+This includes a full-fledged sysroot for each available architecture.
+
+### Source libraries
+
+The IDK contains sources for a large number of FIDL libraries (under
+`//fidl`) as well as a few C/C++ libraries (under `//pkg`).
+
+### Host tools
+
+Multiple host-side tools can be found under `//tools`.
+This includes tools for building programs, deploying to a device, debugging,
+etc...
+Some information about how to use these tools can be found under `//docs`.
+
+### Images
+
+`//device` contains metadata describing device configurations matching a given
+version of the IDK.
+This metadata contains pointers to images that can be flashed onto said devices.
+
+
+## Ingestion
+
+This section describes the process of consuming the IDK and turning
+it into a SDK that is specific to a development environment so it can be used
+directly by developers.
+
+The main entry point for the ingestion process is a file at
+`//meta/manifest.json`.
+As with every metadata file in the SDK, the manifest follows a JSON schema which
+is included under `//meta/schemas/manifest.json`.
+
+This file contains a list of all the elements included in this IDK, represented
+by the path to their respective metadata file.
+Each element file is guaranteed to contain a top-level `type` attribute, which
+may be used to apply different treatments to different element types, e.g.
+generating a build file for a FIDL library vs. just moving a host tool to a
+convenient location in the final development environment.
+
+The existence of the various metadata files as well as the exhaustiveness of
+their contents should make it so that the ingestion process may be fully
+automated.
+JSON schemas may even be used to generate code representing the metadata
+containers and let the ingestion program handle idiomatic data structures
+instead of raw JSON representations.
+
+The metadata schemas will evolve over time.
+In order to allow consumers of that metadata to adjust to schema changes, the
+main metadata file contains a property named `schema_version` which is an opaque
+version identifier for these schemas.
+This version identifier will be modified every time the metadata schemas evolve
+in a way that requires the attention of a developer.
+IDK consumers may record the version identifier of the metadata they used to last
+ingest an IDK and compare that version identifier to next SDK's version
+identifier in order to detect when developer action may be required.
diff --git a/arch/arm64/dist/libVkLayer_core_validation.so b/arch/arm64/dist/libVkLayer_core_validation.so
deleted file mode 100755
index 5369287..0000000
--- a/arch/arm64/dist/libVkLayer_core_validation.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libVkLayer_image_pipe_swapchain.so b/arch/arm64/dist/libVkLayer_image_pipe_swapchain.so
deleted file mode 100755
index bdd188d..0000000
--- a/arch/arm64/dist/libVkLayer_image_pipe_swapchain.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libVkLayer_object_tracker.so b/arch/arm64/dist/libVkLayer_object_tracker.so
deleted file mode 100755
index 59ff73b..0000000
--- a/arch/arm64/dist/libVkLayer_object_tracker.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libVkLayer_parameter_validation.so b/arch/arm64/dist/libVkLayer_parameter_validation.so
deleted file mode 100755
index 82c7711..0000000
--- a/arch/arm64/dist/libVkLayer_parameter_validation.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libVkLayer_threading.so b/arch/arm64/dist/libVkLayer_threading.so
deleted file mode 100755
index b763406..0000000
--- a/arch/arm64/dist/libVkLayer_threading.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libVkLayer_unique_objects.so b/arch/arm64/dist/libVkLayer_unique_objects.so
deleted file mode 100755
index 263c719..0000000
--- a/arch/arm64/dist/libVkLayer_unique_objects.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libasync-default.so b/arch/arm64/dist/libasync-default.so
deleted file mode 100755
index c85b195..0000000
--- a/arch/arm64/dist/libasync-default.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libfdio.so b/arch/arm64/dist/libfdio.so
index 1b2841f..dad0003 100755
--- a/arch/arm64/dist/libfdio.so
+++ b/arch/arm64/dist/libfdio.so
Binary files differ
diff --git a/arch/arm64/dist/libmemfs.so b/arch/arm64/dist/libmemfs.so
deleted file mode 100755
index 3b1aa06..0000000
--- a/arch/arm64/dist/libmemfs.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libsvc.so b/arch/arm64/dist/libsvc.so
deleted file mode 100755
index 3cb0539..0000000
--- a/arch/arm64/dist/libsvc.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libsyslog.so b/arch/arm64/dist/libsyslog.so
deleted file mode 100755
index 495e797..0000000
--- a/arch/arm64/dist/libsyslog.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libtrace-engine.so b/arch/arm64/dist/libtrace-engine.so
deleted file mode 100755
index 8ebaf73..0000000
--- a/arch/arm64/dist/libtrace-engine.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/dist/libvulkan.so b/arch/arm64/dist/libvulkan.so
deleted file mode 100755
index edd5b26..0000000
--- a/arch/arm64/dist/libvulkan.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libasync-default.so b/arch/arm64/lib/libasync-default.so
deleted file mode 100755
index 48caaf4..0000000
--- a/arch/arm64/lib/libasync-default.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libfdio.so b/arch/arm64/lib/libfdio.so
index 7d0bf9f..dad0003 100755
--- a/arch/arm64/lib/libfdio.so
+++ b/arch/arm64/lib/libfdio.so
Binary files differ
diff --git a/arch/arm64/lib/libmemfs.so b/arch/arm64/lib/libmemfs.so
deleted file mode 100755
index 170585e..0000000
--- a/arch/arm64/lib/libmemfs.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libsvc.so b/arch/arm64/lib/libsvc.so
deleted file mode 100755
index 3cb0539..0000000
--- a/arch/arm64/lib/libsvc.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libsync.a b/arch/arm64/lib/libsync.a
index caaf384..630b753 100644
--- a/arch/arm64/lib/libsync.a
+++ b/arch/arm64/lib/libsync.a
Binary files differ
diff --git a/arch/arm64/lib/libsyslog.so b/arch/arm64/lib/libsyslog.so
deleted file mode 100755
index 1c2f5c8..0000000
--- a/arch/arm64/lib/libsyslog.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libtrace-engine.so b/arch/arm64/lib/libtrace-engine.so
deleted file mode 100755
index f661692..0000000
--- a/arch/arm64/lib/libtrace-engine.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/lib/libvulkan.so b/arch/arm64/lib/libvulkan.so
deleted file mode 100755
index edd5b26..0000000
--- a/arch/arm64/lib/libvulkan.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/sysroot/debug/libc.so b/arch/arm64/sysroot/debug/libc.so
deleted file mode 100755
index 0bcdcd2..0000000
--- a/arch/arm64/sysroot/debug/libc.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/sysroot/debug/libzircon.so b/arch/arm64/sysroot/debug/libzircon.so
deleted file mode 100755
index 5f4f11a..0000000
--- a/arch/arm64/sysroot/debug/libzircon.so
+++ /dev/null
Binary files differ
diff --git a/arch/arm64/sysroot/dist/lib/asan-ubsan/ld.so.1 b/arch/arm64/sysroot/dist/lib/asan-ubsan/ld.so.1
new file mode 100755
index 0000000..f3600b9
--- /dev/null
+++ b/arch/arm64/sysroot/dist/lib/asan-ubsan/ld.so.1
Binary files differ
diff --git a/arch/arm64/sysroot/dist/lib/asan/ld.so.1 b/arch/arm64/sysroot/dist/lib/asan/ld.so.1
new file mode 100755
index 0000000..826b5a2
--- /dev/null
+++ b/arch/arm64/sysroot/dist/lib/asan/ld.so.1
Binary files differ
diff --git a/arch/arm64/sysroot/dist/lib/ld.so.1 b/arch/arm64/sysroot/dist/lib/ld.so.1
index c414eff..15145aa 100755
--- a/arch/arm64/sysroot/dist/lib/ld.so.1
+++ b/arch/arm64/sysroot/dist/lib/ld.so.1
Binary files differ
diff --git a/arch/arm64/sysroot/include/alloca.h b/arch/arm64/sysroot/include/alloca.h
index c1679dd..7deb5b9 100644
--- a/arch/arm64/sysroot/include/alloca.h
+++ b/arch/arm64/sysroot/include/alloca.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ALLOCA_H_
+#define SYSROOT_ALLOCA_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,3 +17,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ALLOCA_H_
diff --git a/arch/arm64/sysroot/include/ar.h b/arch/arm64/sysroot/include/ar.h
index d20348b..d0d4176 100644
--- a/arch/arm64/sysroot/include/ar.h
+++ b/arch/arm64/sysroot/include/ar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_AR_H_
+#define SYSROOT_AR_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,14 +10,16 @@
 #define ARFMAG "`\n"
 
 struct ar_hdr {
-    char ar_name[16];
-    char ar_date[12];
-    char ar_uid[6], ar_gid[6];
-    char ar_mode[8];
-    char ar_size[10];
-    char ar_fmag[2];
+  char ar_name[16];
+  char ar_date[12];
+  char ar_uid[6], ar_gid[6];
+  char ar_mode[8];
+  char ar_size[10];
+  char ar_fmag[2];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_AR_H_
diff --git a/arch/arm64/sysroot/include/arpa/ftp.h b/arch/arm64/sysroot/include/arpa/ftp.h
index e1b66d3..7d86bec 100644
--- a/arch/arm64/sysroot/include/arpa/ftp.h
+++ b/arch/arm64/sysroot/include/arpa/ftp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_FTP_H_
+#define SYSROOT_ARPA_FTP_H_
 
 #define PRELIM 1
 #define COMPLETE 2
@@ -32,3 +33,5 @@
 char* typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local"};
 char* formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control"};
 #endif
+
+#endif  // SYSROOT_ARPA_FTP_H_
diff --git a/arch/arm64/sysroot/include/arpa/inet.h b/arch/arm64/sysroot/include/arpa/inet.h
index cfb02ea..4fa0af5 100644
--- a/arch/arm64/sysroot/include/arpa/inet.h
+++ b/arch/arm64/sysroot/include/arpa/inet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_INET_H_
+#define SYSROOT_ARPA_INET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -31,3 +32,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ARPA_INET_H_
diff --git a/arch/arm64/sysroot/include/arpa/nameser.h b/arch/arm64/sysroot/include/arpa/nameser.h
index 9218a58..734d205 100644
--- a/arch/arm64/sysroot/include/arpa/nameser.h
+++ b/arch/arm64/sysroot/include/arpa/nameser.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_NAMESER_H_
+#define SYSROOT_ARPA_NAMESER_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,27 +26,27 @@
 #define NS_DEFAULTPORT 53
 
 typedef enum __ns_sect {
-    ns_s_qd = 0,
-    ns_s_zn = 0,
-    ns_s_an = 1,
-    ns_s_pr = 1,
-    ns_s_ns = 2,
-    ns_s_ud = 2,
-    ns_s_ar = 3,
-    ns_s_max = 4
+  ns_s_qd = 0,
+  ns_s_zn = 0,
+  ns_s_an = 1,
+  ns_s_pr = 1,
+  ns_s_ns = 2,
+  ns_s_ud = 2,
+  ns_s_ar = 3,
+  ns_s_max = 4
 } ns_sect;
 
 typedef struct __ns_msg {
-    const unsigned char *_msg, *_eom;
-    uint16_t _id, _flags, _counts[ns_s_max];
-    const unsigned char* _sections[ns_s_max];
-    ns_sect _sect;
-    int _rrnum;
-    const unsigned char* _msg_ptr;
+  const unsigned char *_msg, *_eom;
+  uint16_t _id, _flags, _counts[ns_s_max];
+  const unsigned char* _sections[ns_s_max];
+  ns_sect _sect;
+  int _rrnum;
+  const unsigned char* _msg_ptr;
 } ns_msg;
 
 struct _ns_flagdata {
-    int mask, shift;
+  int mask, shift;
 };
 extern const struct _ns_flagdata _ns_flagdata[];
 
@@ -55,15 +56,15 @@
 #define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
 #define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
 #define ns_msg_getflag(handle, flag) \
-    (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
+  (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
 
 typedef struct __ns_rr {
-    char name[NS_MAXDNAME];
-    uint16_t type;
-    uint16_t rr_class;
-    uint32_t ttl;
-    uint16_t rdlength;
-    const unsigned char* rdata;
+  char name[NS_MAXDNAME];
+  uint16_t type;
+  uint16_t rr_class;
+  uint32_t ttl;
+  uint16_t rdlength;
+  const unsigned char* rdata;
 } ns_rr;
 
 #define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
@@ -74,66 +75,66 @@
 #define ns_rr_rdata(rr) ((rr).rdata + 0)
 
 typedef enum __ns_flag {
-    ns_f_qr,
-    ns_f_opcode,
-    ns_f_aa,
-    ns_f_tc,
-    ns_f_rd,
-    ns_f_ra,
-    ns_f_z,
-    ns_f_ad,
-    ns_f_cd,
-    ns_f_rcode,
-    ns_f_max
+  ns_f_qr,
+  ns_f_opcode,
+  ns_f_aa,
+  ns_f_tc,
+  ns_f_rd,
+  ns_f_ra,
+  ns_f_z,
+  ns_f_ad,
+  ns_f_cd,
+  ns_f_rcode,
+  ns_f_max
 } ns_flag;
 
 typedef enum __ns_opcode {
-    ns_o_query = 0,
-    ns_o_iquery = 1,
-    ns_o_status = 2,
-    ns_o_notify = 4,
-    ns_o_update = 5,
-    ns_o_max = 6
+  ns_o_query = 0,
+  ns_o_iquery = 1,
+  ns_o_status = 2,
+  ns_o_notify = 4,
+  ns_o_update = 5,
+  ns_o_max = 6
 } ns_opcode;
 
 typedef enum __ns_rcode {
-    ns_r_noerror = 0,
-    ns_r_formerr = 1,
-    ns_r_servfail = 2,
-    ns_r_nxdomain = 3,
-    ns_r_notimpl = 4,
-    ns_r_refused = 5,
-    ns_r_yxdomain = 6,
-    ns_r_yxrrset = 7,
-    ns_r_nxrrset = 8,
-    ns_r_notauth = 9,
-    ns_r_notzone = 10,
-    ns_r_max = 11,
-    ns_r_badvers = 16,
-    ns_r_badsig = 16,
-    ns_r_badkey = 17,
-    ns_r_badtime = 18
+  ns_r_noerror = 0,
+  ns_r_formerr = 1,
+  ns_r_servfail = 2,
+  ns_r_nxdomain = 3,
+  ns_r_notimpl = 4,
+  ns_r_refused = 5,
+  ns_r_yxdomain = 6,
+  ns_r_yxrrset = 7,
+  ns_r_nxrrset = 8,
+  ns_r_notauth = 9,
+  ns_r_notzone = 10,
+  ns_r_max = 11,
+  ns_r_badvers = 16,
+  ns_r_badsig = 16,
+  ns_r_badkey = 17,
+  ns_r_badtime = 18
 } ns_rcode;
 
 typedef enum __ns_update_operation {
-    ns_uop_delete = 0,
-    ns_uop_add = 1,
-    ns_uop_max = 2
+  ns_uop_delete = 0,
+  ns_uop_add = 1,
+  ns_uop_max = 2
 } ns_update_operation;
 
 struct ns_tsig_key {
-    char name[NS_MAXDNAME], alg[NS_MAXDNAME];
-    unsigned char* data;
-    int len;
+  char name[NS_MAXDNAME], alg[NS_MAXDNAME];
+  unsigned char* data;
+  int len;
 };
 typedef struct ns_tsig_key ns_tsig_key;
 
 struct ns_tcp_tsig_state {
-    int counter;
-    struct dst_key* key;
-    void* ctx;
-    unsigned char sig[NS_PACKETSZ];
-    int siglen;
+  int counter;
+  struct dst_key* key;
+  void* ctx;
+  unsigned char sig[NS_PACKETSZ];
+  int siglen;
 };
 typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
 
@@ -146,58 +147,58 @@
 #define NS_TSIG_ERROR_FORMERR -12
 
 typedef enum __ns_type {
-    ns_t_invalid = 0,
-    ns_t_a = 1,
-    ns_t_ns = 2,
-    ns_t_md = 3,
-    ns_t_mf = 4,
-    ns_t_cname = 5,
-    ns_t_soa = 6,
-    ns_t_mb = 7,
-    ns_t_mg = 8,
-    ns_t_mr = 9,
-    ns_t_null = 10,
-    ns_t_wks = 11,
-    ns_t_ptr = 12,
-    ns_t_hinfo = 13,
-    ns_t_minfo = 14,
-    ns_t_mx = 15,
-    ns_t_txt = 16,
-    ns_t_rp = 17,
-    ns_t_afsdb = 18,
-    ns_t_x25 = 19,
-    ns_t_isdn = 20,
-    ns_t_rt = 21,
-    ns_t_nsap = 22,
-    ns_t_nsap_ptr = 23,
-    ns_t_sig = 24,
-    ns_t_key = 25,
-    ns_t_px = 26,
-    ns_t_gpos = 27,
-    ns_t_aaaa = 28,
-    ns_t_loc = 29,
-    ns_t_nxt = 30,
-    ns_t_eid = 31,
-    ns_t_nimloc = 32,
-    ns_t_srv = 33,
-    ns_t_atma = 34,
-    ns_t_naptr = 35,
-    ns_t_kx = 36,
-    ns_t_cert = 37,
-    ns_t_a6 = 38,
-    ns_t_dname = 39,
-    ns_t_sink = 40,
-    ns_t_opt = 41,
-    ns_t_apl = 42,
-    ns_t_tkey = 249,
-    ns_t_tsig = 250,
-    ns_t_ixfr = 251,
-    ns_t_axfr = 252,
-    ns_t_mailb = 253,
-    ns_t_maila = 254,
-    ns_t_any = 255,
-    ns_t_zxfr = 256,
-    ns_t_max = 65536
+  ns_t_invalid = 0,
+  ns_t_a = 1,
+  ns_t_ns = 2,
+  ns_t_md = 3,
+  ns_t_mf = 4,
+  ns_t_cname = 5,
+  ns_t_soa = 6,
+  ns_t_mb = 7,
+  ns_t_mg = 8,
+  ns_t_mr = 9,
+  ns_t_null = 10,
+  ns_t_wks = 11,
+  ns_t_ptr = 12,
+  ns_t_hinfo = 13,
+  ns_t_minfo = 14,
+  ns_t_mx = 15,
+  ns_t_txt = 16,
+  ns_t_rp = 17,
+  ns_t_afsdb = 18,
+  ns_t_x25 = 19,
+  ns_t_isdn = 20,
+  ns_t_rt = 21,
+  ns_t_nsap = 22,
+  ns_t_nsap_ptr = 23,
+  ns_t_sig = 24,
+  ns_t_key = 25,
+  ns_t_px = 26,
+  ns_t_gpos = 27,
+  ns_t_aaaa = 28,
+  ns_t_loc = 29,
+  ns_t_nxt = 30,
+  ns_t_eid = 31,
+  ns_t_nimloc = 32,
+  ns_t_srv = 33,
+  ns_t_atma = 34,
+  ns_t_naptr = 35,
+  ns_t_kx = 36,
+  ns_t_cert = 37,
+  ns_t_a6 = 38,
+  ns_t_dname = 39,
+  ns_t_sink = 40,
+  ns_t_opt = 41,
+  ns_t_apl = 42,
+  ns_t_tkey = 249,
+  ns_t_tsig = 250,
+  ns_t_ixfr = 251,
+  ns_t_axfr = 252,
+  ns_t_mailb = 253,
+  ns_t_maila = 254,
+  ns_t_any = 255,
+  ns_t_zxfr = 256,
+  ns_t_max = 65536
 } ns_type;
 
 #define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || (t) == ns_t_mailb || (t) == ns_t_maila)
@@ -207,29 +208,29 @@
 #define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || (t) == ns_t_zxfr)
 
 typedef enum __ns_class {
-    ns_c_invalid = 0,
-    ns_c_in = 1,
-    ns_c_2 = 2,
-    ns_c_chaos = 3,
-    ns_c_hs = 4,
-    ns_c_none = 254,
-    ns_c_any = 255,
-    ns_c_max = 65536
+  ns_c_invalid = 0,
+  ns_c_in = 1,
+  ns_c_2 = 2,
+  ns_c_chaos = 3,
+  ns_c_hs = 4,
+  ns_c_none = 254,
+  ns_c_any = 255,
+  ns_c_max = 65536
 } ns_class;
 
 typedef enum __ns_key_types {
-    ns_kt_rsa = 1,
-    ns_kt_dh = 2,
-    ns_kt_dsa = 3,
-    ns_kt_private = 254
+  ns_kt_rsa = 1,
+  ns_kt_dh = 2,
+  ns_kt_dsa = 3,
+  ns_kt_private = 254
 } ns_key_types;
 
 typedef enum __ns_cert_types {
-    cert_t_pkix = 1,
-    cert_t_spki = 2,
-    cert_t_pgp = 3,
-    cert_t_url = 253,
-    cert_t_oid = 254
+  cert_t_pkix = 1,
+  cert_t_spki = 2,
+  cert_t_pgp = 3,
+  cert_t_url = 253,
+  cert_t_oid = 254
 } ns_cert_types;
 
 #define NS_KEY_TYPEMASK 0xC000
@@ -253,9 +254,9 @@
 #define NS_KEY_RESERVED10 0x0020
 #define NS_KEY_RESERVED11 0x0010
 #define NS_KEY_SIGNATORYMASK 0x000F
-#define NS_KEY_RESERVED_BITMASK                                                  \
-    (NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | \
-     NS_KEY_RESERVED9 | NS_KEY_RESERVED10 | NS_KEY_RESERVED11)
+#define NS_KEY_RESERVED_BITMASK                                                                   \
+  (NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | NS_KEY_RESERVED9 | \
+   NS_KEY_RESERVED10 | NS_KEY_RESERVED11)
 #define NS_KEY_RESERVED_BITMASK2 0xFFFF
 #define NS_ALG_MD5RSA 1
 #define NS_ALG_DH 2
@@ -317,34 +318,34 @@
 #define __BIND 19950621
 
 typedef struct {
-    unsigned id : 16;
+  unsigned id : 16;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned qr : 1;
-    unsigned opcode : 4;
-    unsigned aa : 1;
-    unsigned tc : 1;
-    unsigned rd : 1;
-    unsigned ra : 1;
-    unsigned unused : 1;
-    unsigned ad : 1;
-    unsigned cd : 1;
-    unsigned rcode : 4;
+  unsigned qr : 1;
+  unsigned opcode : 4;
+  unsigned aa : 1;
+  unsigned tc : 1;
+  unsigned rd : 1;
+  unsigned ra : 1;
+  unsigned unused : 1;
+  unsigned ad : 1;
+  unsigned cd : 1;
+  unsigned rcode : 4;
 #else
-    unsigned rd : 1;
-    unsigned tc : 1;
-    unsigned aa : 1;
-    unsigned opcode : 4;
-    unsigned qr : 1;
-    unsigned rcode : 4;
-    unsigned cd : 1;
-    unsigned ad : 1;
-    unsigned unused : 1;
-    unsigned ra : 1;
+  unsigned rd : 1;
+  unsigned tc : 1;
+  unsigned aa : 1;
+  unsigned opcode : 4;
+  unsigned qr : 1;
+  unsigned rcode : 4;
+  unsigned cd : 1;
+  unsigned ad : 1;
+  unsigned unused : 1;
+  unsigned ra : 1;
 #endif
-    unsigned qdcount : 16;
-    unsigned ancount : 16;
-    unsigned nscount : 16;
-    unsigned arcount : 16;
+  unsigned qdcount : 16;
+  unsigned ancount : 16;
+  unsigned nscount : 16;
+  unsigned arcount : 16;
 } HEADER;
 
 #define PACKETSZ NS_PACKETSZ
@@ -446,3 +447,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ARPA_NAMESER_H_
diff --git a/arch/arm64/sysroot/include/arpa/telnet.h b/arch/arm64/sysroot/include/arpa/telnet.h
index d6880cf..2da3eda 100644
--- a/arch/arm64/sysroot/include/arpa/telnet.h
+++ b/arch/arm64/sysroot/include/arpa/telnet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_TELNET_H_
+#define SYSROOT_ARPA_TELNET_H_
 
 #define IAC 255
 #define DONT 254
@@ -23,10 +24,9 @@
 
 #define SYNCH 242
 
-#define telcmds                                                                        \
-    ((char[][6]){                                                                      \
-        "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", \
-        "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0})
+#define telcmds                                                                                    \
+  ((char[][6]){"EOF", "SUSP", "ABORT", "EOR", "SE",   "NOP",  "DMARK", "BRK",  "IP",  "AO", "AYT", \
+               "EC",  "EL",   "GA",    "SB",  "WILL", "WONT", "DO",    "DONT", "IAC", 0})
 
 #define TELCMD_FIRST xEOF
 #define TELCMD_LAST IAC
@@ -176,9 +176,9 @@
 
 #define NSLC 18
 
-#define SLC_NAMELIST                                                                               \
-    "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
-        "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#define SLC_NAMELIST                                                                             \
+  "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+      "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
 #ifdef SLC_NAMES
 char* slc_names[] = {SLC_NAMELIST};
 #else
@@ -256,11 +256,14 @@
 
 #ifdef ENCRYPT_NAMES
 char* encrypt_names[] = {
-    "IS", "SUPPORT", "REPLY", "START", "END", "REQUEST-START",
+    "IS",          "SUPPORT",   "REPLY",     "START", "END", "REQUEST-START",
     "REQUEST-END", "ENC-KEYID", "DEC-KEYID", 0,
 };
 char* enctype_names[] = {
-    "ANY", "DES_CFB64", "DES_OFB64", 0,
+    "ANY",
+    "DES_CFB64",
+    "DES_OFB64",
+    0,
 };
 #else
 extern char* encrypt_names[];
@@ -272,3 +275,5 @@
 
 #define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
 #define ENCTYPE_NAME(x) enctype_names[x]
+
+#endif  // SYSROOT_ARPA_TELNET_H_
diff --git a/arch/arm64/sysroot/include/arpa/tftp.h b/arch/arm64/sysroot/include/arpa/tftp.h
index 3a76d2f..e091368 100644
--- a/arch/arm64/sysroot/include/arpa/tftp.h
+++ b/arch/arm64/sysroot/include/arpa/tftp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_TFTP_H_
+#define SYSROOT_ARPA_TFTP_H_
 
 #define SEGSIZE 512
 #define RRQ 01
@@ -7,13 +8,13 @@
 #define ACK 04
 #define ERROR 05
 struct tftphdr {
-    short th_opcode;
-    union {
-        unsigned short tu_block;
-        short tu_code;
-        char tu_stuff[1];
-    } th_u;
-    char th_data[1];
+  short th_opcode;
+  union {
+    unsigned short tu_block;
+    short tu_code;
+    char tu_stuff[1];
+  } th_u;
+  char th_data[1];
 };
 #define th_block th_u.tu_block
 #define th_code th_u.tu_code
@@ -27,3 +28,5 @@
 #define EBADID 5
 #define EEXISTS 6
 #define ENOUSER 7
+
+#endif  // SYSROOT_ARPA_TFTP_H_
diff --git a/arch/arm64/sysroot/include/bits/aarch64/fenv.h b/arch/arm64/sysroot/include/bits/aarch64/fenv.h
index 6bb1f56..a370540 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/fenv.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/fenv.h
@@ -12,8 +12,8 @@
 typedef unsigned int fexcept_t;
 
 typedef struct {
-    unsigned int __fpcr;
-    unsigned int __fpsr;
+  unsigned int __fpcr;
+  unsigned int __fpsr;
 } fenv_t;
 
 #define FE_DFL_ENV ((const fenv_t*)-1)
diff --git a/arch/arm64/sysroot/include/bits/aarch64/float.h b/arch/arm64/sysroot/include/bits/aarch64/float.h
deleted file mode 100644
index 719c790..0000000
--- a/arch/arm64/sysroot/include/bits/aarch64/float.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#define FLT_EVAL_METHOD 0
-
-#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
-#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
-#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
-#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
-
-#define LDBL_MANT_DIG 113
-#define LDBL_MIN_EXP (-16381)
-#define LDBL_MAX_EXP 16384
-
-#define LDBL_DIG 33
-#define LDBL_MIN_10_EXP (-4931)
-#define LDBL_MAX_10_EXP 4932
-
-#define DECIMAL_DIG 36
diff --git a/arch/arm64/sysroot/include/bits/aarch64/ioctl.h b/arch/arm64/sysroot/include/bits/aarch64/ioctl.h
index f963024..40835ba 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/ioctl.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/ioctl.h
@@ -94,10 +94,10 @@
 #define TIOCSER_TEMT 0x01
 
 struct winsize {
-    unsigned short ws_row;
-    unsigned short ws_col;
-    unsigned short ws_xpixel;
-    unsigned short ws_ypixel;
+  unsigned short ws_row;
+  unsigned short ws_col;
+  unsigned short ws_xpixel;
+  unsigned short ws_ypixel;
 };
 
 #define TIOCM_LE 0x001
diff --git a/arch/arm64/sysroot/include/bits/aarch64/ipc.h b/arch/arm64/sysroot/include/bits/aarch64/ipc.h
index df2ed2b..26161a2 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/ipc.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/ipc.h
@@ -1,14 +1,14 @@
 struct ipc_perm {
-    key_t __ipc_perm_key;
-    uid_t uid;
-    gid_t gid;
-    uid_t cuid;
-    gid_t cgid;
-    mode_t mode;
-    unsigned short __ipc_perm_seq;
+  key_t __ipc_perm_key;
+  uid_t uid;
+  gid_t gid;
+  uid_t cuid;
+  gid_t cgid;
+  mode_t mode;
+  unsigned short __ipc_perm_seq;
 
-    unsigned long __pad1;
-    unsigned long __pad2;
+  unsigned long __pad1;
+  unsigned long __pad2;
 };
 
 #define IPC_64 0
diff --git a/arch/arm64/sysroot/include/bits/aarch64/setjmp.h b/arch/arm64/sysroot/include/bits/aarch64/setjmp.h
index e3db976..c37aeb8 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/setjmp.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/setjmp.h
@@ -1 +1 @@
-typedef unsigned long long int __jmp_buf[22];
+typedef unsigned long long int __jmp_buf[23];
diff --git a/arch/arm64/sysroot/include/bits/aarch64/signal.h b/arch/arm64/sysroot/include/bits/aarch64/signal.h
index 766d3f9..64e57f3 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/signal.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/signal.h
@@ -11,49 +11,51 @@
 typedef unsigned long gregset_t[34];
 
 typedef struct {
-    long double vregs[32];
-    unsigned int fpsr;
-    unsigned int fpcr;
+  long double vregs[32];
+  unsigned int fpsr;
+  unsigned int fpcr;
 } fpregset_t;
 typedef struct sigcontext {
-    unsigned long fault_address;
-    unsigned long regs[31];
-    unsigned long sp, pc, pstate;
-    long double __reserved[256];
+  unsigned long fault_address;
+  unsigned long regs[31];
+  unsigned long sp, pc, pstate;
+  long double __reserved[256];
 } mcontext_t;
 
 #define FPSIMD_MAGIC 0x46508001
 #define ESR_MAGIC 0x45535201
 struct _aarch64_ctx {
-    unsigned int magic;
-    unsigned int size;
+  unsigned int magic;
+  unsigned int size;
 };
 struct fpsimd_context {
-    struct _aarch64_ctx head;
-    unsigned int fpsr;
-    unsigned int fpcr;
-    long double vregs[32];
+  struct _aarch64_ctx head;
+  unsigned int fpsr;
+  unsigned int fpcr;
+  long double vregs[32];
 };
 struct esr_context {
-    struct _aarch64_ctx head;
-    unsigned long esr;
+  struct _aarch64_ctx head;
+  unsigned long esr;
 };
 #else
-typedef struct { long double __regs[18 + 256]; } mcontext_t;
+typedef struct {
+  long double __regs[18 + 256];
+} mcontext_t;
 #endif
 
 struct sigaltstack {
-    void* ss_sp;
-    int ss_flags;
-    size_t ss_size;
+  void* ss_sp;
+  int ss_flags;
+  size_t ss_size;
 };
 
 typedef struct __ucontext {
-    unsigned long uc_flags;
-    struct ucontext* uc_link;
-    stack_t uc_stack;
-    sigset_t uc_sigmask;
-    mcontext_t uc_mcontext;
+  unsigned long uc_flags;
+  struct ucontext* uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  mcontext_t uc_mcontext;
 } ucontext_t;
 
 #define SA_NOCLDSTOP 1
diff --git a/arch/arm64/sysroot/include/bits/aarch64/stat.h b/arch/arm64/sysroot/include/bits/aarch64/stat.h
index 0fe7e69..02102fa 100644
--- a/arch/arm64/sysroot/include/bits/aarch64/stat.h
+++ b/arch/arm64/sysroot/include/bits/aarch64/stat.h
@@ -1,18 +1,18 @@
 struct stat {
-    dev_t st_dev;
-    ino_t st_ino;
-    mode_t st_mode;
-    nlink_t st_nlink;
-    uid_t st_uid;
-    gid_t st_gid;
-    dev_t st_rdev;
-    unsigned long __pad;
-    off_t st_size;
-    blksize_t st_blksize;
-    int __pad2;
-    blkcnt_t st_blocks;
-    struct timespec st_atim;
-    struct timespec st_mtim;
-    struct timespec st_ctim;
-    unsigned __unused[2];
+  dev_t st_dev;
+  ino_t st_ino;
+  mode_t st_mode;
+  nlink_t st_nlink;
+  uid_t st_uid;
+  gid_t st_gid;
+  dev_t st_rdev;
+  unsigned long __pad;
+  off_t st_size;
+  blksize_t st_blksize;
+  int __pad2;
+  blkcnt_t st_blocks;
+  struct timespec st_atim;
+  struct timespec st_mtim;
+  struct timespec st_ctim;
+  unsigned __unused1[2];
 };
diff --git a/arch/arm64/sysroot/include/bits/alltypes.h b/arch/arm64/sysroot/include/bits/alltypes.h
index 21fcb7f..95da44c 100644
--- a/arch/arm64/sysroot/include/bits/alltypes.h
+++ b/arch/arm64/sysroot/include/bits/alltypes.h
@@ -193,8 +193,8 @@
 
 #if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
 typedef struct {
-    long long __ll;
-    long double __ld;
+  long long __ll;
+  long double __ld;
 } max_align_t;
 #define __DEFINED_max_align_t
 #endif
@@ -310,24 +310,24 @@
 
 #if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
 struct iovec {
-    void* iov_base;
-    size_t iov_len;
+  void* iov_base;
+  size_t iov_len;
 };
 #define __DEFINED_struct_iovec
 #endif
 
 #if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
 struct timeval {
-    time_t tv_sec;
-    suseconds_t tv_usec;
+  time_t tv_sec;
+  suseconds_t tv_usec;
 };
 #define __DEFINED_struct_timeval
 #endif
 
 #if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
 struct timespec {
-    time_t tv_sec;
-    long tv_nsec;
+  time_t tv_sec;
+  long tv_nsec;
 };
 #define __DEFINED_struct_timespec
 #endif
@@ -373,7 +373,9 @@
 #endif
 
 #if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
-typedef struct __sigset_t { unsigned long __bits[128 / sizeof(long)]; } sigset_t;
+typedef struct __sigset_t {
+  unsigned long __bits[128 / sizeof(long)];
+} sigset_t;
 #define __DEFINED_sigset_t
 #endif
 
@@ -398,22 +400,30 @@
 #endif
 
 #if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
-typedef struct { unsigned __attr; } pthread_mutexattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_mutexattr_t;
 #define __DEFINED_pthread_mutexattr_t
 #endif
 
 #if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
-typedef struct { unsigned __attr; } pthread_condattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_condattr_t;
 #define __DEFINED_pthread_condattr_t
 #endif
 
 #if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
-typedef struct { unsigned __attr; } pthread_barrierattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_barrierattr_t;
 #define __DEFINED_pthread_barrierattr_t
 #endif
 
 #if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
-typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+typedef struct {
+  unsigned __attr[2];
+} pthread_rwlockattr_t;
 #define __DEFINED_pthread_rwlockattr_t
 #endif
 
@@ -432,31 +442,35 @@
 #endif
 
 #if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
-typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+typedef struct __mbstate_t {
+  unsigned __opaque1, __opaque2;
+} mbstate_t;
 #define __DEFINED_mbstate_t
 #endif
 
 #if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
 typedef struct {
-    const char* __name;
-    int __c11;
-    size_t _a_stacksize;
-    size_t _a_guardsize;
-    void* _a_stackaddr;
-    int _a_detach;
-    int _a_sched;
-    int _a_policy;
-    int _a_prio;
+  const char* __name;
+  int __c11;
+  size_t _a_stacksize;
+  size_t _a_guardsize;
+  void* _a_stackaddr;
+  int _a_detach;
+  int _a_sched;
+  int _a_policy;
+  int _a_prio;
 } pthread_attr_t;
 #define __DEFINED_pthread_attr_t
 #endif
 
 #if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
 typedef struct {
-    int _m_type;
-    __C11_ATOMIC(int) _m_lock;
-    __C11_ATOMIC(int) _m_waiters;
-    int _m_count;
+  unsigned _m_attr;
+  __C11_ATOMIC(int)
+  _m_lock;
+  __C11_ATOMIC(int)
+  _m_waiters;
+  int _m_count;
 } pthread_mutex_t;
 #define __DEFINED_pthread_mutex_t
 #endif
@@ -467,55 +481,64 @@
     __attribute__((__capability__("mutex")))
 #endif
 {
-    int __i[1];
+  int __i[1];
 } mtx_t;
 #define __DEFINED_mtx_t
 #endif
 
 #if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
 typedef struct {
-    void* _c_head;
-    int _c_clock;
-    void* _c_tail;
-    __C11_ATOMIC(int) _c_lock;
+  void* _c_head;
+  int _c_clock;
+  void* _c_tail;
+  __C11_ATOMIC(int)
+  _c_lock;
 } pthread_cond_t;
 #define __DEFINED_pthread_cond_t
 #endif
 
 #if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
 typedef struct {
-    void* _c_head;
-    int _c_clock;
-    void* _c_tail;
-    __C11_ATOMIC(int) _c_lock;
+  void* _c_head;
+  int _c_clock;
+  void* _c_tail;
+  __C11_ATOMIC(int) _c_lock;
 } cnd_t;
 #define __DEFINED_cnd_t
 #endif
 
 #if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
 typedef struct {
-    __C11_ATOMIC(int) _rw_lock;
-    __C11_ATOMIC(int) _rw_waiters;
+  __C11_ATOMIC(int)
+  _rw_lock;
+  __C11_ATOMIC(int)
+  _rw_waiters;
 } pthread_rwlock_t;
 #define __DEFINED_pthread_rwlock_t
 #endif
 
 #if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
 typedef struct {
-    __C11_ATOMIC(int) _b_lock;
-    __C11_ATOMIC(int) _b_waiters;
-    unsigned int _b_limit;
-    __C11_ATOMIC(int) _b_count;
-    __C11_ATOMIC(int) _b_waiters2;
-    void* _b_inst;
+  __C11_ATOMIC(int)
+  _b_lock;
+  __C11_ATOMIC(int)
+  _b_waiters;
+  unsigned int _b_limit;
+  __C11_ATOMIC(int)
+  _b_count;
+  __C11_ATOMIC(int)
+  _b_waiters2;
+  void* _b_inst;
 } pthread_barrier_t;
 #define __DEFINED_pthread_barrier_t
 #endif
 
 #if defined(__NEED_sem_t) && !defined(__DEFINED_sem_t)
 typedef struct {
-    __C11_ATOMIC(int) _s_value;
-    __C11_ATOMIC(int) _s_waiters;
+  __C11_ATOMIC(int)
+  _s_value;
+  __C11_ATOMIC(int)
+  _s_waiters;
 } sem_t;
 #define __DEFINED_sem_t
 #endif
diff --git a/arch/arm64/sysroot/include/bits/float.h b/arch/arm64/sysroot/include/bits/float.h
deleted file mode 100644
index 45354da..0000000
--- a/arch/arm64/sysroot/include/bits/float.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if defined(__x86_64__)
-#include "x86_64/float.h"
-#elif defined(__aarch64__)
-#include "aarch64/float.h"
-#else
-#error Unsupported architecture!
-#endif
diff --git a/arch/arm64/sysroot/include/bits/msg.h b/arch/arm64/sysroot/include/bits/msg.h
index 9b3f7e5..1c8034b 100644
--- a/arch/arm64/sysroot/include/bits/msg.h
+++ b/arch/arm64/sysroot/include/bits/msg.h
@@ -1,12 +1,12 @@
 struct msqid_ds {
-    struct ipc_perm msg_perm;
-    time_t msg_stime;
-    time_t msg_rtime;
-    time_t msg_ctime;
-    unsigned long msg_cbytes;
-    msgqnum_t msg_qnum;
-    msglen_t msg_qbytes;
-    pid_t msg_lspid;
-    pid_t msg_lrpid;
-    unsigned long __unused[2];
+  struct ipc_perm msg_perm;
+  time_t msg_stime;
+  time_t msg_rtime;
+  time_t msg_ctime;
+  unsigned long msg_cbytes;
+  msgqnum_t msg_qnum;
+  msglen_t msg_qbytes;
+  pid_t msg_lspid;
+  pid_t msg_lrpid;
+  unsigned long __unused[2];
 };
diff --git a/arch/arm64/sysroot/include/bits/null.h b/arch/arm64/sysroot/include/bits/null.h
index 1788e0c..76e7b77 100644
--- a/arch/arm64/sysroot/include/bits/null.h
+++ b/arch/arm64/sysroot/include/bits/null.h
@@ -4,9 +4,12 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#pragma once
+#ifndef SYSROOT_BITS_NULL_H_
+#define SYSROOT_BITS_NULL_H_
 
 // The compiler's <stddef.h> defines NULL without defining anything
 // else if __need_NULL is defined first.
 #define __need_NULL
 #include <stddef.h>
+
+#endif  // SYSROOT_BITS_NULL_H_
diff --git a/arch/arm64/sysroot/include/bits/sem.h b/arch/arm64/sysroot/include/bits/sem.h
index d7aa74b..db4102f 100644
--- a/arch/arm64/sysroot/include/bits/sem.h
+++ b/arch/arm64/sysroot/include/bits/sem.h
@@ -1,14 +1,14 @@
 struct semid_ds {
-    struct ipc_perm sem_perm;
-    time_t sem_otime;
-    time_t sem_ctime;
+  struct ipc_perm sem_perm;
+  time_t sem_otime;
+  time_t sem_ctime;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned short sem_nsems;
-    char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
+  unsigned short sem_nsems;
+  char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
 #else
-    char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
-    unsigned short sem_nsems;
+  char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
+  unsigned short sem_nsems;
 #endif
-    time_t __unused3;
-    time_t __unused4;
+  time_t __unused3;
+  time_t __unused4;
 };
diff --git a/arch/arm64/sysroot/include/bits/shm.h b/arch/arm64/sysroot/include/bits/shm.h
index 8bb1c74..a3b9dcc 100644
--- a/arch/arm64/sysroot/include/bits/shm.h
+++ b/arch/arm64/sysroot/include/bits/shm.h
@@ -1,24 +1,24 @@
 #define SHMLBA 4096
 
 struct shmid_ds {
-    struct ipc_perm shm_perm;
-    size_t shm_segsz;
-    time_t shm_atime;
-    time_t shm_dtime;
-    time_t shm_ctime;
-    pid_t shm_cpid;
-    pid_t shm_lpid;
-    unsigned long shm_nattch;
-    unsigned long __pad1;
-    unsigned long __pad2;
+  struct ipc_perm shm_perm;
+  size_t shm_segsz;
+  time_t shm_atime;
+  time_t shm_dtime;
+  time_t shm_ctime;
+  pid_t shm_cpid;
+  pid_t shm_lpid;
+  unsigned long shm_nattch;
+  unsigned long __pad1;
+  unsigned long __pad2;
 };
 
 struct shminfo {
-    unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+  unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
 };
 
 struct shm_info {
-    int __used_ids;
-    unsigned long shm_tot, shm_rss, shm_swp;
-    unsigned long __swap_attempts, __swap_successes;
+  int __used_ids;
+  unsigned long shm_tot, shm_rss, shm_swp;
+  unsigned long __swap_attempts, __swap_successes;
 };
diff --git a/arch/arm64/sysroot/include/bits/socket.h b/arch/arm64/sysroot/include/bits/socket.h
index aad18bf..1127d5b 100644
--- a/arch/arm64/sysroot/include/bits/socket.h
+++ b/arch/arm64/sysroot/include/bits/socket.h
@@ -1,33 +1,33 @@
 #include <endian.h>
 
 struct msghdr {
-    void* msg_name;
-    socklen_t msg_namelen;
-    struct iovec* msg_iov;
+  void* msg_name;
+  socklen_t msg_namelen;
+  struct iovec* msg_iov;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad1, msg_iovlen;
+  int __pad1, msg_iovlen;
 #else
-    int msg_iovlen, __pad1;
+  int msg_iovlen, __pad1;
 #endif
-    void* msg_control;
+  void* msg_control;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad2;
-    socklen_t msg_controllen;
+  int __pad2;
+  socklen_t msg_controllen;
 #else
-    socklen_t msg_controllen;
-    int __pad2;
+  socklen_t msg_controllen;
+  int __pad2;
 #endif
-    int msg_flags;
+  int msg_flags;
 };
 
 struct cmsghdr {
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad1;
-    socklen_t cmsg_len;
+  int __pad1;
+  socklen_t cmsg_len;
 #else
-    socklen_t cmsg_len;
-    int __pad1;
+  socklen_t cmsg_len;
+  int __pad1;
 #endif
-    int cmsg_level;
-    int cmsg_type;
+  int cmsg_level;
+  int cmsg_type;
 };
diff --git a/arch/arm64/sysroot/include/bits/statfs.h b/arch/arm64/sysroot/include/bits/statfs.h
index 656aa8d..ef2bbe3 100644
--- a/arch/arm64/sysroot/include/bits/statfs.h
+++ b/arch/arm64/sysroot/include/bits/statfs.h
@@ -1,7 +1,7 @@
 struct statfs {
-    unsigned long f_type, f_bsize;
-    fsblkcnt_t f_blocks, f_bfree, f_bavail;
-    fsfilcnt_t f_files, f_ffree;
-    fsid_t f_fsid;
-    unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
+  unsigned long f_type, f_bsize;
+  fsblkcnt_t f_blocks, f_bfree, f_bavail;
+  fsfilcnt_t f_files, f_ffree;
+  fsid_t f_fsid;
+  unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
 };
diff --git a/arch/arm64/sysroot/include/bits/termios.h b/arch/arm64/sysroot/include/bits/termios.h
index 1a06f76..d9a7359 100644
--- a/arch/arm64/sysroot/include/bits/termios.h
+++ b/arch/arm64/sysroot/include/bits/termios.h
@@ -1,12 +1,12 @@
 struct termios {
-    tcflag_t c_iflag;
-    tcflag_t c_oflag;
-    tcflag_t c_cflag;
-    tcflag_t c_lflag;
-    cc_t c_line;
-    cc_t c_cc[NCCS];
-    speed_t __c_ispeed;
-    speed_t __c_ospeed;
+  tcflag_t c_iflag;
+  tcflag_t c_oflag;
+  tcflag_t c_cflag;
+  tcflag_t c_lflag;
+  cc_t c_line;
+  cc_t c_cc[NCCS];
+  speed_t __c_ispeed;
+  speed_t __c_ospeed;
 };
 
 #define VINTR 0
diff --git a/arch/arm64/sysroot/include/bits/x86_64/fenv.h b/arch/arm64/sysroot/include/bits/x86_64/fenv.h
index 5cea203..32e7dbf 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/fenv.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/fenv.h
@@ -15,20 +15,20 @@
 typedef unsigned short fexcept_t;
 
 typedef struct {
-    unsigned short __control_word;
-    unsigned short __unused1;
-    unsigned short __status_word;
-    unsigned short __unused2;
-    unsigned short __tags;
-    unsigned short __unused3;
-    unsigned int __eip;
-    unsigned short __cs_selector;
-    unsigned int __opcode : 11;
-    unsigned int __unused4 : 5;
-    unsigned int __data_offset;
-    unsigned short __data_selector;
-    unsigned short __unused5;
-    unsigned int __mxcsr;
+  unsigned short __control_word;
+  unsigned short __unused1;
+  unsigned short __status_word;
+  unsigned short __unused2;
+  unsigned short __tags;
+  unsigned short __unused3;
+  unsigned int __eip;
+  unsigned short __cs_selector;
+  unsigned int __opcode : 11;
+  unsigned int __unused4 : 5;
+  unsigned int __data_offset;
+  unsigned short __data_selector;
+  unsigned short __unused5;
+  unsigned int __mxcsr;
 } fenv_t;
 
 #define FE_DFL_ENV ((const fenv_t*)-1)
diff --git a/arch/arm64/sysroot/include/bits/x86_64/float.h b/arch/arm64/sysroot/include/bits/x86_64/float.h
deleted file mode 100644
index f935e34..0000000
--- a/arch/arm64/sysroot/include/bits/x86_64/float.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifdef __FLT_EVAL_METHOD__
-#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#else
-#define FLT_EVAL_METHOD 0
-#endif
-
-#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
-#define LDBL_MIN 3.3621031431120935063e-4932L
-#define LDBL_MAX 1.1897314953572317650e+4932L
-#define LDBL_EPSILON 1.0842021724855044340e-19L
-
-#define LDBL_MANT_DIG 64
-#define LDBL_MIN_EXP (-16381)
-#define LDBL_MAX_EXP 16384
-
-#define LDBL_DIG 18
-#define LDBL_MIN_10_EXP (-4931)
-#define LDBL_MAX_10_EXP 4932
-
-#define DECIMAL_DIG 21
diff --git a/arch/arm64/sysroot/include/bits/x86_64/io.h b/arch/arm64/sysroot/include/bits/x86_64/io.h
index bbfb2e6..7234422 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/io.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/io.h
@@ -1,77 +1,53 @@
 static __inline void outb(unsigned char __val, unsigned short __port) {
-    __asm__ volatile("outb %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outb %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline void outw(unsigned short __val, unsigned short __port) {
-    __asm__ volatile("outw %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outw %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline void outl(unsigned int __val, unsigned short __port) {
-    __asm__ volatile("outl %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outl %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline unsigned char inb(unsigned short __port) {
-    unsigned char __val;
-    __asm__ volatile("inb %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned char __val;
+  __asm__ volatile("inb %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline unsigned short inw(unsigned short __port) {
-    unsigned short __val;
-    __asm__ volatile("inw %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned short __val;
+  __asm__ volatile("inw %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline unsigned int inl(unsigned short __port) {
-    unsigned int __val;
-    __asm__ volatile("inl %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned int __val;
+  __asm__ volatile("inl %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline void outsb(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsb"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsb" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void outsw(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsw"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsw" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void outsl(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsl"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsl" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insb(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insb"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insb" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insw(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insw"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insw" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insl(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insl"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insl" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
diff --git a/arch/arm64/sysroot/include/bits/x86_64/ioctl.h b/arch/arm64/sysroot/include/bits/x86_64/ioctl.h
index 66525bf..bc8d16a 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/ioctl.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/ioctl.h
@@ -88,10 +88,10 @@
 #define TIOCSER_TEMT 0x01
 
 struct winsize {
-    unsigned short ws_row;
-    unsigned short ws_col;
-    unsigned short ws_xpixel;
-    unsigned short ws_ypixel;
+  unsigned short ws_row;
+  unsigned short ws_col;
+  unsigned short ws_xpixel;
+  unsigned short ws_ypixel;
 };
 
 #define TIOCM_LE 0x001
diff --git a/arch/arm64/sysroot/include/bits/x86_64/ipc.h b/arch/arm64/sysroot/include/bits/x86_64/ipc.h
index b563143..c66f9ed 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/ipc.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/ipc.h
@@ -1,13 +1,13 @@
 struct ipc_perm {
-    key_t __ipc_perm_key;
-    uid_t uid;
-    gid_t gid;
-    uid_t cuid;
-    gid_t cgid;
-    mode_t mode;
-    int __ipc_perm_seq;
-    long __pad1;
-    long __pad2;
+  key_t __ipc_perm_key;
+  uid_t uid;
+  gid_t gid;
+  uid_t cuid;
+  gid_t cgid;
+  mode_t mode;
+  int __ipc_perm_seq;
+  long __pad1;
+  long __pad2;
 };
 
 #define IPC_64 0
diff --git a/arch/arm64/sysroot/include/bits/x86_64/signal.h b/arch/arm64/sysroot/include/bits/x86_64/signal.h
index 529bbc4..26095e9 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/signal.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/signal.h
@@ -35,47 +35,49 @@
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 typedef long long greg_t, gregset_t[23];
 typedef struct _fpstate {
-    unsigned short cwd, swd, ftw, fop;
-    unsigned long long rip, rdp;
-    unsigned mxcsr, mxcr_mask;
-    struct {
-        unsigned short significand[4], exponent, padding[3];
-    } _st[8];
-    struct {
-        unsigned element[4];
-    } _xmm[16];
-    unsigned padding[24];
+  unsigned short cwd, swd, ftw, fop;
+  unsigned long long rip, rdp;
+  unsigned mxcsr, mxcr_mask;
+  struct {
+    unsigned short significand[4], exponent, padding[3];
+  } _st[8];
+  struct {
+    unsigned element[4];
+  } _xmm[16];
+  unsigned padding[24];
 } * fpregset_t;
 struct sigcontext {
-    unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
-    unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
-    unsigned short cs, gs, fs, __pad0;
-    unsigned long err, trapno, oldmask, cr2;
-    struct _fpstate* fpstate;
-    unsigned long __reserved1[8];
+  unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
+  unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
+  unsigned short cs, gs, fs, __pad0;
+  unsigned long err, trapno, oldmask, cr2;
+  struct _fpstate* fpstate;
+  unsigned long __reserved1[8];
 };
 typedef struct {
-    gregset_t gregs;
-    fpregset_t fpregs;
-    unsigned long long __reserved1[8];
+  gregset_t gregs;
+  fpregset_t fpregs;
+  unsigned long long __reserved1[8];
 } mcontext_t;
 #else
-typedef struct { unsigned long __space[32]; } mcontext_t;
+typedef struct {
+  unsigned long __space[32];
+} mcontext_t;
 #endif
 
 struct sigaltstack {
-    void* ss_sp;
-    int ss_flags;
-    size_t ss_size;
+  void* ss_sp;
+  int ss_flags;
+  size_t ss_size;
 };
 
 typedef struct __ucontext {
-    unsigned long uc_flags;
-    struct __ucontext* uc_link;
-    stack_t uc_stack;
-    mcontext_t uc_mcontext;
-    sigset_t uc_sigmask;
-    unsigned long __fpregs_mem[64];
+  unsigned long uc_flags;
+  struct __ucontext* uc_link;
+  stack_t uc_stack;
+  mcontext_t uc_mcontext;
+  sigset_t uc_sigmask;
+  unsigned long __fpregs_mem[64];
 } ucontext_t;
 
 #define SA_NOCLDSTOP 1
diff --git a/arch/arm64/sysroot/include/bits/x86_64/stat.h b/arch/arm64/sysroot/include/bits/x86_64/stat.h
index d3b3447..9533ce5 100644
--- a/arch/arm64/sysroot/include/bits/x86_64/stat.h
+++ b/arch/arm64/sysroot/include/bits/x86_64/stat.h
@@ -2,21 +2,21 @@
  * by the corresponding correctly-sized userspace types. */
 
 struct stat {
-    dev_t st_dev;
-    ino_t st_ino;
-    nlink_t st_nlink;
+  dev_t st_dev;
+  ino_t st_ino;
+  nlink_t st_nlink;
 
-    mode_t st_mode;
-    uid_t st_uid;
-    gid_t st_gid;
-    unsigned int __pad0;
-    dev_t st_rdev;
-    off_t st_size;
-    blksize_t st_blksize;
-    blkcnt_t st_blocks;
+  mode_t st_mode;
+  uid_t st_uid;
+  gid_t st_gid;
+  unsigned int __pad0;
+  dev_t st_rdev;
+  off_t st_size;
+  blksize_t st_blksize;
+  blkcnt_t st_blocks;
 
-    struct timespec st_atim;
-    struct timespec st_mtim;
-    struct timespec st_ctim;
-    long __unused[3];
+  struct timespec st_atim;
+  struct timespec st_mtim;
+  struct timespec st_ctim;
+  long __unused1[3];
 };
diff --git a/arch/arm64/sysroot/include/byteswap.h b/arch/arm64/sysroot/include/byteswap.h
index 6350775..54d1c36 100644
--- a/arch/arm64/sysroot/include/byteswap.h
+++ b/arch/arm64/sysroot/include/byteswap.h
@@ -1,21 +1,21 @@
-#pragma once
+#ifndef SYSROOT_BYTESWAP_H_
+#define SYSROOT_BYTESWAP_H_
 
 #include <features.h>
 #include <stdint.h>
 
-static __inline uint16_t __bswap_16(uint16_t __x) {
-    return __x << 8 | __x >> 8;
-}
+static __inline uint16_t __bswap_16(uint16_t __x) { return (uint16_t)(__x << 8 | __x >> 8); }
 
 static __inline uint32_t __bswap_32(uint32_t __x) {
-    return __x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) |
-           __x << 24;
+  return __x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24;
 }
 
 static __inline uint64_t __bswap_64(uint64_t __x) {
-    return ((uint64_t)__bswap_32(__x)) << 32 | __bswap_32(__x >> 32);
+  return ((uint64_t)__bswap_32((uint32_t)__x)) << 32 | __bswap_32((uint32_t)(__x >> 32));
 }
 
 #define bswap_16(x) __bswap_16(x)
 #define bswap_32(x) __bswap_32(x)
 #define bswap_64(x) __bswap_64(x)
+
+#endif  // SYSROOT_BYTESWAP_H_
diff --git a/arch/arm64/sysroot/include/complex.h b/arch/arm64/sysroot/include/complex.h
index 9761553..c4bb294 100644
--- a/arch/arm64/sysroot/include/complex.h
+++ b/arch/arm64/sysroot/include/complex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_COMPLEX_H_
+#define SYSROOT_COMPLEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -101,12 +102,12 @@
 long double creall(long double complex);
 
 #ifndef __cplusplus
-#define __CIMAG(x, t)     \
-    (+(union {            \
-          _Complex t __z; \
-          t __xy[2];      \
-      }){(_Complex t)(x)} \
-          .__xy[1])
+#define __CIMAG(x, t)   \
+  (+(union {            \
+      _Complex t __z;   \
+      t __xy[2];        \
+    }){(_Complex t)(x)} \
+        .__xy[1])
 
 #define creal(x) ((double)(x))
 #define crealf(x) ((float)(x))
@@ -133,3 +134,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_COMPLEX_H_
diff --git a/arch/arm64/sysroot/include/cpio.h b/arch/arm64/sysroot/include/cpio.h
index f921413..21d069e 100644
--- a/arch/arm64/sysroot/include/cpio.h
+++ b/arch/arm64/sysroot/include/cpio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_CPIO_H_
+#define SYSROOT_CPIO_H_
 
 #define MAGIC "070707"
 
@@ -24,3 +25,5 @@
 #define C_ISLNK 0120000
 #define C_ISCTG 0110000
 #define C_ISREG 0100000
+
+#endif  // SYSROOT_CPIO_H_
diff --git a/arch/arm64/sysroot/include/crypt.h b/arch/arm64/sysroot/include/crypt.h
deleted file mode 100644
index 029698c..0000000
--- a/arch/arm64/sysroot/include/crypt.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct crypt_data {
-    int initialized;
-    char __buf[256];
-};
-
-char* crypt(const char*, const char*);
-char* crypt_r(const char*, const char*, struct crypt_data*);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/arm64/sysroot/include/ctype.h b/arch/arm64/sysroot/include/ctype.h
index f4cd85b..12be80d 100644
--- a/arch/arm64/sysroot/include/ctype.h
+++ b/arch/arm64/sysroot/include/ctype.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_CTYPE_H_
+#define SYSROOT_CTYPE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,9 +23,7 @@
 int toupper(int);
 
 #ifndef __cplusplus
-static __inline int __isspace(int _c) {
-    return _c == ' ' || (unsigned)_c - '\t' < 5;
-}
+static __inline int __isspace(int _c) { return _c == ' ' || (unsigned)_c - '\t' < 5; }
 
 #define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a) | 32) - 'a') < 26)
 #define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a) - '0') < 10)
@@ -49,3 +48,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_CTYPE_H_
diff --git a/arch/arm64/sysroot/include/dirent.h b/arch/arm64/sysroot/include/dirent.h
index 0c463c4..4542825 100644
--- a/arch/arm64/sysroot/include/dirent.h
+++ b/arch/arm64/sysroot/include/dirent.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_DIRENT_H_
+#define SYSROOT_DIRENT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,11 +18,11 @@
 typedef struct __dirstream DIR;
 
 struct dirent {
-    ino_t d_ino;
-    off_t d_off;
-    unsigned short d_reclen;
-    unsigned char d_type;
-    char d_name[256];
+  ino_t d_ino;
+  off_t d_off;
+  unsigned short d_reclen;
+  unsigned char d_type;
+  char d_name[256];
 };
 
 #define d_fileno d_ino
@@ -62,3 +63,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_DIRENT_H_
diff --git a/arch/arm64/sysroot/include/dlfcn.h b/arch/arm64/sysroot/include/dlfcn.h
index 04cc834..ff069c9 100644
--- a/arch/arm64/sysroot/include/dlfcn.h
+++ b/arch/arm64/sysroot/include/dlfcn.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_DLFCN_H_
+#define SYSROOT_DLFCN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,10 +26,10 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 typedef struct {
-    const char* dli_fname;
-    void* dli_fbase;
-    const char* dli_sname;
-    void* dli_saddr;
+  const char* dli_fname;
+  void* dli_fbase;
+  const char* dli_sname;
+  void* dli_saddr;
 } Dl_info;
 int dladdr(const void*, Dl_info*);
 int dlinfo(void*, int, void*);
@@ -37,3 +38,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_DLFCN_H_
diff --git a/arch/arm64/sysroot/include/elf.h b/arch/arm64/sysroot/include/elf.h
index a5efbda..88a35f0 100644
--- a/arch/arm64/sysroot/include/elf.h
+++ b/arch/arm64/sysroot/include/elf.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ELF_H_
+#define SYSROOT_ELF_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -34,37 +35,37 @@
 #define EI_NIDENT (16)
 
 typedef struct {
-    unsigned char e_ident[EI_NIDENT];
-    Elf32_Half e_type;
-    Elf32_Half e_machine;
-    Elf32_Word e_version;
-    Elf32_Addr e_entry;
-    Elf32_Off e_phoff;
-    Elf32_Off e_shoff;
-    Elf32_Word e_flags;
-    Elf32_Half e_ehsize;
-    Elf32_Half e_phentsize;
-    Elf32_Half e_phnum;
-    Elf32_Half e_shentsize;
-    Elf32_Half e_shnum;
-    Elf32_Half e_shstrndx;
+  unsigned char e_ident[EI_NIDENT];
+  Elf32_Half e_type;
+  Elf32_Half e_machine;
+  Elf32_Word e_version;
+  Elf32_Addr e_entry;
+  Elf32_Off e_phoff;
+  Elf32_Off e_shoff;
+  Elf32_Word e_flags;
+  Elf32_Half e_ehsize;
+  Elf32_Half e_phentsize;
+  Elf32_Half e_phnum;
+  Elf32_Half e_shentsize;
+  Elf32_Half e_shnum;
+  Elf32_Half e_shstrndx;
 } Elf32_Ehdr;
 
 typedef struct {
-    unsigned char e_ident[EI_NIDENT];
-    Elf64_Half e_type;
-    Elf64_Half e_machine;
-    Elf64_Word e_version;
-    Elf64_Addr e_entry;
-    Elf64_Off e_phoff;
-    Elf64_Off e_shoff;
-    Elf64_Word e_flags;
-    Elf64_Half e_ehsize;
-    Elf64_Half e_phentsize;
-    Elf64_Half e_phnum;
-    Elf64_Half e_shentsize;
-    Elf64_Half e_shnum;
-    Elf64_Half e_shstrndx;
+  unsigned char e_ident[EI_NIDENT];
+  Elf64_Half e_type;
+  Elf64_Half e_machine;
+  Elf64_Word e_version;
+  Elf64_Addr e_entry;
+  Elf64_Off e_phoff;
+  Elf64_Off e_shoff;
+  Elf64_Word e_flags;
+  Elf64_Half e_ehsize;
+  Elf64_Half e_phentsize;
+  Elf64_Half e_phnum;
+  Elf64_Half e_shentsize;
+  Elf64_Half e_shnum;
+  Elf64_Half e_shstrndx;
 } Elf64_Ehdr;
 
 #define EI_MAG0 0
@@ -217,29 +218,29 @@
 #define EV_NUM 2
 
 typedef struct {
-    Elf32_Word sh_name;
-    Elf32_Word sh_type;
-    Elf32_Word sh_flags;
-    Elf32_Addr sh_addr;
-    Elf32_Off sh_offset;
-    Elf32_Word sh_size;
-    Elf32_Word sh_link;
-    Elf32_Word sh_info;
-    Elf32_Word sh_addralign;
-    Elf32_Word sh_entsize;
+  Elf32_Word sh_name;
+  Elf32_Word sh_type;
+  Elf32_Word sh_flags;
+  Elf32_Addr sh_addr;
+  Elf32_Off sh_offset;
+  Elf32_Word sh_size;
+  Elf32_Word sh_link;
+  Elf32_Word sh_info;
+  Elf32_Word sh_addralign;
+  Elf32_Word sh_entsize;
 } Elf32_Shdr;
 
 typedef struct {
-    Elf64_Word sh_name;
-    Elf64_Word sh_type;
-    Elf64_Xword sh_flags;
-    Elf64_Addr sh_addr;
-    Elf64_Off sh_offset;
-    Elf64_Xword sh_size;
-    Elf64_Word sh_link;
-    Elf64_Word sh_info;
-    Elf64_Xword sh_addralign;
-    Elf64_Xword sh_entsize;
+  Elf64_Word sh_name;
+  Elf64_Word sh_type;
+  Elf64_Xword sh_flags;
+  Elf64_Addr sh_addr;
+  Elf64_Off sh_offset;
+  Elf64_Xword sh_size;
+  Elf64_Word sh_link;
+  Elf64_Word sh_info;
+  Elf64_Xword sh_addralign;
+  Elf64_Xword sh_entsize;
 } Elf64_Shdr;
 
 #define SHN_UNDEF 0
@@ -313,31 +314,31 @@
 #define GRP_COMDAT 0x1
 
 typedef struct {
-    Elf32_Word st_name;
-    Elf32_Addr st_value;
-    Elf32_Word st_size;
-    unsigned char st_info;
-    unsigned char st_other;
-    Elf32_Section st_shndx;
+  Elf32_Word st_name;
+  Elf32_Addr st_value;
+  Elf32_Word st_size;
+  unsigned char st_info;
+  unsigned char st_other;
+  Elf32_Section st_shndx;
 } Elf32_Sym;
 
 typedef struct {
-    Elf64_Word st_name;
-    unsigned char st_info;
-    unsigned char st_other;
-    Elf64_Section st_shndx;
-    Elf64_Addr st_value;
-    Elf64_Xword st_size;
+  Elf64_Word st_name;
+  unsigned char st_info;
+  unsigned char st_other;
+  Elf64_Section st_shndx;
+  Elf64_Addr st_value;
+  Elf64_Xword st_size;
 } Elf64_Sym;
 
 typedef struct {
-    Elf32_Half si_boundto;
-    Elf32_Half si_flags;
+  Elf32_Half si_boundto;
+  Elf32_Half si_flags;
 } Elf32_Syminfo;
 
 typedef struct {
-    Elf64_Half si_boundto;
-    Elf64_Half si_flags;
+  Elf64_Half si_boundto;
+  Elf64_Half si_flags;
 } Elf64_Syminfo;
 
 #define SYMINFO_BT_SELF 0xffff
@@ -396,25 +397,25 @@
 #define STV_PROTECTED 3
 
 typedef struct {
-    Elf32_Addr r_offset;
-    Elf32_Word r_info;
+  Elf32_Addr r_offset;
+  Elf32_Word r_info;
 } Elf32_Rel;
 
 typedef struct {
-    Elf64_Addr r_offset;
-    Elf64_Xword r_info;
+  Elf64_Addr r_offset;
+  Elf64_Xword r_info;
 } Elf64_Rel;
 
 typedef struct {
-    Elf32_Addr r_offset;
-    Elf32_Word r_info;
-    Elf32_Sword r_addend;
+  Elf32_Addr r_offset;
+  Elf32_Word r_info;
+  Elf32_Sword r_addend;
 } Elf32_Rela;
 
 typedef struct {
-    Elf64_Addr r_offset;
-    Elf64_Xword r_info;
-    Elf64_Sxword r_addend;
+  Elf64_Addr r_offset;
+  Elf64_Xword r_info;
+  Elf64_Sxword r_addend;
 } Elf64_Rela;
 
 #define ELF32_R_SYM(val) ((val) >> 8)
@@ -426,25 +427,25 @@
 #define ELF64_R_INFO(sym, type) ((((Elf64_Xword)(sym)) << 32) + (type))
 
 typedef struct {
-    Elf32_Word p_type;
-    Elf32_Off p_offset;
-    Elf32_Addr p_vaddr;
-    Elf32_Addr p_paddr;
-    Elf32_Word p_filesz;
-    Elf32_Word p_memsz;
-    Elf32_Word p_flags;
-    Elf32_Word p_align;
+  Elf32_Word p_type;
+  Elf32_Off p_offset;
+  Elf32_Addr p_vaddr;
+  Elf32_Addr p_paddr;
+  Elf32_Word p_filesz;
+  Elf32_Word p_memsz;
+  Elf32_Word p_flags;
+  Elf32_Word p_align;
 } Elf32_Phdr;
 
 typedef struct {
-    Elf64_Word p_type;
-    Elf64_Word p_flags;
-    Elf64_Off p_offset;
-    Elf64_Addr p_vaddr;
-    Elf64_Addr p_paddr;
-    Elf64_Xword p_filesz;
-    Elf64_Xword p_memsz;
-    Elf64_Xword p_align;
+  Elf64_Word p_type;
+  Elf64_Word p_flags;
+  Elf64_Off p_offset;
+  Elf64_Addr p_vaddr;
+  Elf64_Addr p_paddr;
+  Elf64_Xword p_filesz;
+  Elf64_Xword p_memsz;
+  Elf64_Xword p_align;
 } Elf64_Phdr;
 
 #define PT_NULL 0
@@ -520,19 +521,19 @@
 #define NT_VERSION 1
 
 typedef struct {
-    Elf32_Sword d_tag;
-    union {
-        Elf32_Word d_val;
-        Elf32_Addr d_ptr;
-    } d_un;
+  Elf32_Sword d_tag;
+  union {
+    Elf32_Word d_val;
+    Elf32_Addr d_ptr;
+  } d_un;
 } Elf32_Dyn;
 
 typedef struct {
-    Elf64_Sxword d_tag;
-    union {
-        Elf64_Xword d_val;
-        Elf64_Addr d_ptr;
-    } d_un;
+  Elf64_Sxword d_tag;
+  union {
+    Elf64_Xword d_val;
+    Elf64_Addr d_ptr;
+  } d_un;
 } Elf64_Dyn;
 
 #define DT_NULL 0
@@ -672,23 +673,23 @@
 #define DF_P1_GROUPPERM 0x00000002
 
 typedef struct {
-    Elf32_Half vd_version;
-    Elf32_Half vd_flags;
-    Elf32_Half vd_ndx;
-    Elf32_Half vd_cnt;
-    Elf32_Word vd_hash;
-    Elf32_Word vd_aux;
-    Elf32_Word vd_next;
+  Elf32_Half vd_version;
+  Elf32_Half vd_flags;
+  Elf32_Half vd_ndx;
+  Elf32_Half vd_cnt;
+  Elf32_Word vd_hash;
+  Elf32_Word vd_aux;
+  Elf32_Word vd_next;
 } Elf32_Verdef;
 
 typedef struct {
-    Elf64_Half vd_version;
-    Elf64_Half vd_flags;
-    Elf64_Half vd_ndx;
-    Elf64_Half vd_cnt;
-    Elf64_Word vd_hash;
-    Elf64_Word vd_aux;
-    Elf64_Word vd_next;
+  Elf64_Half vd_version;
+  Elf64_Half vd_flags;
+  Elf64_Half vd_ndx;
+  Elf64_Half vd_cnt;
+  Elf64_Word vd_hash;
+  Elf64_Word vd_aux;
+  Elf64_Word vd_next;
 } Elf64_Verdef;
 
 #define VER_DEF_NONE 0
@@ -704,29 +705,29 @@
 #define VER_NDX_ELIMINATE 0xff01
 
 typedef struct {
-    Elf32_Word vda_name;
-    Elf32_Word vda_next;
+  Elf32_Word vda_name;
+  Elf32_Word vda_next;
 } Elf32_Verdaux;
 
 typedef struct {
-    Elf64_Word vda_name;
-    Elf64_Word vda_next;
+  Elf64_Word vda_name;
+  Elf64_Word vda_next;
 } Elf64_Verdaux;
 
 typedef struct {
-    Elf32_Half vn_version;
-    Elf32_Half vn_cnt;
-    Elf32_Word vn_file;
-    Elf32_Word vn_aux;
-    Elf32_Word vn_next;
+  Elf32_Half vn_version;
+  Elf32_Half vn_cnt;
+  Elf32_Word vn_file;
+  Elf32_Word vn_aux;
+  Elf32_Word vn_next;
 } Elf32_Verneed;
 
 typedef struct {
-    Elf64_Half vn_version;
-    Elf64_Half vn_cnt;
-    Elf64_Word vn_file;
-    Elf64_Word vn_aux;
-    Elf64_Word vn_next;
+  Elf64_Half vn_version;
+  Elf64_Half vn_cnt;
+  Elf64_Word vn_file;
+  Elf64_Word vn_aux;
+  Elf64_Word vn_next;
 } Elf64_Verneed;
 
 #define VER_NEED_NONE 0
@@ -734,35 +735,35 @@
 #define VER_NEED_NUM 2
 
 typedef struct {
-    Elf32_Word vna_hash;
-    Elf32_Half vna_flags;
-    Elf32_Half vna_other;
-    Elf32_Word vna_name;
-    Elf32_Word vna_next;
+  Elf32_Word vna_hash;
+  Elf32_Half vna_flags;
+  Elf32_Half vna_other;
+  Elf32_Word vna_name;
+  Elf32_Word vna_next;
 } Elf32_Vernaux;
 
 typedef struct {
-    Elf64_Word vna_hash;
-    Elf64_Half vna_flags;
-    Elf64_Half vna_other;
-    Elf64_Word vna_name;
-    Elf64_Word vna_next;
+  Elf64_Word vna_hash;
+  Elf64_Half vna_flags;
+  Elf64_Half vna_other;
+  Elf64_Word vna_name;
+  Elf64_Word vna_next;
 } Elf64_Vernaux;
 
 #define VER_FLG_WEAK 0x2
 
 typedef struct {
-    uint32_t a_type;
-    union {
-        uint32_t a_val;
-    } a_un;
+  uint32_t a_type;
+  union {
+    uint32_t a_val;
+  } a_un;
 } Elf32_auxv_t;
 
 typedef struct {
-    uint64_t a_type;
-    union {
-        uint64_t a_val;
-    } a_un;
+  uint64_t a_type;
+  union {
+    uint64_t a_val;
+  } a_un;
 } Elf64_auxv_t;
 
 #define AT_NULL 0
@@ -812,15 +813,15 @@
 #define AT_L3_CACHESHAPE 37
 
 typedef struct {
-    Elf32_Word n_namesz;
-    Elf32_Word n_descsz;
-    Elf32_Word n_type;
+  Elf32_Word n_namesz;
+  Elf32_Word n_descsz;
+  Elf32_Word n_type;
 } Elf32_Nhdr;
 
 typedef struct {
-    Elf64_Word n_namesz;
-    Elf64_Word n_descsz;
-    Elf64_Word n_type;
+  Elf64_Word n_namesz;
+  Elf64_Word n_descsz;
+  Elf64_Word n_type;
 } Elf64_Nhdr;
 
 #define ELF_NOTE_SOLARIS "SUNW Solaris"
@@ -841,19 +842,19 @@
 #define NT_GNU_GOLD_VERSION 4
 
 typedef struct {
-    Elf32_Xword m_value;
-    Elf32_Word m_info;
-    Elf32_Word m_poffset;
-    Elf32_Half m_repeat;
-    Elf32_Half m_stride;
+  Elf32_Xword m_value;
+  Elf32_Word m_info;
+  Elf32_Word m_poffset;
+  Elf32_Half m_repeat;
+  Elf32_Half m_stride;
 } Elf32_Move;
 
 typedef struct {
-    Elf64_Xword m_value;
-    Elf64_Xword m_info;
-    Elf64_Xword m_poffset;
-    Elf64_Half m_repeat;
-    Elf64_Half m_stride;
+  Elf64_Xword m_value;
+  Elf64_Xword m_info;
+  Elf64_Xword m_poffset;
+  Elf64_Half m_repeat;
+  Elf64_Half m_stride;
 } Elf64_Move;
 
 #define ELF32_M_SYM(info) ((info) >> 8)
@@ -1138,29 +1139,29 @@
 #define STB_MIPS_SPLIT_COMMON 13
 
 typedef union {
-    struct {
-        Elf32_Word gt_current_g_value;
-        Elf32_Word gt_unused;
-    } gt_header;
-    struct {
-        Elf32_Word gt_g_value;
-        Elf32_Word gt_bytes;
-    } gt_entry;
+  struct {
+    Elf32_Word gt_current_g_value;
+    Elf32_Word gt_unused;
+  } gt_header;
+  struct {
+    Elf32_Word gt_g_value;
+    Elf32_Word gt_bytes;
+  } gt_entry;
 } Elf32_gptab;
 
 typedef struct {
-    Elf32_Word ri_gprmask;
-    Elf32_Word ri_cprmask[4];
-    Elf32_Sword ri_gp_value;
+  Elf32_Word ri_gprmask;
+  Elf32_Word ri_cprmask[4];
+  Elf32_Sword ri_gp_value;
 } Elf32_RegInfo;
 
 typedef struct {
-    unsigned char kind;
+  unsigned char kind;
 
-    unsigned char size;
-    Elf32_Section section;
+  unsigned char size;
+  Elf32_Section section;
 
-    Elf32_Word info;
+  Elf32_Word info;
 } Elf_Options;
 
 #define ODK_NULL 0
@@ -1197,8 +1198,8 @@
 #define OPAD_SYMBOL 0x4
 
 typedef struct {
-    Elf32_Word hwp_flags1;
-    Elf32_Word hwp_flags2;
+  Elf32_Word hwp_flags1;
+  Elf32_Word hwp_flags2;
 } Elf_Options_Hw;
 
 #define OHWA0_R4KEOP_CHECKED 0x00000001
@@ -1341,19 +1342,19 @@
 #define RHF_RLD_ORDER_SAFE (1 << 14)
 
 typedef struct {
-    Elf32_Word l_name;
-    Elf32_Word l_time_stamp;
-    Elf32_Word l_checksum;
-    Elf32_Word l_version;
-    Elf32_Word l_flags;
+  Elf32_Word l_name;
+  Elf32_Word l_time_stamp;
+  Elf32_Word l_checksum;
+  Elf32_Word l_version;
+  Elf32_Word l_flags;
 } Elf32_Lib;
 
 typedef struct {
-    Elf64_Word l_name;
-    Elf64_Word l_time_stamp;
-    Elf64_Word l_checksum;
-    Elf64_Word l_version;
-    Elf64_Word l_flags;
+  Elf64_Word l_name;
+  Elf64_Word l_time_stamp;
+  Elf64_Word l_checksum;
+  Elf64_Word l_version;
+  Elf64_Word l_flags;
 } Elf64_Lib;
 
 #define LL_NONE 0
@@ -2580,3 +2581,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ELF_H_
diff --git a/arch/arm64/sysroot/include/endian.h b/arch/arm64/sysroot/include/endian.h
index 499f985..5ca6625 100644
--- a/arch/arm64/sysroot/include/endian.h
+++ b/arch/arm64/sysroot/include/endian.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ENDIAN_H_
+#define SYSROOT_ENDIAN_H_
 
 #include <features.h>
 
@@ -21,16 +22,14 @@
 
 #include <stdint.h>
 
-static __inline uint16_t __bswap16(uint16_t __x) {
-    return (uint16_t)(__x << 8 | __x >> 8);
-}
+static __inline uint16_t __bswap16(uint16_t __x) { return (uint16_t)(__x << 8 | __x >> 8); }
 
 static __inline uint32_t __bswap32(uint32_t __x) {
-    return (uint32_t)(__x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24);
+  return (uint32_t)(__x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24);
 }
 
 static __inline uint64_t __bswap64(uint64_t __x) {
-    return ((uint64_t)__bswap32((uint32_t)__x)) << 32 | (uint64_t)__bswap32((uint32_t)(__x >> 32));
+  return ((uint64_t)__bswap32((uint32_t)__x)) << 32 | (uint64_t)__bswap32((uint32_t)(__x >> 32));
 }
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -74,3 +73,5 @@
 #endif
 
 #endif
+
+#endif  // SYSROOT_ENDIAN_H_
diff --git a/arch/arm64/sysroot/include/err.h b/arch/arm64/sysroot/include/err.h
index 3ed5f7f..29842fe 100644
--- a/arch/arm64/sysroot/include/err.h
+++ b/arch/arm64/sysroot/include/err.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ERR_H_
+#define SYSROOT_ERR_H_
 
 #include <features.h>
 #include <stdarg.h>
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ERR_H_
diff --git a/arch/arm64/sysroot/include/errno.h b/arch/arm64/sysroot/include/errno.h
index 4d3b968..af13f58 100644
--- a/arch/arm64/sysroot/include/errno.h
+++ b/arch/arm64/sysroot/include/errno.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ERRNO_H_
+#define SYSROOT_ERRNO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ERRNO_H_
diff --git a/arch/arm64/sysroot/include/fcntl.h b/arch/arm64/sysroot/include/fcntl.h
index f045529..e5e47bd 100644
--- a/arch/arm64/sysroot/include/fcntl.h
+++ b/arch/arm64/sysroot/include/fcntl.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FCNTL_H_
+#define SYSROOT_FCNTL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,11 +20,11 @@
 #include <bits/alltypes.h>
 
 struct flock {
-    short l_type;
-    short l_whence;
-    off_t l_start;
-    off_t l_len;
-    pid_t l_pid;
+  short l_type;
+  short l_whence;
+  off_t l_start;
+  off_t l_len;
+  pid_t l_pid;
 };
 
 int creat(const char*, mode_t);
@@ -54,7 +55,6 @@
 #ifdef _ALL_SOURCE
 #define O_NOREMOTE  0x00200000
 #define O_ADMIN     0x00000004
-#define O_PIPELINE  0x80000000
 #endif
 
 // Flags which do not align with ZXIO_FS_*
@@ -195,8 +195,8 @@
 #define F_OWNER_PGRP 2
 #define F_OWNER_GID 2
 struct f_owner_ex {
-    int type;
-    pid_t pid;
+  int type;
+  pid_t pid;
 };
 #define FALLOC_FL_KEEP_SIZE 1
 #define FALLOC_FL_PUNCH_HOLE 2
@@ -220,3 +220,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FCNTL_H_
diff --git a/arch/arm64/sysroot/include/features.h b/arch/arm64/sysroot/include/features.h
index 7bd75ad..1520efb 100644
--- a/arch/arm64/sysroot/include/features.h
+++ b/arch/arm64/sysroot/include/features.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FEATURES_H_
+#define SYSROOT_FEATURES_H_
 
 #if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE)
 #define _GNU_SOURCE 1
@@ -30,3 +31,5 @@
 #else
 #define _Noreturn
 #endif
+
+#endif  // SYSROOT_FEATURES_H_
diff --git a/arch/arm64/sysroot/include/fenv.h b/arch/arm64/sysroot/include/fenv.h
index 42508ac..391f59f 100644
--- a/arch/arm64/sysroot/include/fenv.h
+++ b/arch/arm64/sysroot/include/fenv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FENV_H_
+#define SYSROOT_FENV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -23,3 +24,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FENV_H_
diff --git a/arch/arm64/sysroot/include/float.h b/arch/arm64/sysroot/include/float.h
deleted file mode 100644
index 691c4fc..0000000
--- a/arch/arm64/sysroot/include/float.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int __flt_rounds(void);
-#define FLT_ROUNDS (__flt_rounds())
-
-#define FLT_RADIX 2
-
-#define FLT_TRUE_MIN 1.40129846432481707092e-45F
-#define FLT_MIN 1.17549435082228750797e-38F
-#define FLT_MAX 3.40282346638528859812e+38F
-#define FLT_EPSILON 1.1920928955078125e-07F
-
-#define FLT_MANT_DIG 24
-#define FLT_MIN_EXP (-125)
-#define FLT_MAX_EXP 128
-#define FLT_HAS_SUBNORM 1
-
-#define FLT_DIG 6
-#define FLT_DECIMAL_DIG 9
-#define FLT_MIN_10_EXP (-37)
-#define FLT_MAX_10_EXP 38
-
-#define DBL_TRUE_MIN 4.94065645841246544177e-324
-#define DBL_MIN 2.22507385850720138309e-308
-#define DBL_MAX 1.79769313486231570815e+308
-#define DBL_EPSILON 2.22044604925031308085e-16
-
-#define DBL_MANT_DIG 53
-#define DBL_MIN_EXP (-1021)
-#define DBL_MAX_EXP 1024
-#define DBL_HAS_SUBNORM 1
-
-#define DBL_DIG 15
-#define DBL_DECIMAL_DIG 17
-#define DBL_MIN_10_EXP (-307)
-#define DBL_MAX_10_EXP 308
-
-#define LDBL_HAS_SUBNORM 1
-#define LDBL_DECIMAL_DIG DECIMAL_DIG
-
-#include <bits/float.h>
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/arm64/sysroot/include/fmtmsg.h b/arch/arm64/sysroot/include/fmtmsg.h
index e6b0923..51abcc5 100644
--- a/arch/arm64/sysroot/include/fmtmsg.h
+++ b/arch/arm64/sysroot/include/fmtmsg.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FMTMSG_H_
+#define SYSROOT_FMTMSG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,3 +43,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FMTMSG_H_
diff --git a/arch/arm64/sysroot/include/fnmatch.h b/arch/arm64/sysroot/include/fnmatch.h
index ea277a4..2e0f6cc 100644
--- a/arch/arm64/sysroot/include/fnmatch.h
+++ b/arch/arm64/sysroot/include/fnmatch.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FNMATCH_H_
+#define SYSROOT_FNMATCH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FNMATCH_H_
diff --git a/arch/arm64/sysroot/include/ftw.h b/arch/arm64/sysroot/include/ftw.h
deleted file mode 100644
index 1c282aa..0000000
--- a/arch/arm64/sysroot/include/ftw.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <features.h>
-#include <sys/stat.h>
-
-#define FTW_F 1
-#define FTW_D 2
-#define FTW_DNR 3
-#define FTW_NS 4
-#define FTW_SL 5
-#define FTW_DP 6
-#define FTW_SLN 7
-
-#define FTW_PHYS 1
-#define FTW_MOUNT 2
-#define FTW_CHDIR 4
-#define FTW_DEPTH 8
-
-struct FTW {
-    int base;
-    int level;
-};
-
-int ftw(const char*, int (*)(const char*, const struct stat*, int), int);
-int nftw(const char*, int (*)(const char*, const struct stat*, int, struct FTW*), int, int);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/arm64/sysroot/include/getopt.h b/arch/arm64/sysroot/include/getopt.h
index 8019e90..bcc632d 100644
--- a/arch/arm64/sysroot/include/getopt.h
+++ b/arch/arm64/sysroot/include/getopt.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GETOPT_H_
+#define SYSROOT_GETOPT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,10 +10,10 @@
 extern int optind, opterr, optopt, optreset;
 
 struct option {
-    const char* name;
-    int has_arg;
-    int* flag;
-    int val;
+  const char* name;
+  int has_arg;
+  int* flag;
+  int val;
 };
 
 int getopt_long(int, char* const*, const char*, const struct option*, int*);
@@ -25,3 +26,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GETOPT_H_
diff --git a/arch/arm64/sysroot/include/glob.h b/arch/arm64/sysroot/include/glob.h
index 580ffe1..98ff3f6 100644
--- a/arch/arm64/sysroot/include/glob.h
+++ b/arch/arm64/sysroot/include/glob.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GLOB_H_
+#define SYSROOT_GLOB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,11 +12,11 @@
 #include <bits/alltypes.h>
 
 typedef struct {
-    size_t gl_pathc;
-    char** gl_pathv;
-    size_t gl_offs;
-    int __dummy1;
-    void* __dummy2[5];
+  size_t gl_pathc;
+  char** gl_pathv;
+  size_t gl_offs;
+  int __dummy1;
+  void* __dummy2[5];
 } glob_t;
 
 int glob(const char* __restrict, int, int (*)(const char*, int), glob_t* __restrict);
@@ -38,3 +39,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GLOB_H_
diff --git a/arch/arm64/sysroot/include/grp.h b/arch/arm64/sysroot/include/grp.h
index 5e0dd0a..4cfdd08 100644
--- a/arch/arm64/sysroot/include/grp.h
+++ b/arch/arm64/sysroot/include/grp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GRP_H_
+#define SYSROOT_GRP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,10 +17,10 @@
 #include <bits/alltypes.h>
 
 struct group {
-    char* gr_name;
-    char* gr_passwd;
-    gid_t gr_gid;
-    char** gr_mem;
+  char* gr_name;
+  char* gr_passwd;
+  gid_t gr_gid;
+  char** gr_mem;
 };
 
 struct group* getgrgid(gid_t);
@@ -46,3 +47,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GRP_H_
diff --git a/arch/arm64/sysroot/include/iconv.h b/arch/arm64/sysroot/include/iconv.h
index 4fee288..c0c056b 100644
--- a/arch/arm64/sysroot/include/iconv.h
+++ b/arch/arm64/sysroot/include/iconv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ICONV_H_
+#define SYSROOT_ICONV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ICONV_H_
diff --git a/arch/arm64/sysroot/include/ifaddrs.h b/arch/arm64/sysroot/include/ifaddrs.h
index 912a2b6..908945e 100644
--- a/arch/arm64/sysroot/include/ifaddrs.h
+++ b/arch/arm64/sysroot/include/ifaddrs.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_IFADDRS_H_
+#define SYSROOT_IFADDRS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,16 +10,16 @@
 #include <sys/socket.h>
 
 struct ifaddrs {
-    struct ifaddrs* ifa_next;
-    char* ifa_name;
-    unsigned ifa_flags;
-    struct sockaddr* ifa_addr;
-    struct sockaddr* ifa_netmask;
-    union {
-        struct sockaddr* ifu_broadaddr;
-        struct sockaddr* ifu_dstaddr;
-    } ifa_ifu;
-    void* ifa_data;
+  struct ifaddrs* ifa_next;
+  char* ifa_name;
+  unsigned ifa_flags;
+  struct sockaddr* ifa_addr;
+  struct sockaddr* ifa_netmask;
+  union {
+    struct sockaddr* ifu_broadaddr;
+    struct sockaddr* ifu_dstaddr;
+  } ifa_ifu;
+  void* ifa_data;
 };
 #define ifa_broadaddr ifa_ifu.ifu_broadaddr
 #define ifa_dstaddr ifa_ifu.ifu_dstaddr
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_IFADDRS_H_
diff --git a/arch/arm64/sysroot/include/inttypes.h b/arch/arm64/sysroot/include/inttypes.h
index db1b4d3..43bf604 100644
--- a/arch/arm64/sysroot/include/inttypes.h
+++ b/arch/arm64/sysroot/include/inttypes.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_INTTYPES_H_
+#define SYSROOT_INTTYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,7 +10,9 @@
 #define __NEED_wchar_t
 #include <bits/alltypes.h>
 
-typedef struct { intmax_t quot, rem; } imaxdiv_t;
+typedef struct {
+  intmax_t quot, rem;
+} imaxdiv_t;
 
 intmax_t imaxabs(intmax_t);
 imaxdiv_t imaxdiv(intmax_t, intmax_t);
@@ -138,7 +141,6 @@
 
 #endif
 
-
 #define PRId8 __INT8_FMTd__
 #define PRId16 __INT16_FMTd__
 #define PRId32 __INT32_FMTd__
@@ -350,3 +352,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_INTTYPES_H_
diff --git a/arch/arm64/sysroot/include/iso646.h b/arch/arm64/sysroot/include/iso646.h
index 59e7e16..8b7dda8 100644
--- a/arch/arm64/sysroot/include/iso646.h
+++ b/arch/arm64/sysroot/include/iso646.h
@@ -1,13 +1,14 @@
-#pragma once
+#ifndef SYSROOT_ISO646_H_
+#define SYSROOT_ISO646_H_
 
 #ifndef __cplusplus
 
-#define and&&
+#define and &&
 #define and_eq &=
-#define bitand&
+#define bitand &
 #define bitor |
-#define compl~
-#define not!
+#define compl ~
+#define not !
 #define not_eq !=
 #define or ||
 #define or_eq |=
@@ -15,3 +16,5 @@
 #define xor_eq ^=
 
 #endif
+
+#endif  // SYSROOT_ISO646_H_
diff --git a/arch/arm64/sysroot/include/langinfo.h b/arch/arm64/sysroot/include/langinfo.h
index 0ee81bb..a14fcfd 100644
--- a/arch/arm64/sysroot/include/langinfo.h
+++ b/arch/arm64/sysroot/include/langinfo.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LANGINFO_H_
+#define SYSROOT_LANGINFO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -87,3 +88,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LANGINFO_H_
diff --git a/arch/arm64/sysroot/include/libgen.h b/arch/arm64/sysroot/include/libgen.h
index 546dce0..f7f79b6 100644
--- a/arch/arm64/sysroot/include/libgen.h
+++ b/arch/arm64/sysroot/include/libgen.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LIBGEN_H_
+#define SYSROOT_LIBGEN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,3 +11,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LIBGEN_H_
diff --git a/arch/arm64/sysroot/include/limits.h b/arch/arm64/sysroot/include/limits.h
index 290ef73..cf60386 100644
--- a/arch/arm64/sysroot/include/limits.h
+++ b/arch/arm64/sysroot/include/limits.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LIMITS_H_
+#define SYSROOT_LIMITS_H_
 
 #include <features.h>
 
@@ -48,7 +49,6 @@
 #define PATH_MAX 4096
 #define NZERO 20
 #define NGROUPS_MAX 32
-#define ARG_MAX 131072
 #define IOV_MAX 1024
 #define SYMLOOP_MAX 40
 #define WORD_BIT 32
@@ -149,3 +149,5 @@
 #define _XOPEN_IOV_MAX 16
 #define _XOPEN_NAME_MAX 255
 #define _XOPEN_PATH_MAX 1024
+
+#endif  // SYSROOT_LIMITS_H_
diff --git a/arch/arm64/sysroot/include/link.h b/arch/arm64/sysroot/include/link.h
index 657e9a0..78ebd48 100644
--- a/arch/arm64/sysroot/include/link.h
+++ b/arch/arm64/sysroot/include/link.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LINK_H_
+#define SYSROOT_LINK_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,31 +16,40 @@
 typedef uint32_t Elf_Symndx;
 
 struct dl_phdr_info {
-    ElfW(Addr) dlpi_addr;
-    const char* dlpi_name;
-    const ElfW(Phdr) * dlpi_phdr;
-    ElfW(Half) dlpi_phnum;
-    unsigned long long int dlpi_adds;
-    unsigned long long int dlpi_subs;
-    size_t dlpi_tls_modid;
-    void* dlpi_tls_data;
+  ElfW(Addr) dlpi_addr;
+  const char* dlpi_name;
+  const ElfW(Phdr) * dlpi_phdr;
+  ElfW(Half) dlpi_phnum;
+  unsigned long long int dlpi_adds;
+  unsigned long long int dlpi_subs;
+  size_t dlpi_tls_modid;
+  void* dlpi_tls_data;
 };
 
 struct link_map {
-    ElfW(Addr) l_addr;
-    char* l_name;
-    ElfW(Dyn) * l_ld;
-    struct link_map *l_next, *l_prev;
+  ElfW(Addr) l_addr;
+  char* l_name;
+  ElfW(Dyn) * l_ld;
+  struct link_map *l_next, *l_prev;
 };
 
 struct r_debug {
-    int r_version;
-    struct link_map* r_map;
-    ElfW(Addr) r_brk;
-    enum { RT_CONSISTENT,
-           RT_ADD,
-           RT_DELETE } r_state;
-    ElfW(Addr) r_ldbase;
+  int r_version;
+  struct link_map* r_map;
+  ElfW(Addr) r_brk;
+
+  /* This is the address of a function internal to the run-time linker
+     that triggers a debug trap. This function will always be called
+     when the linker begins to map in a library or unmap it, and again
+     when the mapping change is complete.
+
+     The debugger can compare the address of a sw exception to this value
+     to determine whether the debug trap was triggered by the run-time
+     linker. */
+  ElfW(Addr) r_brk_on_load;
+
+  enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
+  ElfW(Addr) r_ldbase;
 };
 
 int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*);
@@ -47,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LINK_H_
diff --git a/arch/arm64/sysroot/include/locale.h b/arch/arm64/sysroot/include/locale.h
index 44f8d0b..ce78a02 100644
--- a/arch/arm64/sysroot/include/locale.h
+++ b/arch/arm64/sysroot/include/locale.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_LOCALE_H_
+#define SYSROOT_LOCALE_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define LC_CTYPE 0
@@ -16,31 +18,31 @@
 #define LC_ALL 6
 
 struct lconv {
-    char* decimal_point;
-    char* thousands_sep;
-    char* grouping;
+  char* decimal_point;
+  char* thousands_sep;
+  char* grouping;
 
-    char* int_curr_symbol;
-    char* currency_symbol;
-    char* mon_decimal_point;
-    char* mon_thousands_sep;
-    char* mon_grouping;
-    char* positive_sign;
-    char* negative_sign;
-    char int_frac_digits;
-    char frac_digits;
-    char p_cs_precedes;
-    char p_sep_by_space;
-    char n_cs_precedes;
-    char n_sep_by_space;
-    char p_sign_posn;
-    char n_sign_posn;
-    char int_p_cs_precedes;
-    char int_p_sep_by_space;
-    char int_n_cs_precedes;
-    char int_n_sep_by_space;
-    char int_p_sign_posn;
-    char int_n_sign_posn;
+  char* int_curr_symbol;
+  char* currency_symbol;
+  char* mon_decimal_point;
+  char* mon_thousands_sep;
+  char* mon_grouping;
+  char* positive_sign;
+  char* negative_sign;
+  char int_frac_digits;
+  char frac_digits;
+  char p_cs_precedes;
+  char p_sep_by_space;
+  char n_cs_precedes;
+  char n_sep_by_space;
+  char p_sign_posn;
+  char n_sign_posn;
+  char int_p_cs_precedes;
+  char int_p_sep_by_space;
+  char int_n_cs_precedes;
+  char int_n_sep_by_space;
+  char int_p_sign_posn;
+  char int_n_sign_posn;
 };
 
 char* setlocale(int, const char*);
@@ -73,3 +75,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LOCALE_H_
diff --git a/arch/arm64/sysroot/include/malloc.h b/arch/arm64/sysroot/include/malloc.h
index d057b89..6abb854 100644
--- a/arch/arm64/sysroot/include/malloc.h
+++ b/arch/arm64/sysroot/include/malloc.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MALLOC_H_
+#define SYSROOT_MALLOC_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MALLOC_H_
diff --git a/arch/arm64/sysroot/include/math.h b/arch/arm64/sysroot/include/math.h
index a32ec07..089c266 100644
--- a/arch/arm64/sysroot/include/math.h
+++ b/arch/arm64/sysroot/include/math.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MATH_H_
+#define SYSROOT_MATH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,67 +41,63 @@
 int __fpclassifyl(long double);
 
 static __inline unsigned __FLOAT_BITS(float __f) {
-    union {
-        float __f;
-        unsigned __i;
-    } __u;
-    __u.__f = __f;
-    return __u.__i;
+  union {
+    float __f;
+    unsigned __i;
+  } __u;
+  __u.__f = __f;
+  return __u.__i;
 }
 static __inline unsigned long long __DOUBLE_BITS(double __f) {
-    union {
-        double __f;
-        unsigned long long __i;
-    } __u;
-    __u.__f = __f;
-    return __u.__i;
+  union {
+    double __f;
+    unsigned long long __i;
+  } __u;
+  __u.__f = __f;
+  return __u.__i;
 }
 
-#define fpclassify(x)                                                            \
-    (sizeof(x) == sizeof(float) ? __fpclassifyf(x) : sizeof(x) == sizeof(double) \
-                                                         ? __fpclassify(x)       \
-                                                         : __fpclassifyl(x))
+#define fpclassify(x)                            \
+  (sizeof(x) == sizeof(float) ? __fpclassifyf(x) \
+                              : sizeof(x) == sizeof(double) ? __fpclassify(x) : __fpclassifyl(x))
 
-#define isinf(x)                                                                           \
-    (sizeof(x) == sizeof(float)                                                            \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) == 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) == FP_INFINITE)
+#define isinf(x)                                                                         \
+  (sizeof(x) == sizeof(float)                                                            \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) == 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) == FP_INFINITE)
 
-#define isnan(x)                                                                          \
-    (sizeof(x) == sizeof(float)                                                           \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) > 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) == FP_NAN)
+#define isnan(x)                                                                        \
+  (sizeof(x) == sizeof(float)                                                           \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) > 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) == FP_NAN)
 
-#define isnormal(x)                                                             \
-    (sizeof(x) == sizeof(float)                                                 \
-         ? ((__FLOAT_BITS(x) + 0x00800000) & 0x7fffffff) >= 0x01000000          \
-         : sizeof(x) == sizeof(double)                                          \
-               ? ((__DOUBLE_BITS(x) + (1ULL << 52)) & -1ULL >> 1) >= 1ULL << 53 \
-               : __fpclassifyl(x) == FP_NORMAL)
+#define isnormal(x)                                                                                \
+  (sizeof(x) == sizeof(float) ? ((__FLOAT_BITS(x) + 0x00800000) & 0x7fffffff) >= 0x01000000        \
+                              : sizeof(x) == sizeof(double) ? ((__DOUBLE_BITS(x) + (1ULL << 52)) & \
+                                                               -1ULL >> 1) >= 1ULL << 53           \
+                                                            : __fpclassifyl(x) == FP_NORMAL)
 
-#define isfinite(x)                                                                       \
-    (sizeof(x) == sizeof(float)                                                           \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) < 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) > FP_INFINITE)
+#define isfinite(x)                                                                     \
+  (sizeof(x) == sizeof(float)                                                           \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) < 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) > FP_INFINITE)
 
 int __signbit(double);
 int __signbitf(float);
 int __signbitl(long double);
 
-#define signbit(x)                      \
-    (sizeof(x) == sizeof(float)         \
-         ? (int)(__FLOAT_BITS(x) >> 31) \
-         : sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x) >> 63) : __signbitl(x))
+#define signbit(x)                    \
+  (sizeof(x) == sizeof(float)         \
+       ? (int)(__FLOAT_BITS(x) >> 31) \
+       : sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x) >> 63) : __signbitl(x))
 
 #define isunordered(x, y) __builtin_isunordered(x, y)
 
-#define __ISREL_DEF(rel, op, type)                      \
-    static __inline int __is##rel(type __x, type __y) { \
-        return !isunordered(__x, __y) && __x op __y;    \
-    }
+#define __ISREL_DEF(rel, op, type) \
+  static __inline int __is##rel(type __x, type __y) { return !isunordered(__x, __y) && __x op __y; }
 
 __ISREL_DEF(lessf, <, float_t)
 __ISREL_DEF(less, <, double_t)
@@ -429,3 +426,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MATH_H_
diff --git a/arch/arm64/sysroot/include/monetary.h b/arch/arm64/sysroot/include/monetary.h
index b6081b9..d1955fa 100644
--- a/arch/arm64/sysroot/include/monetary.h
+++ b/arch/arm64/sysroot/include/monetary.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MONETARY_H_
+#define SYSROOT_MONETARY_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MONETARY_H_
diff --git a/arch/arm64/sysroot/include/net/ethernet.h b/arch/arm64/sysroot/include/net/ethernet.h
index 41dab8b..9cee87d 100644
--- a/arch/arm64/sysroot/include/net/ethernet.h
+++ b/arch/arm64/sysroot/include/net/ethernet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_ETHERNET_H_
+#define SYSROOT_NET_ETHERNET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,13 +10,13 @@
 #include <sys/types.h>
 
 struct ether_addr {
-    uint8_t ether_addr_octet[ETH_ALEN];
+  uint8_t ether_addr_octet[ETH_ALEN];
 };
 
 struct ether_header {
-    uint8_t ether_dhost[ETH_ALEN];
-    uint8_t ether_shost[ETH_ALEN];
-    uint16_t ether_type;
+  uint8_t ether_dhost[ETH_ALEN];
+  uint8_t ether_shost[ETH_ALEN];
+  uint16_t ether_type;
 };
 
 #define ETHERTYPE_PUP 0x0200
@@ -48,3 +49,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_ETHERNET_H_
diff --git a/arch/arm64/sysroot/include/net/if.h b/arch/arm64/sysroot/include/net/if.h
index 687175b..e97c3ee 100644
--- a/arch/arm64/sysroot/include/net/if.h
+++ b/arch/arm64/sysroot/include/net/if.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_IF_H_
+#define SYSROOT_NET_IF_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,8 +10,8 @@
 #define IF_NAMESIZE 16
 
 struct if_nameindex {
-    unsigned int if_index;
-    char* if_name;
+  unsigned int if_index;
+  char* if_name;
 };
 
 unsigned int if_nametoindex(const char*);
@@ -41,53 +42,53 @@
 #define IFF_LOWER_UP 0x10000
 #define IFF_DORMANT 0x20000
 #define IFF_ECHO 0x40000
-#define IFF_VOLATILE                                                                      \
-    (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST | IFF_ECHO | IFF_MASTER | IFF_SLAVE | \
-     IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)
+#define IFF_VOLATILE                                                                    \
+  (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST | IFF_ECHO | IFF_MASTER | IFF_SLAVE | \
+   IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)
 
 struct ifaddr {
-    struct sockaddr ifa_addr;
-    union {
-        struct sockaddr ifu_broadaddr;
-        struct sockaddr ifu_dstaddr;
-    } ifa_ifu;
-    struct iface* ifa_ifp;
-    struct ifaddr* ifa_next;
+  struct sockaddr ifa_addr;
+  union {
+    struct sockaddr ifu_broadaddr;
+    struct sockaddr ifu_dstaddr;
+  } ifa_ifu;
+  struct iface* ifa_ifp;
+  struct ifaddr* ifa_next;
 };
 
 #define ifa_broadaddr ifa_ifu.ifu_broadaddr
 #define ifa_dstaddr ifa_ifu.ifu_dstaddr
 
 struct ifmap {
-    unsigned long int mem_start;
-    unsigned long int mem_end;
-    unsigned short int base_addr;
-    unsigned char irq;
-    unsigned char dma;
-    unsigned char port;
+  unsigned long int mem_start;
+  unsigned long int mem_end;
+  unsigned short int base_addr;
+  unsigned char irq;
+  unsigned char dma;
+  unsigned char port;
 };
 
 #define IFHWADDRLEN 6
 #define IFNAMSIZ IF_NAMESIZE
 
 struct ifreq {
-    union {
-        char ifrn_name[IFNAMSIZ];
-    } ifr_ifrn;
-    union {
-        struct sockaddr ifru_addr;
-        struct sockaddr ifru_dstaddr;
-        struct sockaddr ifru_broadaddr;
-        struct sockaddr ifru_netmask;
-        struct sockaddr ifru_hwaddr;
-        short int ifru_flags;
-        int ifru_ivalue;
-        int ifru_mtu;
-        struct ifmap ifru_map;
-        char ifru_slave[IFNAMSIZ];
-        char ifru_newname[IFNAMSIZ];
-        void* ifru_data;
-    } ifr_ifru;
+  union {
+    char ifrn_name[IFNAMSIZ];
+  } ifr_ifrn;
+  union {
+    struct sockaddr ifru_addr;
+    struct sockaddr ifru_dstaddr;
+    struct sockaddr ifru_broadaddr;
+    struct sockaddr ifru_netmask;
+    struct sockaddr ifru_hwaddr;
+    short int ifru_flags;
+    int ifru_ivalue;
+    int ifru_mtu;
+    struct ifmap ifru_map;
+    char ifru_slave[IFNAMSIZ];
+    char ifru_newname[IFNAMSIZ];
+    void* ifru_data;
+  } ifr_ifru;
 };
 
 #define ifr_name ifr_ifrn.ifrn_name
@@ -111,11 +112,11 @@
 #define _IOT_ifreq_int _IOT(_IOTS(char), IFNAMSIZ, _IOTS(int), 1, 0, 0)
 
 struct ifconf {
-    int ifc_len;
-    union {
-        void* ifcu_buf;
-        struct ifreq* ifcu_req;
-    } ifc_ifcu;
+  int ifc_len;
+  union {
+    void* ifcu_buf;
+    struct ifreq* ifcu_req;
+  } ifc_ifcu;
 };
 
 #define ifc_buf ifc_ifcu.ifcu_buf
@@ -127,3 +128,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_IF_H_
diff --git a/arch/arm64/sysroot/include/net/if_arp.h b/arch/arm64/sysroot/include/net/if_arp.h
index 6da9341..40b902d 100644
--- a/arch/arm64/sysroot/include/net/if_arp.h
+++ b/arch/arm64/sysroot/include/net/if_arp.h
@@ -1,6 +1,7 @@
 /* Nonstandard header */
 
-#pragma once
+#ifndef SYSROOT_NET_IF_ARP_H_
+#define SYSROOT_NET_IF_ARP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -21,11 +22,11 @@
 #define ARPOP_NAK 10
 
 struct arphdr {
-    uint16_t ar_hrd;
-    uint16_t ar_pro;
-    uint8_t ar_hln;
-    uint8_t ar_pln;
-    uint16_t ar_op;
+  uint16_t ar_hrd;
+  uint16_t ar_pro;
+  uint8_t ar_hln;
+  uint8_t ar_pln;
+  uint16_t ar_op;
 };
 
 #define ARPHRD_NETROM 0
@@ -96,18 +97,18 @@
 #define ARPHRD_NONE 0xFFFE
 
 struct arpreq {
-    struct sockaddr arp_pa;
-    struct sockaddr arp_ha;
-    int arp_flags;
-    struct sockaddr arp_netmask;
-    char arp_dev[16];
+  struct sockaddr arp_pa;
+  struct sockaddr arp_ha;
+  int arp_flags;
+  struct sockaddr arp_netmask;
+  char arp_dev[16];
 };
 
 struct arpreq_old {
-    struct sockaddr arp_pa;
-    struct sockaddr arp_ha;
-    int arp_flags;
-    struct sockaddr arp_netmask;
+  struct sockaddr arp_pa;
+  struct sockaddr arp_ha;
+  int arp_flags;
+  struct sockaddr arp_netmask;
 };
 
 #define ATF_COM 0x02
@@ -123,14 +124,16 @@
 #define ARPD_FLUSH 0x03
 
 struct arpd_request {
-    unsigned short req;
-    uint32_t ip;
-    unsigned long dev;
-    unsigned long stamp;
-    unsigned long updated;
-    unsigned char ha[MAX_ADDR_LEN];
+  unsigned short req;
+  uint32_t ip;
+  unsigned long dev;
+  unsigned long stamp;
+  unsigned long updated;
+  unsigned char ha[MAX_ADDR_LEN];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_IF_ARP_H_
diff --git a/arch/arm64/sysroot/include/net/route.h b/arch/arm64/sysroot/include/net/route.h
index 5d2d3d0..dc5960b 100644
--- a/arch/arm64/sysroot/include/net/route.h
+++ b/arch/arm64/sysroot/include/net/route.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_ROUTE_H_
+#define SYSROOT_NET_ROUTE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,36 +11,36 @@
 #include <sys/types.h>
 
 struct rtentry {
-    unsigned long int rt_pad1;
-    struct sockaddr rt_dst;
-    struct sockaddr rt_gateway;
-    struct sockaddr rt_genmask;
-    unsigned short int rt_flags;
-    short int rt_pad2;
-    unsigned long int rt_pad3;
-    unsigned char rt_tos;
-    unsigned char rt_class;
-    short int rt_pad4[sizeof(long) / 2 - 1];
-    short int rt_metric;
-    char* rt_dev;
-    unsigned long int rt_mtu;
-    unsigned long int rt_window;
-    unsigned short int rt_irtt;
+  unsigned long int rt_pad1;
+  struct sockaddr rt_dst;
+  struct sockaddr rt_gateway;
+  struct sockaddr rt_genmask;
+  unsigned short int rt_flags;
+  short int rt_pad2;
+  unsigned long int rt_pad3;
+  unsigned char rt_tos;
+  unsigned char rt_class;
+  short int rt_pad4[sizeof(long) / 2 - 1];
+  short int rt_metric;
+  char* rt_dev;
+  unsigned long int rt_mtu;
+  unsigned long int rt_window;
+  unsigned short int rt_irtt;
 };
 
 #define rt_mss rt_mtu
 
 struct in6_rtmsg {
-    struct in6_addr rtmsg_dst;
-    struct in6_addr rtmsg_src;
-    struct in6_addr rtmsg_gateway;
-    uint32_t rtmsg_type;
-    uint16_t rtmsg_dst_len;
-    uint16_t rtmsg_src_len;
-    uint32_t rtmsg_metric;
-    unsigned long int rtmsg_info;
-    uint32_t rtmsg_flags;
-    int rtmsg_ifindex;
+  struct in6_addr rtmsg_dst;
+  struct in6_addr rtmsg_src;
+  struct in6_addr rtmsg_gateway;
+  uint32_t rtmsg_type;
+  uint16_t rtmsg_dst_len;
+  uint16_t rtmsg_src_len;
+  uint32_t rtmsg_metric;
+  unsigned long int rtmsg_info;
+  uint32_t rtmsg_flags;
+  int rtmsg_ifindex;
 };
 
 #define RTF_UP 0x0001
@@ -114,3 +115,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_ROUTE_H_
diff --git a/arch/arm64/sysroot/include/netdb.h b/arch/arm64/sysroot/include/netdb.h
index 5b8ab72..d5bb5ef 100644
--- a/arch/arm64/sysroot/include/netdb.h
+++ b/arch/arm64/sysroot/include/netdb.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETDB_H_
+#define SYSROOT_NETDB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -13,14 +14,14 @@
 #endif
 
 struct addrinfo {
-    int ai_flags;
-    int ai_family;
-    int ai_socktype;
-    int ai_protocol;
-    socklen_t ai_addrlen;
-    struct sockaddr* ai_addr;
-    char* ai_canonname;
-    struct addrinfo* ai_next;
+  int ai_flags;
+  int ai_family;
+  int ai_socktype;
+  int ai_protocol;
+  socklen_t ai_addrlen;
+  struct sockaddr* ai_addr;
+  char* ai_canonname;
+  struct addrinfo* ai_next;
 };
 
 #define IPPORT_RESERVED 1024
@@ -61,32 +62,32 @@
 /* Legacy functions follow (marked OBsolete in SUS) */
 
 struct netent {
-    char* n_name;
-    char** n_aliases;
-    int n_addrtype;
-    uint32_t n_net;
+  char* n_name;
+  char** n_aliases;
+  int n_addrtype;
+  uint32_t n_net;
 };
 
 struct hostent {
-    char* h_name;
-    char** h_aliases;
-    int h_addrtype;
-    int h_length;
-    char** h_addr_list;
+  char* h_name;
+  char** h_aliases;
+  int h_addrtype;
+  int h_length;
+  char** h_addr_list;
 };
 #define h_addr h_addr_list[0]
 
 struct servent {
-    char* s_name;
-    char** s_aliases;
-    int s_port;
-    char* s_proto;
+  char* s_name;
+  char** s_aliases;
+  int s_port;
+  char* s_proto;
 };
 
 struct protoent {
-    char* p_name;
-    char** p_aliases;
-    int p_proto;
+  char* p_name;
+  char** p_aliases;
+  int p_proto;
 };
 
 void sethostent(int);
@@ -150,3 +151,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETDB_H_
diff --git a/arch/arm64/sysroot/include/netinet/ether.h b/arch/arm64/sysroot/include/netinet/ether.h
index 0a65077..74668fb 100644
--- a/arch/arm64/sysroot/include/netinet/ether.h
+++ b/arch/arm64/sysroot/include/netinet/ether.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_ETHER_H_
+#define SYSROOT_NETINET_ETHER_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_ETHER_H_
diff --git a/arch/arm64/sysroot/include/netinet/icmp6.h b/arch/arm64/sysroot/include/netinet/icmp6.h
index 9a50bcd..dde64cb 100644
--- a/arch/arm64/sysroot/include/netinet/icmp6.h
+++ b/arch/arm64/sysroot/include/netinet/icmp6.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_ICMP6_H_
+#define SYSROOT_NETINET_ICMP6_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,18 +18,18 @@
 #define ICMP6_FILTER_PASSONLY 4
 
 struct icmp6_filter {
-    uint32_t icmp6_filt[8];
+  uint32_t icmp6_filt[8];
 };
 
 struct icmp6_hdr {
-    uint8_t icmp6_type;
-    uint8_t icmp6_code;
-    uint16_t icmp6_cksum;
-    union {
-        uint32_t icmp6_un_data32[1];
-        uint16_t icmp6_un_data16[2];
-        uint8_t icmp6_un_data8[4];
-    } icmp6_dataun;
+  uint8_t icmp6_type;
+  uint8_t icmp6_code;
+  uint16_t icmp6_cksum;
+  union {
+    uint32_t icmp6_un_data32[1];
+    uint16_t icmp6_un_data16[2];
+    uint8_t icmp6_un_data8[4];
+  } icmp6_dataun;
 };
 
 #define icmp6_data32 icmp6_dataun.icmp6_un_data32
@@ -67,16 +68,16 @@
 #define ICMP6_PARAMPROB_OPTION 2
 
 #define ICMP6_FILTER_WILLPASS(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) == 0)
+  ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) == 0)
 
 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) != 0)
+  ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) != 0)
 
 #define ICMP6_FILTER_SETPASS(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type)&31))))
+  ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type)&31))))
 
 #define ICMP6_FILTER_SETBLOCK(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type)&31))))
+  ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type)&31))))
 
 #define ICMP6_FILTER_SETPASSALL(filterp) memset(filterp, 0, sizeof(struct icmp6_filter));
 
@@ -89,7 +90,7 @@
 #define ND_REDIRECT 137
 
 struct nd_router_solicit {
-    struct icmp6_hdr nd_rs_hdr;
+  struct icmp6_hdr nd_rs_hdr;
 };
 
 #define nd_rs_type nd_rs_hdr.icmp6_type
@@ -98,9 +99,9 @@
 #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
 
 struct nd_router_advert {
-    struct icmp6_hdr nd_ra_hdr;
-    uint32_t nd_ra_reachable;
-    uint32_t nd_ra_retransmit;
+  struct icmp6_hdr nd_ra_hdr;
+  uint32_t nd_ra_reachable;
+  uint32_t nd_ra_retransmit;
 };
 
 #define nd_ra_type nd_ra_hdr.icmp6_type
@@ -114,8 +115,8 @@
 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
 
 struct nd_neighbor_solicit {
-    struct icmp6_hdr nd_ns_hdr;
-    struct in6_addr nd_ns_target;
+  struct icmp6_hdr nd_ns_hdr;
+  struct in6_addr nd_ns_target;
 };
 
 #define nd_ns_type nd_ns_hdr.icmp6_type
@@ -124,8 +125,8 @@
 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
 
 struct nd_neighbor_advert {
-    struct icmp6_hdr nd_na_hdr;
-    struct in6_addr nd_na_target;
+  struct icmp6_hdr nd_na_hdr;
+  struct in6_addr nd_na_target;
 };
 
 #define nd_na_type nd_na_hdr.icmp6_type
@@ -143,9 +144,9 @@
 #endif
 
 struct nd_redirect {
-    struct icmp6_hdr nd_rd_hdr;
-    struct in6_addr nd_rd_target;
-    struct in6_addr nd_rd_dst;
+  struct icmp6_hdr nd_rd_hdr;
+  struct in6_addr nd_rd_target;
+  struct in6_addr nd_rd_dst;
 };
 
 #define nd_rd_type nd_rd_hdr.icmp6_type
@@ -154,8 +155,8 @@
 #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
 
 struct nd_opt_hdr {
-    uint8_t nd_opt_type;
-    uint8_t nd_opt_len;
+  uint8_t nd_opt_type;
+  uint8_t nd_opt_len;
 };
 
 #define ND_OPT_SOURCE_LINKADDR 1
@@ -167,14 +168,14 @@
 #define ND_OPT_HOME_AGENT_INFO 8
 
 struct nd_opt_prefix_info {
-    uint8_t nd_opt_pi_type;
-    uint8_t nd_opt_pi_len;
-    uint8_t nd_opt_pi_prefix_len;
-    uint8_t nd_opt_pi_flags_reserved;
-    uint32_t nd_opt_pi_valid_time;
-    uint32_t nd_opt_pi_preferred_time;
-    uint32_t nd_opt_pi_reserved2;
-    struct in6_addr nd_opt_pi_prefix;
+  uint8_t nd_opt_pi_type;
+  uint8_t nd_opt_pi_len;
+  uint8_t nd_opt_pi_prefix_len;
+  uint8_t nd_opt_pi_flags_reserved;
+  uint32_t nd_opt_pi_valid_time;
+  uint32_t nd_opt_pi_preferred_time;
+  uint32_t nd_opt_pi_reserved2;
+  struct in6_addr nd_opt_pi_prefix;
 };
 
 #define ND_OPT_PI_FLAG_ONLINK 0x80
@@ -182,22 +183,22 @@
 #define ND_OPT_PI_FLAG_RADDR 0x20
 
 struct nd_opt_rd_hdr {
-    uint8_t nd_opt_rh_type;
-    uint8_t nd_opt_rh_len;
-    uint16_t nd_opt_rh_reserved1;
-    uint32_t nd_opt_rh_reserved2;
+  uint8_t nd_opt_rh_type;
+  uint8_t nd_opt_rh_len;
+  uint16_t nd_opt_rh_reserved1;
+  uint32_t nd_opt_rh_reserved2;
 };
 
 struct nd_opt_mtu {
-    uint8_t nd_opt_mtu_type;
-    uint8_t nd_opt_mtu_len;
-    uint16_t nd_opt_mtu_reserved;
-    uint32_t nd_opt_mtu_mtu;
+  uint8_t nd_opt_mtu_type;
+  uint8_t nd_opt_mtu_len;
+  uint16_t nd_opt_mtu_reserved;
+  uint32_t nd_opt_mtu_mtu;
 };
 
 struct mld_hdr {
-    struct icmp6_hdr mld_icmp6_hdr;
-    struct in6_addr mld_addr;
+  struct icmp6_hdr mld_icmp6_hdr;
+  struct in6_addr mld_addr;
 };
 
 #define mld_type mld_icmp6_hdr.icmp6_type
@@ -209,11 +210,11 @@
 #define ICMP6_ROUTER_RENUMBERING 138
 
 struct icmp6_router_renum {
-    struct icmp6_hdr rr_hdr;
-    uint8_t rr_segnum;
-    uint8_t rr_flags;
-    uint16_t rr_maxdelay;
-    uint32_t rr_reserved;
+  struct icmp6_hdr rr_hdr;
+  uint8_t rr_segnum;
+  uint8_t rr_flags;
+  uint16_t rr_maxdelay;
+  uint32_t rr_reserved;
 };
 
 #define rr_type rr_hdr.icmp6_type
@@ -228,14 +229,14 @@
 #define ICMP6_RR_FLAGS_PREVDONE 0x08
 
 struct rr_pco_match {
-    uint8_t rpm_code;
-    uint8_t rpm_len;
-    uint8_t rpm_ordinal;
-    uint8_t rpm_matchlen;
-    uint8_t rpm_minlen;
-    uint8_t rpm_maxlen;
-    uint16_t rpm_reserved;
-    struct in6_addr rpm_prefix;
+  uint8_t rpm_code;
+  uint8_t rpm_len;
+  uint8_t rpm_ordinal;
+  uint8_t rpm_matchlen;
+  uint8_t rpm_minlen;
+  uint8_t rpm_maxlen;
+  uint16_t rpm_reserved;
+  struct in6_addr rpm_prefix;
 };
 
 #define RPM_PCO_ADD 1
@@ -243,14 +244,14 @@
 #define RPM_PCO_SETGLOBAL 3
 
 struct rr_pco_use {
-    uint8_t rpu_uselen;
-    uint8_t rpu_keeplen;
-    uint8_t rpu_ramask;
-    uint8_t rpu_raflags;
-    uint32_t rpu_vltime;
-    uint32_t rpu_pltime;
-    uint32_t rpu_flags;
-    struct in6_addr rpu_prefix;
+  uint8_t rpu_uselen;
+  uint8_t rpu_keeplen;
+  uint8_t rpu_ramask;
+  uint8_t rpu_raflags;
+  uint32_t rpu_vltime;
+  uint32_t rpu_pltime;
+  uint32_t rpu_flags;
+  struct in6_addr rpu_prefix;
 };
 
 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
@@ -265,11 +266,11 @@
 #endif
 
 struct rr_result {
-    uint16_t rrr_flags;
-    uint8_t rrr_ordinal;
-    uint8_t rrr_matchedlen;
-    uint32_t rrr_ifid;
-    struct in6_addr rrr_prefix;
+  uint16_t rrr_flags;
+  uint8_t rrr_ordinal;
+  uint8_t rrr_matchedlen;
+  uint32_t rrr_ifid;
+  struct in6_addr rrr_prefix;
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -281,20 +282,22 @@
 #endif
 
 struct nd_opt_adv_interval {
-    uint8_t nd_opt_adv_interval_type;
-    uint8_t nd_opt_adv_interval_len;
-    uint16_t nd_opt_adv_interval_reserved;
-    uint32_t nd_opt_adv_interval_ival;
+  uint8_t nd_opt_adv_interval_type;
+  uint8_t nd_opt_adv_interval_len;
+  uint16_t nd_opt_adv_interval_reserved;
+  uint32_t nd_opt_adv_interval_ival;
 };
 
 struct nd_opt_home_agent_info {
-    uint8_t nd_opt_home_agent_info_type;
-    uint8_t nd_opt_home_agent_info_len;
-    uint16_t nd_opt_home_agent_info_reserved;
-    uint16_t nd_opt_home_agent_info_preference;
-    uint16_t nd_opt_home_agent_info_lifetime;
+  uint8_t nd_opt_home_agent_info_type;
+  uint8_t nd_opt_home_agent_info_len;
+  uint16_t nd_opt_home_agent_info_reserved;
+  uint16_t nd_opt_home_agent_info_preference;
+  uint16_t nd_opt_home_agent_info_lifetime;
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_ICMP6_H_
diff --git a/arch/arm64/sysroot/include/netinet/if_ether.h b/arch/arm64/sysroot/include/netinet/if_ether.h
index ee7d38e..f826e96 100644
--- a/arch/arm64/sysroot/include/netinet/if_ether.h
+++ b/arch/arm64/sysroot/include/netinet/if_ether.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IF_ETHER_H_
+#define SYSROOT_NETINET_IF_ETHER_H_
 
 #include <stdint.h>
 #include <sys/types.h>
@@ -93,20 +94,20 @@
 #define ETH_P_CAIF 0x00F7
 
 struct ethhdr {
-    uint8_t h_dest[ETH_ALEN];
-    uint8_t h_source[ETH_ALEN];
-    uint16_t h_proto;
+  uint8_t h_dest[ETH_ALEN];
+  uint8_t h_source[ETH_ALEN];
+  uint16_t h_proto;
 };
 
 #include <net/ethernet.h>
 #include <net/if_arp.h>
 
 struct ether_arp {
-    struct arphdr ea_hdr;
-    uint8_t arp_sha[ETH_ALEN];
-    uint8_t arp_spa[4];
-    uint8_t arp_tha[ETH_ALEN];
-    uint8_t arp_tpa[4];
+  struct arphdr ea_hdr;
+  uint8_t arp_sha[ETH_ALEN];
+  uint8_t arp_spa[4];
+  uint8_t arp_tha[ETH_ALEN];
+  uint8_t arp_tpa[4];
 };
 #define arp_hrd ea_hdr.ar_hrd
 #define arp_pro ea_hdr.ar_pro
@@ -114,12 +115,14 @@
 #define arp_pln ea_hdr.ar_pln
 #define arp_op ea_hdr.ar_op
 
-#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)      \
-    do {                                            \
-        (enaddr)[0] = 0x01;                         \
-        (enaddr)[1] = 0x00;                         \
-        (enaddr)[2] = 0x5e;                         \
-        (enaddr)[3] = ((uint8_t*)ipaddr)[1] & 0x7f; \
-        (enaddr)[4] = ((uint8_t*)ipaddr)[2];        \
-        (enaddr)[5] = ((uint8_t*)ipaddr)[3];        \
-    } while (0)
+#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)  \
+  do {                                          \
+    (enaddr)[0] = 0x01;                         \
+    (enaddr)[1] = 0x00;                         \
+    (enaddr)[2] = 0x5e;                         \
+    (enaddr)[3] = ((uint8_t*)ipaddr)[1] & 0x7f; \
+    (enaddr)[4] = ((uint8_t*)ipaddr)[2];        \
+    (enaddr)[5] = ((uint8_t*)ipaddr)[3];        \
+  } while (0)
+
+#endif  // SYSROOT_NETINET_IF_ETHER_H_
diff --git a/arch/arm64/sysroot/include/netinet/igmp.h b/arch/arm64/sysroot/include/netinet/igmp.h
index a59a1cc..99eb989 100644
--- a/arch/arm64/sysroot/include/netinet/igmp.h
+++ b/arch/arm64/sysroot/include/netinet/igmp.h
@@ -1,13 +1,14 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IGMP_H_
+#define SYSROOT_NETINET_IGMP_H_
 
 #include <netinet/in.h>
 #include <stdint.h>
 
 struct igmp {
-    uint8_t igmp_type;
-    uint8_t igmp_code;
-    uint16_t igmp_cksum;
-    struct in_addr igmp_group;
+  uint8_t igmp_type;
+  uint8_t igmp_code;
+  uint16_t igmp_cksum;
+  struct in_addr igmp_group;
 };
 
 #define IGMP_MINLEN 8
@@ -40,3 +41,5 @@
 #define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
 #define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
 #define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+
+#endif  // SYSROOT_NETINET_IGMP_H_
diff --git a/arch/arm64/sysroot/include/netinet/in.h b/arch/arm64/sysroot/include/netinet/in.h
index e626a93..6d18e44 100644
--- a/arch/arm64/sysroot/include/netinet/in.h
+++ b/arch/arm64/sysroot/include/netinet/in.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IN_H_
+#define SYSROOT_NETINET_IN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,38 +12,38 @@
 typedef uint16_t in_port_t;
 typedef uint32_t in_addr_t;
 struct in_addr {
-    in_addr_t s_addr;
+  in_addr_t s_addr;
 };
 
 struct sockaddr_in {
-    sa_family_t sin_family;
-    in_port_t sin_port;
-    struct in_addr sin_addr;
-    uint8_t sin_zero[8];
+  sa_family_t sin_family;
+  in_port_t sin_port;
+  struct in_addr sin_addr;
+  uint8_t sin_zero[8];
 };
 
 struct in6_addr {
-    union {
-        uint8_t __s6_addr[16];
-        uint16_t __s6_addr16[8];
-        uint32_t __s6_addr32[4];
-    } __in6_union;
+  union {
+    uint8_t __s6_addr[16];
+    uint16_t __s6_addr16[8];
+    uint32_t __s6_addr32[4];
+  } __in6_union;
 };
 #define s6_addr __in6_union.__s6_addr
 #define s6_addr16 __in6_union.__s6_addr16
 #define s6_addr32 __in6_union.__s6_addr32
 
 struct sockaddr_in6 {
-    sa_family_t sin6_family;
-    in_port_t sin6_port;
-    uint32_t sin6_flowinfo;
-    struct in6_addr sin6_addr;
-    uint32_t sin6_scope_id;
+  sa_family_t sin6_family;
+  in_port_t sin6_port;
+  uint32_t sin6_flowinfo;
+  struct in6_addr sin6_addr;
+  uint32_t sin6_scope_id;
 };
 
 struct ipv6_mreq {
-    struct in6_addr ipv6mr_multiaddr;
-    unsigned ipv6mr_interface;
+  struct in6_addr ipv6mr_multiaddr;
+  unsigned ipv6mr_interface;
 };
 
 #define INADDR_ANY ((in_addr_t)0x00000000)
@@ -55,18 +56,18 @@
 #define INADDR_ALLRTRS_GROUP ((in_addr_t)0xe0000002)
 #define INADDR_MAX_LOCAL_GROUP ((in_addr_t)0xe00000ff)
 
-#define IN6ADDR_ANY_INIT                                       \
-    {                                                          \
-        {                                                      \
-            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } \
-        }                                                      \
-    }
-#define IN6ADDR_LOOPBACK_INIT                                  \
-    {                                                          \
-        {                                                      \
-            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } \
-        }                                                      \
-    }
+#define IN6ADDR_ANY_INIT                                 \
+  {                                                      \
+    {                                                    \
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } \
+    }                                                    \
+  }
+#define IN6ADDR_LOOPBACK_INIT                            \
+  {                                                      \
+    {                                                    \
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } \
+    }                                                    \
+  }
 
 extern const struct in6_addr in6addr_any, in6addr_loopback;
 
@@ -114,46 +115,46 @@
 #define IPPROTO_RAW 255
 #define IPPROTO_MAX 256
 
-#define IN6_IS_ADDR_UNSPECIFIED(a)                                                       \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint32_t*)(a))[3] == 0)
+#define IN6_IS_ADDR_UNSPECIFIED(a)                                                     \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint32_t*)(a))[3] == 0)
 
-#define IN6_IS_ADDR_LOOPBACK(a)                                                          \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint8_t*)(a))[12] == 0 && ((uint8_t*)(a))[13] == 0 && ((uint8_t*)(a))[14] == 0 && \
-     ((uint8_t*)(a))[15] == 1)
+#define IN6_IS_ADDR_LOOPBACK(a)                                                        \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint8_t*)(a))[12] == 0 && ((uint8_t*)(a))[13] == 0 && ((uint8_t*)(a))[14] == 0 && \
+   ((uint8_t*)(a))[15] == 1)
 
 #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t*)(a))[0] == 0xff)
 
 #define IN6_IS_ADDR_LINKLOCAL(a) \
-    ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0x80)
+  ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0x80)
 
 #define IN6_IS_ADDR_SITELOCAL(a) \
-    ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0xc0)
+  ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0xc0)
 
-#define IN6_IS_ADDR_V4MAPPED(a)                                                         \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint8_t*)(a))[8] == 0 && \
-     ((uint8_t*)(a))[9] == 0 && ((uint8_t*)(a))[10] == 0xff && ((uint8_t*)(a))[11] == 0xff)
+#define IN6_IS_ADDR_V4MAPPED(a)                                                       \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint8_t*)(a))[8] == 0 && \
+   ((uint8_t*)(a))[9] == 0 && ((uint8_t*)(a))[10] == 0xff && ((uint8_t*)(a))[11] == 0xff)
 
-#define IN6_IS_ADDR_V4COMPAT(a)                                                          \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint8_t*)(a))[15] > 1)
+#define IN6_IS_ADDR_V4COMPAT(a)                                                        \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint8_t*)(a))[15] > 1)
 
 #define IN6_IS_ADDR_MC_NODELOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x1))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x1))
 
 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x2))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x2))
 
 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x5))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x5))
 
 #define IN6_IS_ADDR_MC_ORGLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x8))
 
 #define IN6_IS_ADDR_MC_GLOBAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0xe))
 
 #define __ARE_4_EQUAL(a, b) \
-    (!((0 [a] - 0 [b]) | (1 [a] - 1 [b]) | (2 [a] - 2 [b]) | (3 [a] - 3 [b])))
+  (!((0 [a] - 0 [b]) | (1 [a] - 1 [b]) | (2 [a] - 2 [b]) | (3 [a] - 3 [b])))
 #define IN6_ARE_ADDR_EQUAL(a, b) __ARE_4_EQUAL((const uint32_t*)(a), (const uint32_t*)(b))
 
 #define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
@@ -230,8 +231,8 @@
 #define IP_MAX_MEMBERSHIPS 20
 
 struct ip_opts {
-    struct in_addr ip_dst;
-    char ip_opts[40];
+  struct in_addr ip_dst;
+  char ip_opts[40];
 };
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -248,68 +249,68 @@
 #define MCAST_INCLUDE 1
 
 struct ip_mreq {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_interface;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_interface;
 };
 
 struct ip_mreqn {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_address;
-    int imr_ifindex;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_address;
+  int imr_ifindex;
 };
 
 struct ip_mreq_source {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_interface;
-    struct in_addr imr_sourceaddr;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_interface;
+  struct in_addr imr_sourceaddr;
 };
 
 struct ip_msfilter {
-    struct in_addr imsf_multiaddr;
-    struct in_addr imsf_interface;
-    uint32_t imsf_fmode;
-    uint32_t imsf_numsrc;
-    struct in_addr imsf_slist[1];
+  struct in_addr imsf_multiaddr;
+  struct in_addr imsf_interface;
+  uint32_t imsf_fmode;
+  uint32_t imsf_numsrc;
+  struct in_addr imsf_slist[1];
 };
 #define IP_MSFILTER_SIZE(numsrc) \
-    (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
+  (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
 
 struct group_req {
-    uint32_t gr_interface;
-    struct sockaddr_storage gr_group;
+  uint32_t gr_interface;
+  struct sockaddr_storage gr_group;
 };
 
 struct group_source_req {
-    uint32_t gsr_interface;
-    struct sockaddr_storage gsr_group;
-    struct sockaddr_storage gsr_source;
+  uint32_t gsr_interface;
+  struct sockaddr_storage gsr_group;
+  struct sockaddr_storage gsr_source;
 };
 
 struct group_filter {
-    uint32_t gf_interface;
-    struct sockaddr_storage gf_group;
-    uint32_t gf_fmode;
-    uint32_t gf_numsrc;
-    struct sockaddr_storage gf_slist[1];
+  uint32_t gf_interface;
+  struct sockaddr_storage gf_group;
+  uint32_t gf_fmode;
+  uint32_t gf_numsrc;
+  struct sockaddr_storage gf_slist[1];
 };
-#define GROUP_FILTER_SIZE(numsrc)                                    \
-    (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + \
-     (numsrc) * sizeof(struct sockaddr_storage))
+#define GROUP_FILTER_SIZE(numsrc)                                  \
+  (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + \
+   (numsrc) * sizeof(struct sockaddr_storage))
 
 struct in_pktinfo {
-    int ipi_ifindex;
-    struct in_addr ipi_spec_dst;
-    struct in_addr ipi_addr;
+  int ipi_ifindex;
+  struct in_addr ipi_spec_dst;
+  struct in_addr ipi_addr;
 };
 
 struct in6_pktinfo {
-    struct in6_addr ipi6_addr;
-    unsigned ipi6_ifindex;
+  struct in6_addr ipi6_addr;
+  unsigned ipi6_ifindex;
 };
 
 struct ip6_mtuinfo {
-    struct sockaddr_in6 ip6m_addr;
-    uint32_t ip6m_mtu;
+  struct sockaddr_in6 ip6m_addr;
+  uint32_t ip6m_mtu;
 };
 #endif
 
@@ -392,3 +393,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IN_H_
diff --git a/arch/arm64/sysroot/include/netinet/in_systm.h b/arch/arm64/sysroot/include/netinet/in_systm.h
index ea7ed91..8e688ab 100644
--- a/arch/arm64/sysroot/include/netinet/in_systm.h
+++ b/arch/arm64/sysroot/include/netinet/in_systm.h
@@ -1,6 +1,9 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IN_SYSTM_H_
+#define SYSROOT_NETINET_IN_SYSTM_H_
 
 #include <stdint.h>
 
 typedef uint16_t n_short;
 typedef uint32_t n_long, n_time;
+
+#endif  // SYSROOT_NETINET_IN_SYSTM_H_
diff --git a/arch/arm64/sysroot/include/netinet/ip.h b/arch/arm64/sysroot/include/netinet/ip.h
index 1c0978a..c795ef0 100644
--- a/arch/arm64/sysroot/include/netinet/ip.h
+++ b/arch/arm64/sysroot/include/netinet/ip.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP_H_
+#define SYSROOT_NETINET_IP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,53 +10,53 @@
 #include <stdint.h>
 
 struct timestamp {
-    uint8_t len;
-    uint8_t ptr;
+  uint8_t len;
+  uint8_t ptr;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int flags : 4;
-    unsigned int overflow : 4;
+  unsigned int flags : 4;
+  unsigned int overflow : 4;
 #else
-    unsigned int overflow : 4;
-    unsigned int flags : 4;
+  unsigned int overflow : 4;
+  unsigned int flags : 4;
 #endif
-    uint32_t data[9];
+  uint32_t data[9];
 };
 
 struct iphdr {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ihl : 4;
-    unsigned int version : 4;
+  unsigned int ihl : 4;
+  unsigned int version : 4;
 #else
-    unsigned int version : 4;
-    unsigned int ihl : 4;
+  unsigned int version : 4;
+  unsigned int ihl : 4;
 #endif
-    uint8_t tos;
-    uint16_t tot_len;
-    uint16_t id;
-    uint16_t frag_off;
-    uint8_t ttl;
-    uint8_t protocol;
-    uint16_t check;
-    uint32_t saddr;
-    uint32_t daddr;
+  uint8_t tos;
+  uint16_t tot_len;
+  uint16_t id;
+  uint16_t frag_off;
+  uint8_t ttl;
+  uint8_t protocol;
+  uint16_t check;
+  uint32_t saddr;
+  uint32_t daddr;
 };
 
 struct ip {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ip_hl : 4;
-    unsigned int ip_v : 4;
+  unsigned int ip_hl : 4;
+  unsigned int ip_v : 4;
 #else
-    unsigned int ip_v : 4;
-    unsigned int ip_hl : 4;
+  unsigned int ip_v : 4;
+  unsigned int ip_hl : 4;
 #endif
-    uint8_t ip_tos;
-    uint16_t ip_len;
-    uint16_t ip_id;
-    uint16_t ip_off;
-    uint8_t ip_ttl;
-    uint8_t ip_p;
-    uint16_t ip_sum;
-    struct in_addr ip_src, ip_dst;
+  uint8_t ip_tos;
+  uint16_t ip_len;
+  uint16_t ip_id;
+  uint16_t ip_off;
+  uint8_t ip_ttl;
+  uint8_t ip_p;
+  uint16_t ip_sum;
+  struct in_addr ip_src, ip_dst;
 };
 
 #define IP_RF 0x8000
@@ -64,17 +65,17 @@
 #define IP_OFFMASK 0x1fff
 
 struct ip_timestamp {
-    uint8_t ipt_code;
-    uint8_t ipt_len;
-    uint8_t ipt_ptr;
+  uint8_t ipt_code;
+  uint8_t ipt_len;
+  uint8_t ipt_ptr;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ipt_flg : 4;
-    unsigned int ipt_oflw : 4;
+  unsigned int ipt_flg : 4;
+  unsigned int ipt_oflw : 4;
 #else
-    unsigned int ipt_oflw : 4;
-    unsigned int ipt_flg : 4;
+  unsigned int ipt_oflw : 4;
+  unsigned int ipt_flg : 4;
 #endif
-    uint32_t data[9];
+  uint32_t data[9];
 };
 
 #define IPVERSION 4
@@ -193,3 +194,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP_H_
diff --git a/arch/arm64/sysroot/include/netinet/ip6.h b/arch/arm64/sysroot/include/netinet/ip6.h
index e809200..45f1c68 100644
--- a/arch/arm64/sysroot/include/netinet/ip6.h
+++ b/arch/arm64/sysroot/include/netinet/ip6.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP6_H_
+#define SYSROOT_NETINET_IP6_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,17 +10,17 @@
 #include <stdint.h>
 
 struct ip6_hdr {
-    union {
-        struct ip6_hdrctl {
-            uint32_t ip6_un1_flow;
-            uint16_t ip6_un1_plen;
-            uint8_t ip6_un1_nxt;
-            uint8_t ip6_un1_hlim;
-        } ip6_un1;
-        uint8_t ip6_un2_vfc;
-    } ip6_ctlun;
-    struct in6_addr ip6_src;
-    struct in6_addr ip6_dst;
+  union {
+    struct ip6_hdrctl {
+      uint32_t ip6_un1_flow;
+      uint16_t ip6_un1_plen;
+      uint8_t ip6_un1_nxt;
+      uint8_t ip6_un1_hlim;
+    } ip6_un1;
+    uint8_t ip6_un2_vfc;
+  } ip6_ctlun;
+  struct in6_addr ip6_src;
+  struct in6_addr ip6_dst;
 };
 
 #define ip6_vfc ip6_ctlun.ip6_un2_vfc
@@ -30,42 +31,42 @@
 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
 
 struct ip6_ext {
-    uint8_t ip6e_nxt;
-    uint8_t ip6e_len;
+  uint8_t ip6e_nxt;
+  uint8_t ip6e_len;
 };
 
 struct ip6_hbh {
-    uint8_t ip6h_nxt;
-    uint8_t ip6h_len;
+  uint8_t ip6h_nxt;
+  uint8_t ip6h_len;
 };
 
 struct ip6_dest {
-    uint8_t ip6d_nxt;
-    uint8_t ip6d_len;
+  uint8_t ip6d_nxt;
+  uint8_t ip6d_len;
 };
 
 struct ip6_rthdr {
-    uint8_t ip6r_nxt;
-    uint8_t ip6r_len;
-    uint8_t ip6r_type;
-    uint8_t ip6r_segleft;
+  uint8_t ip6r_nxt;
+  uint8_t ip6r_len;
+  uint8_t ip6r_type;
+  uint8_t ip6r_segleft;
 };
 
 struct ip6_rthdr0 {
-    uint8_t ip6r0_nxt;
-    uint8_t ip6r0_len;
-    uint8_t ip6r0_type;
-    uint8_t ip6r0_segleft;
-    uint8_t ip6r0_reserved;
-    uint8_t ip6r0_slmap[3];
-    struct in6_addr ip6r0_addr[];
+  uint8_t ip6r0_nxt;
+  uint8_t ip6r0_len;
+  uint8_t ip6r0_type;
+  uint8_t ip6r0_segleft;
+  uint8_t ip6r0_reserved;
+  uint8_t ip6r0_slmap[3];
+  struct in6_addr ip6r0_addr[];
 };
 
 struct ip6_frag {
-    uint8_t ip6f_nxt;
-    uint8_t ip6f_reserved;
-    uint16_t ip6f_offlg;
-    uint32_t ip6f_ident;
+  uint8_t ip6f_nxt;
+  uint8_t ip6f_reserved;
+  uint16_t ip6f_offlg;
+  uint32_t ip6f_ident;
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -79,8 +80,8 @@
 #endif
 
 struct ip6_opt {
-    uint8_t ip6o_type;
-    uint8_t ip6o_len;
+  uint8_t ip6o_type;
+  uint8_t ip6o_len;
 };
 
 #define IP6OPT_TYPE(o) ((o)&0xc0)
@@ -99,29 +100,29 @@
 #define IP6OPT_ROUTER_ALERT 0x05
 
 struct ip6_opt_jumbo {
-    uint8_t ip6oj_type;
-    uint8_t ip6oj_len;
-    uint8_t ip6oj_jumbo_len[4];
+  uint8_t ip6oj_type;
+  uint8_t ip6oj_len;
+  uint8_t ip6oj_jumbo_len[4];
 };
 #define IP6OPT_JUMBO_LEN 6
 
 struct ip6_opt_nsap {
-    uint8_t ip6on_type;
-    uint8_t ip6on_len;
-    uint8_t ip6on_src_nsap_len;
-    uint8_t ip6on_dst_nsap_len;
+  uint8_t ip6on_type;
+  uint8_t ip6on_len;
+  uint8_t ip6on_src_nsap_len;
+  uint8_t ip6on_dst_nsap_len;
 };
 
 struct ip6_opt_tunnel {
-    uint8_t ip6ot_type;
-    uint8_t ip6ot_len;
-    uint8_t ip6ot_encap_limit;
+  uint8_t ip6ot_type;
+  uint8_t ip6ot_len;
+  uint8_t ip6ot_encap_limit;
 };
 
 struct ip6_opt_router {
-    uint8_t ip6or_type;
-    uint8_t ip6or_len;
-    uint8_t ip6or_value[2];
+  uint8_t ip6or_type;
+  uint8_t ip6or_len;
+  uint8_t ip6or_value[2];
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -137,3 +138,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP6_H_
diff --git a/arch/arm64/sysroot/include/netinet/ip_icmp.h b/arch/arm64/sysroot/include/netinet/ip_icmp.h
index 4c1c322..c239456 100644
--- a/arch/arm64/sysroot/include/netinet/ip_icmp.h
+++ b/arch/arm64/sysroot/include/netinet/ip_icmp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP_ICMP_H_
+#define SYSROOT_NETINET_IP_ICMP_H_
 
 #include <netinet/in.h>
 #include <netinet/ip.h>
@@ -9,20 +10,20 @@
 #endif
 
 struct icmphdr {
-    uint8_t type;
-    uint8_t code;
-    uint16_t checksum;
-    union {
-        struct {
-            uint16_t id;
-            uint16_t sequence;
-        } echo;
-        uint32_t gateway;
-        struct {
-            uint16_t __unused;
-            uint16_t mtu;
-        } frag;
-    } un;
+  uint8_t type;
+  uint8_t code;
+  uint16_t checksum;
+  union {
+    struct {
+      uint16_t id;
+      uint16_t sequence;
+    } echo;
+    uint32_t gateway;
+    struct {
+      uint16_t __unused;
+      uint16_t mtu;
+    } frag;
+  } un;
 };
 
 #define ICMP_ECHOREPLY 0
@@ -67,47 +68,47 @@
 #define ICMP_EXC_FRAGTIME 1
 
 struct icmp_ra_addr {
-    uint32_t ira_addr;
-    uint32_t ira_preference;
+  uint32_t ira_addr;
+  uint32_t ira_preference;
 };
 
 struct icmp {
-    uint8_t icmp_type;
-    uint8_t icmp_code;
-    uint16_t icmp_cksum;
-    union {
-        uint8_t ih_pptr;
-        struct in_addr ih_gwaddr;
-        struct ih_idseq {
-            uint16_t icd_id;
-            uint16_t icd_seq;
-        } ih_idseq;
-        uint32_t ih_void;
+  uint8_t icmp_type;
+  uint8_t icmp_code;
+  uint16_t icmp_cksum;
+  union {
+    uint8_t ih_pptr;
+    struct in_addr ih_gwaddr;
+    struct ih_idseq {
+      uint16_t icd_id;
+      uint16_t icd_seq;
+    } ih_idseq;
+    uint32_t ih_void;
 
-        struct ih_pmtu {
-            uint16_t ipm_void;
-            uint16_t ipm_nextmtu;
-        } ih_pmtu;
+    struct ih_pmtu {
+      uint16_t ipm_void;
+      uint16_t ipm_nextmtu;
+    } ih_pmtu;
 
-        struct ih_rtradv {
-            uint8_t irt_num_addrs;
-            uint8_t irt_wpa;
-            uint16_t irt_lifetime;
-        } ih_rtradv;
-    } icmp_hun;
-    union {
-        struct {
-            uint32_t its_otime;
-            uint32_t its_rtime;
-            uint32_t its_ttime;
-        } id_ts;
-        struct {
-            struct ip idi_ip;
-        } id_ip;
-        struct icmp_ra_addr id_radv;
-        uint32_t id_mask;
-        uint8_t id_data[1];
-    } icmp_dun;
+    struct ih_rtradv {
+      uint8_t irt_num_addrs;
+      uint8_t irt_wpa;
+      uint16_t irt_lifetime;
+    } ih_rtradv;
+  } icmp_hun;
+  union {
+    struct {
+      uint32_t its_otime;
+      uint32_t its_rtime;
+      uint32_t its_ttime;
+    } id_ts;
+    struct {
+      struct ip idi_ip;
+    } id_ip;
+    struct icmp_ra_addr id_radv;
+    uint32_t id_mask;
+    uint8_t id_data[1];
+  } icmp_dun;
 };
 
 #define icmp_pptr icmp_hun.ih_pptr
@@ -175,12 +176,14 @@
 
 #define ICMP_PARAMPROB_OPTABSENT 1
 
-#define ICMP_INFOTYPE(type)                                                                 \
-    ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT ||      \
-     (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
-     (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ ||           \
-     (type) == ICMP_MASKREPLY)
+#define ICMP_INFOTYPE(type)                                                               \
+  ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT ||      \
+   (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+   (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ ||           \
+   (type) == ICMP_MASKREPLY)
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP_ICMP_H_
diff --git a/arch/arm64/sysroot/include/netinet/tcp.h b/arch/arm64/sysroot/include/netinet/tcp.h
index 9274ba5..e892dd2 100644
--- a/arch/arm64/sysroot/include/netinet/tcp.h
+++ b/arch/arm64/sysroot/include/netinet/tcp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_TCP_H_
+#define SYSROOT_NETINET_TCP_H_
 
 #include <features.h>
 
@@ -74,62 +75,61 @@
 struct tcphdr {
 #ifdef _GNU_SOURCE
 #ifdef __GNUC__
-    __extension__
+  __extension__
 #endif
-        union {
-        struct {
-
-            uint16_t source;
-            uint16_t dest;
-            uint32_t seq;
-            uint32_t ack_seq;
+      union {
+    struct {
+      uint16_t source;
+      uint16_t dest;
+      uint32_t seq;
+      uint32_t ack_seq;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-            uint16_t res1 : 4;
-            uint16_t doff : 4;
-            uint16_t fin : 1;
-            uint16_t syn : 1;
-            uint16_t rst : 1;
-            uint16_t psh : 1;
-            uint16_t ack : 1;
-            uint16_t urg : 1;
-            uint16_t res2 : 2;
+      uint16_t res1 : 4;
+      uint16_t doff : 4;
+      uint16_t fin : 1;
+      uint16_t syn : 1;
+      uint16_t rst : 1;
+      uint16_t psh : 1;
+      uint16_t ack : 1;
+      uint16_t urg : 1;
+      uint16_t res2 : 2;
 #else
-            uint16_t doff : 4;
-            uint16_t res1 : 4;
-            uint16_t res2 : 2;
-            uint16_t urg : 1;
-            uint16_t ack : 1;
-            uint16_t psh : 1;
-            uint16_t rst : 1;
-            uint16_t syn : 1;
-            uint16_t fin : 1;
+      uint16_t doff : 4;
+      uint16_t res1 : 4;
+      uint16_t res2 : 2;
+      uint16_t urg : 1;
+      uint16_t ack : 1;
+      uint16_t psh : 1;
+      uint16_t rst : 1;
+      uint16_t syn : 1;
+      uint16_t fin : 1;
 #endif
-            uint16_t window;
-            uint16_t check;
-            uint16_t urg_ptr;
-        };
-        struct {
+      uint16_t window;
+      uint16_t check;
+      uint16_t urg_ptr;
+    };
+    struct {
 #endif
 
-            uint16_t th_sport;
-            uint16_t th_dport;
-            uint32_t th_seq;
-            uint32_t th_ack;
+      uint16_t th_sport;
+      uint16_t th_dport;
+      uint32_t th_seq;
+      uint32_t th_ack;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-            uint8_t th_x2 : 4;
-            uint8_t th_off : 4;
+      uint8_t th_x2 : 4;
+      uint8_t th_off : 4;
 #else
-    uint8_t th_off : 4;
-    uint8_t th_x2 : 4;
+  uint8_t th_off : 4;
+  uint8_t th_x2 : 4;
 #endif
-            uint8_t th_flags;
-            uint16_t th_win;
-            uint16_t th_sum;
-            uint16_t th_urp;
+      uint8_t th_flags;
+      uint16_t th_win;
+      uint16_t th_sum;
+      uint16_t th_urp;
 
 #ifdef _GNU_SOURCE
-        };
     };
+  };
 #endif
 };
 #endif
@@ -147,53 +147,55 @@
 #define TCP_CA_Loss 4
 
 struct tcp_info {
-    uint8_t tcpi_state;
-    uint8_t tcpi_ca_state;
-    uint8_t tcpi_retransmits;
-    uint8_t tcpi_probes;
-    uint8_t tcpi_backoff;
-    uint8_t tcpi_options;
-    uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
-    uint32_t tcpi_rto;
-    uint32_t tcpi_ato;
-    uint32_t tcpi_snd_mss;
-    uint32_t tcpi_rcv_mss;
-    uint32_t tcpi_unacked;
-    uint32_t tcpi_sacked;
-    uint32_t tcpi_lost;
-    uint32_t tcpi_retrans;
-    uint32_t tcpi_fackets;
-    uint32_t tcpi_last_data_sent;
-    uint32_t tcpi_last_ack_sent;
-    uint32_t tcpi_last_data_recv;
-    uint32_t tcpi_last_ack_recv;
-    uint32_t tcpi_pmtu;
-    uint32_t tcpi_rcv_ssthresh;
-    uint32_t tcpi_rtt;
-    uint32_t tcpi_rttvar;
-    uint32_t tcpi_snd_ssthresh;
-    uint32_t tcpi_snd_cwnd;
-    uint32_t tcpi_advmss;
-    uint32_t tcpi_reordering;
-    uint32_t tcpi_rcv_rtt;
-    uint32_t tcpi_rcv_space;
-    uint32_t tcpi_total_retrans;
-    uint64_t tcpi_pacing_rate;
-    uint64_t tcpi_max_pacing_rate;
-    uint64_t tcpi_bytes_acked;
-    uint64_t tcpi_bytes_received;
-    uint32_t tcpi_segs_out;
-    uint32_t tcpi_segs_in;
+  uint8_t tcpi_state;
+  uint8_t tcpi_ca_state;
+  uint8_t tcpi_retransmits;
+  uint8_t tcpi_probes;
+  uint8_t tcpi_backoff;
+  uint8_t tcpi_options;
+  uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+  uint32_t tcpi_rto;
+  uint32_t tcpi_ato;
+  uint32_t tcpi_snd_mss;
+  uint32_t tcpi_rcv_mss;
+  uint32_t tcpi_unacked;
+  uint32_t tcpi_sacked;
+  uint32_t tcpi_lost;
+  uint32_t tcpi_retrans;
+  uint32_t tcpi_fackets;
+  uint32_t tcpi_last_data_sent;
+  uint32_t tcpi_last_ack_sent;
+  uint32_t tcpi_last_data_recv;
+  uint32_t tcpi_last_ack_recv;
+  uint32_t tcpi_pmtu;
+  uint32_t tcpi_rcv_ssthresh;
+  uint32_t tcpi_rtt;
+  uint32_t tcpi_rttvar;
+  uint32_t tcpi_snd_ssthresh;
+  uint32_t tcpi_snd_cwnd;
+  uint32_t tcpi_advmss;
+  uint32_t tcpi_reordering;
+  uint32_t tcpi_rcv_rtt;
+  uint32_t tcpi_rcv_space;
+  uint32_t tcpi_total_retrans;
+  uint64_t tcpi_pacing_rate;
+  uint64_t tcpi_max_pacing_rate;
+  uint64_t tcpi_bytes_acked;
+  uint64_t tcpi_bytes_received;
+  uint32_t tcpi_segs_out;
+  uint32_t tcpi_segs_in;
 };
 
 #define TCP_MD5SIG_MAXKEYLEN 80
 
 struct tcp_md5sig {
-    struct sockaddr_storage tcpm_addr;
-    uint16_t __tcpm_pad1;
-    uint16_t tcpm_keylen;
-    uint32_t __tcpm_pad2;
-    uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+  struct sockaddr_storage tcpm_addr;
+  uint16_t __tcpm_pad1;
+  uint16_t tcpm_keylen;
+  uint32_t __tcpm_pad2;
+  uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
 };
 
 #endif
+
+#endif  // SYSROOT_NETINET_TCP_H_
diff --git a/arch/arm64/sysroot/include/netinet/udp.h b/arch/arm64/sysroot/include/netinet/udp.h
index ddde1c7..1a0fba7 100644
--- a/arch/arm64/sysroot/include/netinet/udp.h
+++ b/arch/arm64/sysroot/include/netinet/udp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_UDP_H_
+#define SYSROOT_NETINET_UDP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,10 +16,10 @@
 #endif
 
 struct udphdr {
-    uint16_t uh_sport;
-    uint16_t uh_dport;
-    uint16_t uh_ulen;
-    uint16_t uh_sum;
+  uint16_t uh_sport;
+  uint16_t uh_dport;
+  uint16_t uh_ulen;
+  uint16_t uh_sum;
 };
 
 #define UDP_CORK 1
@@ -33,3 +34,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_UDP_H_
diff --git a/arch/arm64/sysroot/include/netpacket/packet.h b/arch/arm64/sysroot/include/netpacket/packet.h
index 3e35676..3066046 100644
--- a/arch/arm64/sysroot/include/netpacket/packet.h
+++ b/arch/arm64/sysroot/include/netpacket/packet.h
@@ -1,21 +1,22 @@
-#pragma once
+#ifndef SYSROOT_NETPACKET_PACKET_H_
+#define SYSROOT_NETPACKET_PACKET_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 struct sockaddr_ll {
-    unsigned short sll_family, sll_protocol;
-    int sll_ifindex;
-    unsigned short sll_hatype;
-    unsigned char sll_pkttype, sll_halen;
-    unsigned char sll_addr[8];
+  unsigned short sll_family, sll_protocol;
+  int sll_ifindex;
+  unsigned short sll_hatype;
+  unsigned char sll_pkttype, sll_halen;
+  unsigned char sll_addr[8];
 };
 
 struct packet_mreq {
-    int mr_ifindex;
-    unsigned short int mr_type, mr_alen;
-    unsigned char mr_address[8];
+  int mr_ifindex;
+  unsigned short int mr_type, mr_alen;
+  unsigned char mr_address[8];
 };
 
 #define PACKET_HOST 0
@@ -56,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETPACKET_PACKET_H_
diff --git a/arch/arm64/sysroot/include/nl_types.h b/arch/arm64/sysroot/include/nl_types.h
index 570224d..e30f86e 100644
--- a/arch/arm64/sysroot/include/nl_types.h
+++ b/arch/arm64/sysroot/include/nl_types.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NL_TYPES_H_
+#define SYSROOT_NL_TYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NL_TYPES_H_
diff --git a/arch/arm64/sysroot/include/paths.h b/arch/arm64/sysroot/include/paths.h
index 36b6127..0ff06aa 100644
--- a/arch/arm64/sysroot/include/paths.h
+++ b/arch/arm64/sysroot/include/paths.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PATHS_H_
+#define SYSROOT_PATHS_H_
 
 #define _PATH_DEFPATH "/usr/local/bin:/bin:/usr/bin"
 #define _PATH_STDPATH "/bin:/usr/bin:/sbin:/usr/sbin"
@@ -23,3 +24,5 @@
 #define _PATH_VARDB "/var/lib/misc/"
 #define _PATH_VARRUN "/var/run/"
 #define _PATH_VARTMP "/var/tmp/"
+
+#endif  // SYSROOT_PATHS_H_
diff --git a/arch/arm64/sysroot/include/poll.h b/arch/arm64/sysroot/include/poll.h
index d8b3726..4c7c800 100644
--- a/arch/arm64/sysroot/include/poll.h
+++ b/arch/arm64/sysroot/include/poll.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_POLL_H_
+#define SYSROOT_POLL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -28,9 +29,9 @@
 typedef unsigned long nfds_t;
 
 struct pollfd {
-    int fd;
-    short events;
-    short revents;
+  int fd;
+  short events;
+  short revents;
 };
 
 int poll(struct pollfd*, nfds_t, int);
@@ -46,3 +47,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_POLL_H_
diff --git a/arch/arm64/sysroot/include/pthread.h b/arch/arm64/sysroot/include/pthread.h
index 07576e5..d4b9f00 100644
--- a/arch/arm64/sysroot/include/pthread.h
+++ b/arch/arm64/sysroot/include/pthread.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PTHREAD_H_
+#define SYSROOT_PTHREAD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,11 +26,11 @@
 #define __NEED_pthread_once_t
 #define __NEED_size_t
 
-#include <bits/alltypes.h>
-
 #include <sched.h>
 #include <time.h>
 
+#include <bits/alltypes.h>
+
 #define PTHREAD_CREATE_JOINABLE 0
 #define PTHREAD_CREATE_DETACHED 1
 
@@ -54,11 +55,11 @@
 #define PTHREAD_PROCESS_PRIVATE 0
 
 #define PTHREAD_MUTEX_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_RWLOCK_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_COND_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_ONCE_INIT 0
 
 #define PTHREAD_CANCEL_ENABLE 0
@@ -147,8 +148,9 @@
 int pthread_attr_getdetachstate(const pthread_attr_t*, int*);
 int pthread_attr_setdetachstate(pthread_attr_t*, int);
 int pthread_attr_getstack(const pthread_attr_t* __restrict, void** __restrict, size_t* __restrict);
-int pthread_attr_setstack(pthread_attr_t*, void*, size_t)
-    __attribute__((__deprecated__("pthread_attr_setstack is not available in Fuchsia; perhaps pthread_attr_setstacksize and/or pthread_attr_setguardsize is sufficient for your needs?")));
+int pthread_attr_setstack(pthread_attr_t*, void*, size_t) __attribute__((__deprecated__(
+    "pthread_attr_setstack is not available in Fuchsia; perhaps pthread_attr_setstacksize and/or "
+    "pthread_attr_setguardsize is sufficient for your needs?")));
 int pthread_attr_getschedparam(const pthread_attr_t* __restrict, struct sched_param* __restrict);
 int pthread_attr_setschedparam(pthread_attr_t* __restrict, const struct sched_param* __restrict);
 
@@ -194,3 +196,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_PTHREAD_H_
diff --git a/arch/arm64/sysroot/include/pty.h b/arch/arm64/sysroot/include/pty.h
deleted file mode 100644
index 943a6a8..0000000
--- a/arch/arm64/sysroot/include/pty.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/ioctl.h>
-#include <termios.h>
-
-int openpty(int*, int*, char*, const struct termios*, const struct winsize*);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/arm64/sysroot/include/pwd.h b/arch/arm64/sysroot/include/pwd.h
index 1d63e72..213eefa 100644
--- a/arch/arm64/sysroot/include/pwd.h
+++ b/arch/arm64/sysroot/include/pwd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PWD_H_
+#define SYSROOT_PWD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,13 +18,13 @@
 #include <bits/alltypes.h>
 
 struct passwd {
-    char* pw_name;
-    char* pw_passwd;
-    uid_t pw_uid;
-    gid_t pw_gid;
-    char* pw_gecos;
-    char* pw_dir;
-    char* pw_shell;
+  char* pw_name;
+  char* pw_passwd;
+  uid_t pw_uid;
+  gid_t pw_gid;
+  char* pw_gecos;
+  char* pw_dir;
+  char* pw_shell;
 };
 
 void setpwent(void);
@@ -43,3 +44,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_PWD_H_
diff --git a/arch/arm64/sysroot/include/regex.h b/arch/arm64/sysroot/include/regex.h
index 70c4613..53fac22 100644
--- a/arch/arm64/sysroot/include/regex.h
+++ b/arch/arm64/sysroot/include/regex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_REGEX_H_
+#define SYSROOT_REGEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -12,15 +13,15 @@
 #include <bits/alltypes.h>
 
 typedef struct re_pattern_buffer {
-    size_t re_nsub;
-    void *__opaque, *__padding[4];
-    size_t __nsub2;
-    char __padding2;
+  size_t re_nsub;
+  void *__opaque, *__padding[4];
+  size_t __nsub2;
+  char __padding2;
 } regex_t;
 
 typedef struct {
-    regoff_t rm_so;
-    regoff_t rm_eo;
+  regoff_t rm_so;
+  regoff_t rm_eo;
 } regmatch_t;
 
 #define REG_EXTENDED 1
@@ -57,3 +58,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_REGEX_H_
diff --git a/arch/arm64/sysroot/include/resolv.h b/arch/arm64/sysroot/include/resolv.h
index 7efcd49..a90e0e8 100644
--- a/arch/arm64/sysroot/include/resolv.h
+++ b/arch/arm64/sysroot/include/resolv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_RESOLV_H_
+#define SYSROOT_RESOLV_H_
 
 #include <arpa/nameser.h>
 #include <netinet/in.h>
@@ -23,41 +24,41 @@
 
 /* unused; purely for broken apps */
 typedef struct __res_state {
-    int retrans;
-    int retry;
-    unsigned long options;
-    int nscount;
-    struct sockaddr_in nsaddr_list[MAXNS];
+  int retrans;
+  int retry;
+  unsigned long options;
+  int nscount;
+  struct sockaddr_in nsaddr_list[MAXNS];
 #define nsaddr nsaddr_list[0]
-    unsigned short id;
-    char* dnsrch[MAXDNSRCH + 1];
-    char defdname[256];
-    unsigned long pfcode;
-    unsigned ndots : 4;
-    unsigned nsort : 4;
-    unsigned ipv6_unavail : 1;
-    unsigned unused : 23;
+  unsigned short id;
+  char* dnsrch[MAXDNSRCH + 1];
+  char defdname[256];
+  unsigned long pfcode;
+  unsigned ndots : 4;
+  unsigned nsort : 4;
+  unsigned ipv6_unavail : 1;
+  unsigned unused : 23;
+  struct {
+    struct in_addr addr;
+    uint32_t mask;
+  } sort_list[MAXRESOLVSORT];
+  void* qhook;
+  void* rhook;
+  int res_h_errno;
+  int _vcsock;
+  unsigned _flags;
+  union {
+    char pad[52];
     struct {
-        struct in_addr addr;
-        uint32_t mask;
-    } sort_list[MAXRESOLVSORT];
-    void* qhook;
-    void* rhook;
-    int res_h_errno;
-    int _vcsock;
-    unsigned _flags;
-    union {
-        char pad[52];
-        struct {
-            uint16_t nscount;
-            uint16_t nsmap[MAXNS];
-            int nssocks[MAXNS];
-            uint16_t nscount6;
-            uint16_t nsinit;
-            struct sockaddr_in6* nsaddrs[MAXNS];
-            unsigned int _initstamp[2];
-        } _ext;
-    } _u;
+      uint16_t nscount;
+      uint16_t nsmap[MAXNS];
+      int nssocks[MAXNS];
+      uint16_t nscount6;
+      uint16_t nsinit;
+      struct sockaddr_in6* nsaddrs[MAXNS];
+      unsigned int _initstamp[2];
+    } _ext;
+  } _u;
 } * res_state;
 
 #define __RES 19991006
@@ -67,9 +68,9 @@
 #endif
 
 struct res_sym {
-    int number;
-    char* name;
-    char* humanname;
+  int number;
+  char* name;
+  char* humanname;
 };
 
 #define RES_F_VC 0x00000001
@@ -138,3 +139,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_RESOLV_H_
diff --git a/arch/arm64/sysroot/include/sched.h b/arch/arm64/sysroot/include/sched.h
index f77dff7..ac06166 100644
--- a/arch/arm64/sysroot/include/sched.h
+++ b/arch/arm64/sysroot/include/sched.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SCHED_H_
+#define SYSROOT_SCHED_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,11 +18,11 @@
 #include <bits/alltypes.h>
 
 struct sched_param {
-    int sched_priority;
-    int sched_ss_low_priority;
-    struct timespec sched_ss_repl_period;
-    struct timespec sched_ss_init_budget;
-    int sched_ss_max_repl;
+  int sched_priority;
+  int sched_ss_low_priority;
+  struct timespec sched_ss_repl_period;
+  struct timespec sched_ss_init_budget;
+  int sched_ss_max_repl;
 };
 
 int sched_get_priority_max(int);
@@ -47,28 +48,30 @@
 void* calloc(size_t, size_t);
 void free(void*);
 
-typedef struct cpu_set_t { unsigned long __bits[128 / sizeof(long)]; } cpu_set_t;
+typedef struct cpu_set_t {
+  unsigned long __bits[128 / sizeof(long)];
+} cpu_set_t;
 int __sched_cpucount(size_t, const cpu_set_t*);
 int sched_getcpu(void);
 int sched_getaffinity(pid_t, size_t, cpu_set_t*);
 int sched_setaffinity(pid_t, size_t, const cpu_set_t*);
 
 #define __CPU_op_S(i, size, set, op) \
-    ((i) / 8U >= (size)              \
-         ? 0                         \
-         : ((set)->__bits[(i) / 8 / sizeof(long)] op(1UL << ((i) % (8 * sizeof(long))))))
+  ((i) / 8U >= (size)                \
+       ? 0                           \
+       : ((set)->__bits[(i) / 8 / sizeof(long)] op(1UL << ((i) % (8 * sizeof(long))))))
 
 #define CPU_SET_S(i, size, set) __CPU_op_S(i, size, set, |=)
 #define CPU_CLR_S(i, size, set) __CPU_op_S(i, size, set, &= ~)
 #define CPU_ISSET_S(i, size, set) __CPU_op_S(i, size, set, &)
 
-#define __CPU_op_func_S(func, op)                                                             \
-    static __inline void __CPU_##func##_S(size_t __size, cpu_set_t* __dest,                   \
-                                          const cpu_set_t* __src1, const cpu_set_t* __src2) { \
-        size_t __i;                                                                           \
-        for (__i = 0; __i < __size / sizeof(long); __i++)                                     \
-            __dest->__bits[__i] = __src1->__bits[__i] op __src2->__bits[__i];                 \
-    }
+#define __CPU_op_func_S(func, op)                                                                  \
+  static __inline void __CPU_##func##_S(size_t __size, cpu_set_t* __dest, const cpu_set_t* __src1, \
+                                        const cpu_set_t* __src2) {                                 \
+    size_t __i;                                                                                    \
+    for (__i = 0; __i < __size / sizeof(long); __i++)                                              \
+      __dest->__bits[__i] = __src1->__bits[__i] op __src2->__bits[__i];                            \
+  }
 
 __CPU_op_func_S(AND, &) __CPU_op_func_S(OR, |) __CPU_op_func_S(XOR, ^)
 
@@ -80,9 +83,9 @@
 #define CPU_ZERO_S(size, set) memset(set, 0, size)
 #define CPU_EQUAL_S(size, set1, set2) (!memcmp(set1, set2, size))
 
-#define CPU_ALLOC_SIZE(n)                       \
-    (sizeof(long) * ((n) / (8 * sizeof(long)) + \
-                     ((n) % (8 * sizeof(long)) + 8 * sizeof(long) - 1) / (8 * sizeof(long))))
+#define CPU_ALLOC_SIZE(n)                     \
+  (sizeof(long) * ((n) / (8 * sizeof(long)) + \
+                   ((n) % (8 * sizeof(long)) + 8 * sizeof(long) - 1) / (8 * sizeof(long))))
 #define CPU_ALLOC(n) ((cpu_set_t*)calloc(1, CPU_ALLOC_SIZE(n)))
 #define CPU_FREE(set) free(set)
 
@@ -103,3 +106,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SCHED_H_
diff --git a/arch/arm64/sysroot/include/search.h b/arch/arm64/sysroot/include/search.h
index eb50439..5348eab 100644
--- a/arch/arm64/sysroot/include/search.h
+++ b/arch/arm64/sysroot/include/search.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SEARCH_H_
+#define SYSROOT_SEARCH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,16 +10,12 @@
 #define __NEED_size_t
 #include <bits/alltypes.h>
 
-typedef enum { FIND,
-               ENTER } ACTION;
-typedef enum { preorder,
-               postorder,
-               endorder,
-               leaf } VISIT;
+typedef enum { FIND, ENTER } ACTION;
+typedef enum { preorder, postorder, endorder, leaf } VISIT;
 
 typedef struct entry {
-    char* key;
-    void* data;
+  char* key;
+  void* data;
 } ENTRY;
 
 int hcreate(size_t);
@@ -27,9 +24,9 @@
 
 #ifdef _GNU_SOURCE
 struct hsearch_data {
-    struct __tab* __tab;
-    unsigned int __unused1;
-    unsigned int __unused2;
+  struct __tab* __tab;
+  unsigned int __unused1;
+  unsigned int __unused2;
 };
 
 int hcreate_r(size_t, struct hsearch_data*);
@@ -50,8 +47,8 @@
 
 #ifdef _GNU_SOURCE
 struct qelem {
-    struct qelem *q_forw, *q_back;
-    char q_data[1];
+  struct qelem *q_forw, *q_back;
+  char q_data[1];
 };
 
 void tdestroy(void*, void (*)(void*));
@@ -60,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SEARCH_H_
diff --git a/arch/arm64/sysroot/include/semaphore.h b/arch/arm64/sysroot/include/semaphore.h
index e4bf7a8..d9e996e 100644
--- a/arch/arm64/sysroot/include/semaphore.h
+++ b/arch/arm64/sysroot/include/semaphore.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SEMAPHORE_H_
+#define SYSROOT_SEMAPHORE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,10 +10,10 @@
 #define __NEED_sem_t
 #define __NEED_time_t
 #define __NEED_struct_timespec
-#include <bits/alltypes.h>
-
 #include <fcntl.h>
 
+#include <bits/alltypes.h>
+
 #define SEM_FAILED ((sem_t*)0)
 
 int sem_close(sem_t*);
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SEMAPHORE_H_
diff --git a/arch/arm64/sysroot/include/setjmp.h b/arch/arm64/sysroot/include/setjmp.h
index eaceeca..65971b7 100644
--- a/arch/arm64/sysroot/include/setjmp.h
+++ b/arch/arm64/sysroot/include/setjmp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SETJMP_H_
+#define SYSROOT_SETJMP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,9 +10,9 @@
 #include <bits/setjmp.h>
 
 typedef struct __jmp_buf_tag {
-    __jmp_buf __jb;
-    unsigned long __fl;
-    unsigned long __ss[128 / sizeof(long)];
+  __jmp_buf __jb;
+  unsigned long __fl;
+  unsigned long __ss[128 / sizeof(long)];
 } jmp_buf[1];
 
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
@@ -34,3 +35,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SETJMP_H_
diff --git a/arch/arm64/sysroot/include/signal.h b/arch/arm64/sysroot/include/signal.h
index b26c9b0..594cf80 100644
--- a/arch/arm64/sysroot/include/signal.h
+++ b/arch/arm64/sysroot/include/signal.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SIGNAL_H_
+#define SYSROOT_SIGNAL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -86,55 +87,55 @@
 #define CLD_CONTINUED 6
 
 union sigval {
-    int sival_int;
-    void* sival_ptr;
+  int sival_int;
+  void* sival_ptr;
 };
 
 typedef struct {
 #ifdef __SI_SWAP_ERRNO_CODE
-    int si_signo, si_code, si_errno;
+  int si_signo, si_code, si_errno;
 #else
-    int si_signo, si_errno, si_code;
+  int si_signo, si_errno, si_code;
 #endif
-    union {
-        char __pad[128 - 2 * sizeof(int) - sizeof(long)];
+  union {
+    char __pad[128 - 2 * sizeof(int) - sizeof(long)];
+    struct {
+      union {
         struct {
-            union {
-                struct {
-                    pid_t si_pid;
-                    uid_t si_uid;
-                } __piduid;
-                struct {
-                    int si_timerid;
-                    int si_overrun;
-                } __timer;
-            } __first;
-            union {
-                union sigval si_value;
-                struct {
-                    int si_status;
-                    clock_t si_utime, si_stime;
-                } __sigchld;
-            } __second;
-        } __si_common;
+          pid_t si_pid;
+          uid_t si_uid;
+        } __piduid;
         struct {
-            void* si_addr;
-            short si_addr_lsb;
-            struct {
-                void* si_lower;
-                void* si_upper;
-            } __addr_bnd;
-        } __sigfault;
+          int si_timerid;
+          int si_overrun;
+        } __timer;
+      } __first;
+      union {
+        union sigval si_value;
         struct {
-            long si_band;
-            int si_fd;
-        } __sigpoll;
-        struct {
-            void* si_call_addr;
-            int si_syscall;
-            unsigned si_arch;
-        } __sigsys;
-    } __si_fields;
+          int si_status;
+          clock_t si_utime, si_stime;
+        } __sigchld;
+      } __second;
+    } __si_common;
+    struct {
+      void* si_addr;
+      short si_addr_lsb;
+      struct {
+        void* si_lower;
+        void* si_upper;
+      } __addr_bnd;
+    } __sigfault;
+    struct {
+      long si_band;
+      int si_fd;
+    } __sigpoll;
+    struct {
+      void* si_call_addr;
+      int si_syscall;
+      unsigned si_arch;
+    } __sigsys;
+  } __si_fields;
 } siginfo_t;
 #define si_pid __si_fields.__si_common.__first.__piduid.si_pid
 #define si_uid __si_fields.__si_common.__first.__piduid.si_uid
@@ -157,24 +158,24 @@
 #define si_arch __si_fields.__sigsys.si_arch
 
 struct sigaction {
-    union {
-        void (*sa_handler)(int);
-        void (*sa_sigaction)(int, siginfo_t*, void*);
-    } __sa_handler;
-    sigset_t sa_mask;
-    int sa_flags;
-    void (*sa_restorer)(void);
+  union {
+    void (*sa_handler)(int);
+    void (*sa_sigaction)(int, siginfo_t*, void*);
+  } __sa_handler;
+  sigset_t sa_mask;
+  int sa_flags;
+  void (*sa_restorer)(void);
 };
 #define sa_handler __sa_handler.sa_handler
 #define sa_sigaction __sa_handler.sa_sigaction
 
 struct sigevent {
-    union sigval sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-    void (*sigev_notify_function)(union sigval);
-    pthread_attr_t* sigev_notify_attributes;
-    char __pad[56 - 3 * sizeof(long)];
+  union sigval sigev_value;
+  int sigev_signo;
+  int sigev_notify;
+  void (*sigev_notify_function)(union sigval);
+  pthread_attr_t* sigev_notify_attributes;
+  char __pad[56 - 3 * sizeof(long)];
 };
 
 #define SIGEV_SIGNAL 0
@@ -258,3 +259,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SIGNAL_H_
diff --git a/arch/arm64/sysroot/include/spawn.h b/arch/arm64/sysroot/include/spawn.h
index 74710cb..1c70bb2 100644
--- a/arch/arm64/sysroot/include/spawn.h
+++ b/arch/arm64/sysroot/include/spawn.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SPAWN_H_
+#define SYSROOT_SPAWN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,16 +23,16 @@
 #define POSIX_SPAWN_SETSCHEDULER 32
 
 typedef struct {
-    int __flags;
-    pid_t __pgrp;
-    sigset_t __def, __mask;
-    int __prio, __pol, __pad[16];
+  int __flags;
+  pid_t __pgrp;
+  sigset_t __def, __mask;
+  int __prio, __pol, __pad[16];
 } posix_spawnattr_t;
 
 typedef struct {
-    int __pad0[2];
-    void* __actions;
-    int __pad[16];
+  int __pad0[2];
+  void* __actions;
+  int __pad[16];
 } posix_spawn_file_actions_t;
 
 int posix_spawn(pid_t* __restrict, const char* __restrict, const posix_spawn_file_actions_t*,
@@ -74,3 +75,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SPAWN_H_
diff --git a/arch/arm64/sysroot/include/stdio.h b/arch/arm64/sysroot/include/stdio.h
index fde69be..c08aba0 100644
--- a/arch/arm64/sysroot/include/stdio.h
+++ b/arch/arm64/sysroot/include/stdio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STDIO_H_
+#define SYSROOT_STDIO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -44,8 +45,8 @@
 #define L_tmpnam 20
 
 typedef union _G_fpos64_t {
-    char __opaque[16];
-    double __align;
+  char __opaque[16];
+  double __align;
 } fpos_t;
 
 extern FILE* const stdin;
@@ -180,3 +181,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STDIO_H_
diff --git a/arch/arm64/sysroot/include/stdlib.h b/arch/arm64/sysroot/include/stdlib.h
index 0c29b16..862c83f 100644
--- a/arch/arm64/sysroot/include/stdlib.h
+++ b/arch/arm64/sysroot/include/stdlib.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_STDLIB_H_
+#define SYSROOT_STDLIB_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -53,9 +55,15 @@
 long labs(long);
 long long llabs(long long);
 
-typedef struct { int quot, rem; } div_t;
-typedef struct { long quot, rem; } ldiv_t;
-typedef struct { long long quot, rem; } lldiv_t;
+typedef struct {
+  int quot, rem;
+} div_t;
+typedef struct {
+  long quot, rem;
+} ldiv_t;
+typedef struct {
+  long long quot, rem;
+} lldiv_t;
 
 div_t div(int, int);
 ldiv_t ldiv(long, long);
@@ -110,7 +118,6 @@
 int grantpt(int);
 int unlockpt(int);
 char* ptsname(int);
-char* l64a(long);
 long a64l(const char*);
 void setkey(const char*);
 double drand48(void);
@@ -146,3 +153,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STDLIB_H_
diff --git a/arch/arm64/sysroot/include/stdnoreturn.h b/arch/arm64/sysroot/include/stdnoreturn.h
deleted file mode 100644
index 574bcca..0000000
--- a/arch/arm64/sysroot/include/stdnoreturn.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-
-#ifndef __cplusplus
-#include <features.h>
-#define noreturn _Noreturn
-#endif
diff --git a/arch/arm64/sysroot/include/string.h b/arch/arm64/sysroot/include/string.h
index d7ea6bb..0265b57 100644
--- a/arch/arm64/sysroot/include/string.h
+++ b/arch/arm64/sysroot/include/string.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_STRING_H_
+#define SYSROOT_STRING_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -84,3 +86,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STRING_H_
diff --git a/arch/arm64/sysroot/include/strings.h b/arch/arm64/sysroot/include/strings.h
index 343f31a..eb703d1 100644
--- a/arch/arm64/sysroot/include/strings.h
+++ b/arch/arm64/sysroot/include/strings.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STRINGS_H_
+#define SYSROOT_STRINGS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -33,3 +34,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STRINGS_H_
diff --git a/arch/arm64/sysroot/include/stropts.h b/arch/arm64/sysroot/include/stropts.h
index c2e6b7f..92eb968 100644
--- a/arch/arm64/sysroot/include/stropts.h
+++ b/arch/arm64/sysroot/include/stropts.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STROPTS_H_
+#define SYSROOT_STROPTS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -81,51 +82,51 @@
 #define MOREDATA 2
 
 struct bandinfo {
-    unsigned char bi_pri;
-    int bi_flag;
+  unsigned char bi_pri;
+  int bi_flag;
 };
 
 struct strbuf {
-    int maxlen;
-    int len;
-    char* buf;
+  int maxlen;
+  int len;
+  char* buf;
 };
 
 struct strpeek {
-    struct strbuf ctlbuf;
-    struct strbuf databuf;
-    unsigned flags;
+  struct strbuf ctlbuf;
+  struct strbuf databuf;
+  unsigned flags;
 };
 
 struct strfdinsert {
-    struct strbuf ctlbuf;
-    struct strbuf databuf;
-    unsigned flags;
-    int fildes;
-    int offset;
+  struct strbuf ctlbuf;
+  struct strbuf databuf;
+  unsigned flags;
+  int fildes;
+  int offset;
 };
 
 struct strioctl {
-    int ic_cmd;
-    int ic_timout;
-    int ic_len;
-    char* ic_dp;
+  int ic_cmd;
+  int ic_timout;
+  int ic_len;
+  char* ic_dp;
 };
 
 struct strrecvfd {
-    int fd;
-    int uid;
-    int gid;
-    char __fill[8];
+  int fd;
+  int uid;
+  int gid;
+  char __fill[8];
 };
 
 struct str_mlist {
-    char l_name[FMNAMESZ + 1];
+  char l_name[FMNAMESZ + 1];
 };
 
 struct str_list {
-    int sl_nmods;
-    struct str_mlist* sl_modlist;
+  int sl_nmods;
+  struct str_mlist* sl_modlist;
 };
 
 int isastream(int);
@@ -134,3 +135,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STROPTS_H_
diff --git a/arch/arm64/sysroot/include/sys/acct.h b/arch/arm64/sysroot/include/sys/acct.h
index be32528..8561ad0 100644
--- a/arch/arm64/sysroot/include/sys/acct.h
+++ b/arch/arm64/sysroot/include/sys/acct.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_ACCT_H_
+#define SYSROOT_SYS_ACCT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,45 +15,45 @@
 typedef uint16_t comp_t;
 
 struct acct {
-    char ac_flag;
-    uint16_t ac_uid;
-    uint16_t ac_gid;
-    uint16_t ac_tty;
-    uint32_t ac_btime;
-    comp_t ac_utime;
-    comp_t ac_stime;
-    comp_t ac_etime;
-    comp_t ac_mem;
-    comp_t ac_io;
-    comp_t ac_rw;
-    comp_t ac_minflt;
-    comp_t ac_majflt;
-    comp_t ac_swaps;
-    uint32_t ac_exitcode;
-    char ac_comm[ACCT_COMM + 1];
-    char ac_pad[10];
+  char ac_flag;
+  uint16_t ac_uid;
+  uint16_t ac_gid;
+  uint16_t ac_tty;
+  uint32_t ac_btime;
+  comp_t ac_utime;
+  comp_t ac_stime;
+  comp_t ac_etime;
+  comp_t ac_mem;
+  comp_t ac_io;
+  comp_t ac_rw;
+  comp_t ac_minflt;
+  comp_t ac_majflt;
+  comp_t ac_swaps;
+  uint32_t ac_exitcode;
+  char ac_comm[ACCT_COMM + 1];
+  char ac_pad[10];
 };
 
 struct acct_v3 {
-    char ac_flag;
-    char ac_version;
-    uint16_t ac_tty;
-    uint32_t ac_exitcode;
-    uint32_t ac_uid;
-    uint32_t ac_gid;
-    uint32_t ac_pid;
-    uint32_t ac_ppid;
-    uint32_t ac_btime;
-    float ac_etime;
-    comp_t ac_utime;
-    comp_t ac_stime;
-    comp_t ac_mem;
-    comp_t ac_io;
-    comp_t ac_rw;
-    comp_t ac_minflt;
-    comp_t ac_majflt;
-    comp_t ac_swaps;
-    char ac_comm[ACCT_COMM];
+  char ac_flag;
+  char ac_version;
+  uint16_t ac_tty;
+  uint32_t ac_exitcode;
+  uint32_t ac_uid;
+  uint32_t ac_gid;
+  uint32_t ac_pid;
+  uint32_t ac_ppid;
+  uint32_t ac_btime;
+  float ac_etime;
+  comp_t ac_utime;
+  comp_t ac_stime;
+  comp_t ac_mem;
+  comp_t ac_io;
+  comp_t ac_rw;
+  comp_t ac_minflt;
+  comp_t ac_majflt;
+  comp_t ac_swaps;
+  char ac_comm[ACCT_COMM];
 };
 
 #define AFORK 1
@@ -67,3 +68,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_ACCT_H_
diff --git a/arch/arm64/sysroot/include/sys/auxv.h b/arch/arm64/sysroot/include/sys/auxv.h
index 72d5de9..61ddea0 100644
--- a/arch/arm64/sysroot/include/sys/auxv.h
+++ b/arch/arm64/sysroot/include/sys/auxv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_AUXV_H_
+#define SYSROOT_SYS_AUXV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_AUXV_H_
diff --git a/arch/arm64/sysroot/include/sys/eventfd.h b/arch/arm64/sysroot/include/sys/eventfd.h
index c22369e..4259bac 100644
--- a/arch/arm64/sysroot/include/sys/eventfd.h
+++ b/arch/arm64/sysroot/include/sys/eventfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_EVENTFD_H_
+#define SYSROOT_SYS_EVENTFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_EVENTFD_H_
diff --git a/arch/arm64/sysroot/include/sys/file.h b/arch/arm64/sysroot/include/sys/file.h
index c32fcb8..fe17290 100644
--- a/arch/arm64/sysroot/include/sys/file.h
+++ b/arch/arm64/sysroot/include/sys/file.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_FILE_H_
+#define SYSROOT_SYS_FILE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_FILE_H_
diff --git a/arch/arm64/sysroot/include/sys/fsuid.h b/arch/arm64/sysroot/include/sys/fsuid.h
index 29ea02b..a9f654c 100644
--- a/arch/arm64/sysroot/include/sys/fsuid.h
+++ b/arch/arm64/sysroot/include/sys/fsuid.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_FSUID_H_
+#define SYSROOT_SYS_FSUID_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,3 +16,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_FSUID_H_
diff --git a/arch/arm64/sysroot/include/sys/io.h b/arch/arm64/sysroot/include/sys/io.h
index f5013a2..89617e5 100644
--- a/arch/arm64/sysroot/include/sys/io.h
+++ b/arch/arm64/sysroot/include/sys/io.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IO_H_
+#define SYSROOT_SYS_IO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,3 +15,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IO_H_
diff --git a/arch/arm64/sysroot/include/sys/ioctl.h b/arch/arm64/sysroot/include/sys/ioctl.h
index c782d2e..ad22a3b 100644
--- a/arch/arm64/sysroot/include/sys/ioctl.h
+++ b/arch/arm64/sysroot/include/sys/ioctl.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IOCTL_H_
+#define SYSROOT_SYS_IOCTL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IOCTL_H_
diff --git a/arch/arm64/sysroot/include/sys/ipc.h b/arch/arm64/sysroot/include/sys/ipc.h
index a3a380c..5d019f4 100644
--- a/arch/arm64/sysroot/include/sys/ipc.h
+++ b/arch/arm64/sysroot/include/sys/ipc.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IPC_H_
+#define SYSROOT_SYS_IPC_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,3 +40,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IPC_H_
diff --git a/arch/arm64/sysroot/include/sys/klog.h b/arch/arm64/sysroot/include/sys/klog.h
index ccde5e8..b182302 100644
--- a/arch/arm64/sysroot/include/sys/klog.h
+++ b/arch/arm64/sysroot/include/sys/klog.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_KLOG_H_
+#define SYSROOT_SYS_KLOG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,3 +10,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_KLOG_H_
diff --git a/arch/arm64/sysroot/include/sys/mman.h b/arch/arm64/sysroot/include/sys/mman.h
index c5ff3bf..7a913ae 100644
--- a/arch/arm64/sysroot/include/sys/mman.h
+++ b/arch/arm64/sysroot/include/sys/mman.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MMAN_H_
+#define SYSROOT_SYS_MMAN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,6 +30,7 @@
 #define MAP_NONBLOCK 0x10000
 #define MAP_STACK 0x20000
 #define MAP_HUGETLB 0x40000
+#define MAP_JIT 0x80000
 #define MAP_FILE 0
 
 #define PROT_NONE 0
@@ -96,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MMAN_H_
diff --git a/arch/arm64/sysroot/include/sys/mount.h b/arch/arm64/sysroot/include/sys/mount.h
index 9d3394b..53181ea 100644
--- a/arch/arm64/sysroot/include/sys/mount.h
+++ b/arch/arm64/sysroot/include/sys/mount.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MOUNT_H_
+#define SYSROOT_SYS_MOUNT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -68,3 +69,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MOUNT_H_
diff --git a/arch/arm64/sysroot/include/sys/msg.h b/arch/arm64/sysroot/include/sys/msg.h
index 6d08dad..be0114b 100644
--- a/arch/arm64/sysroot/include/sys/msg.h
+++ b/arch/arm64/sysroot/include/sys/msg.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MSG_H_
+#define SYSROOT_SYS_MSG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -28,8 +29,8 @@
 #define MSG_INFO 12
 
 struct msginfo {
-    int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
-    unsigned short msgseg;
+  int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
+  unsigned short msgseg;
 };
 
 int msgctl(int, int, struct msqid_ds*);
@@ -39,11 +40,13 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 struct msgbuf {
-    long mtype;
-    char mtext[1];
+  long mtype;
+  char mtext[1];
 };
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MSG_H_
diff --git a/arch/arm64/sysroot/include/sys/mtio.h b/arch/arm64/sysroot/include/sys/mtio.h
index 2f4cf9a..3d9f753 100644
--- a/arch/arm64/sysroot/include/sys/mtio.h
+++ b/arch/arm64/sysroot/include/sys/mtio.h
@@ -1,11 +1,12 @@
-#pragma once
+#ifndef SYSROOT_SYS_MTIO_H_
+#define SYSROOT_SYS_MTIO_H_
 
 #include <sys/ioctl.h>
 #include <sys/types.h>
 
 struct mtop {
-    short mt_op;
-    int mt_count;
+  short mt_op;
+  int mt_count;
 };
 
 #define _IOT_mtop _IOT(_IOTS(short), 1, _IOTS(int), 1, 0, 0)
@@ -47,13 +48,13 @@
 #define MTMKPART 34
 
 struct mtget {
-    long mt_type;
-    long mt_resid;
-    long mt_dsreg;
-    long mt_gstat;
-    long mt_erreg;
-    int mt_fileno;
-    int mt_blkno;
+  long mt_type;
+  long mt_resid;
+  long mt_dsreg;
+  long mt_gstat;
+  long mt_erreg;
+  int mt_fileno;
+  int mt_blkno;
 };
 
 #define MT_ISUNKNOWN 0x01
@@ -78,53 +79,51 @@
 #define MT_ISFTAPE_FLAG 0x800000
 
 struct mt_tape_info {
-    long t_type;
-    char* t_name;
+  long t_type;
+  char* t_name;
 };
 
 #define MT_TAPE_INFO                                                                              \
-    {                                                                                             \
-        {MT_ISUNKNOWN, "Unknown type of tape device"},                                            \
-            {MT_ISQIC02, "Generic QIC-02 tape streamer"}, {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
-            {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, {MT_ISCMSJ500, "CMS Jumbo 500"},            \
-            {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"},                                          \
-            {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"},                                        \
-            {MT_ISARCHIVE_2150L, "Archive Viper 2150L"},                                          \
-            {MT_ISARCHIVE_2060L, "Archive Viper 2060L"},                                          \
-            {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"},                              \
-            {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"},                       \
-            {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"},                                       \
-            {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"},                           \
-            {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, {MT_ISSCSI1, "Generic SCSI-1 tape"},     \
-            {MT_ISSCSI2, "Generic SCSI-2 tape"}, {                                                \
-            0, 0                                                                                  \
-        }                                                                                         \
-    }
+  {                                                                                               \
+    {MT_ISUNKNOWN, "Unknown type of tape device"}, {MT_ISQIC02, "Generic QIC-02 tape streamer"},  \
+        {MT_ISWT5150, "Wangtek 5150, QIC-150"}, {MT_ISARCHIVE_5945L2, "Archive 5945L-2"},         \
+        {MT_ISCMSJ500, "CMS Jumbo 500"}, {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"},             \
+        {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"},                                            \
+        {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+        {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"},                                  \
+        {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"},                           \
+        {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"},                                           \
+        {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"},                               \
+        {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, {MT_ISSCSI1, "Generic SCSI-1 tape"},         \
+        {MT_ISSCSI2, "Generic SCSI-2 tape"}, {                                                    \
+      0, 0                                                                                        \
+    }                                                                                             \
+  }
 
 struct mtpos {
-    long mt_blkno;
+  long mt_blkno;
 };
 
 struct mtconfiginfo {
-    long mt_type;
-    long ifc_type;
-    unsigned short irqnr;
-    unsigned short dmanr;
-    unsigned short port;
-    unsigned long debug;
-    unsigned have_dens : 1;
-    unsigned have_bsf : 1;
-    unsigned have_fsr : 1;
-    unsigned have_bsr : 1;
-    unsigned have_eod : 1;
-    unsigned have_seek : 1;
-    unsigned have_tell : 1;
-    unsigned have_ras1 : 1;
-    unsigned have_ras2 : 1;
-    unsigned have_ras3 : 1;
-    unsigned have_qfa : 1;
-    unsigned pad1 : 5;
-    char reserved[10];
+  long mt_type;
+  long ifc_type;
+  unsigned short irqnr;
+  unsigned short dmanr;
+  unsigned short port;
+  unsigned long debug;
+  unsigned have_dens : 1;
+  unsigned have_bsf : 1;
+  unsigned have_fsr : 1;
+  unsigned have_bsr : 1;
+  unsigned have_eod : 1;
+  unsigned have_seek : 1;
+  unsigned have_tell : 1;
+  unsigned have_ras1 : 1;
+  unsigned have_ras2 : 1;
+  unsigned have_ras3 : 1;
+  unsigned have_qfa : 1;
+  unsigned pad1 : 5;
+  char reserved[10];
 };
 
 #define MTIOCTOP _IOW('m', 1, struct mtop)
@@ -180,3 +179,5 @@
 #ifndef DEFTAPE
 #define DEFTAPE "/dev/tape"
 #endif
+
+#endif  // SYSROOT_SYS_MTIO_H_
diff --git a/arch/arm64/sysroot/include/sys/param.h b/arch/arm64/sysroot/include/sys/param.h
index 64989a4..301bba7 100644
--- a/arch/arm64/sysroot/include/sys/param.h
+++ b/arch/arm64/sysroot/include/sys/param.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_PARAM_H_
+#define SYSROOT_SYS_PARAM_H_
 
 #define MAXSYMLINKS 20
 #define MAXHOSTNAMELEN 64
@@ -29,3 +30,5 @@
 
 #include <endian.h>
 #include <limits.h>
+
+#endif  // SYSROOT_SYS_PARAM_H_
diff --git a/arch/arm64/sysroot/include/sys/personality.h b/arch/arm64/sysroot/include/sys/personality.h
index 3da0e20..b32d1eb 100644
--- a/arch/arm64/sysroot/include/sys/personality.h
+++ b/arch/arm64/sysroot/include/sys/personality.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_PERSONALITY_H_
+#define SYSROOT_SYS_PERSONALITY_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,3 +43,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_PERSONALITY_H_
diff --git a/arch/arm64/sysroot/include/sys/quota.h b/arch/arm64/sysroot/include/sys/quota.h
index ae2e194..aec5dc9 100644
--- a/arch/arm64/sysroot/include/sys/quota.h
+++ b/arch/arm64/sysroot/include/sys/quota.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_QUOTA_H_
+#define SYSROOT_SYS_QUOTA_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -57,15 +58,15 @@
 #define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
 
 struct dqblk {
-    uint64_t dqb_bhardlimit;
-    uint64_t dqb_bsoftlimit;
-    uint64_t dqb_curspace;
-    uint64_t dqb_ihardlimit;
-    uint64_t dqb_isoftlimit;
-    uint64_t dqb_curinodes;
-    uint64_t dqb_btime;
-    uint64_t dqb_itime;
-    uint32_t dqb_valid;
+  uint64_t dqb_bhardlimit;
+  uint64_t dqb_bsoftlimit;
+  uint64_t dqb_curspace;
+  uint64_t dqb_ihardlimit;
+  uint64_t dqb_isoftlimit;
+  uint64_t dqb_curinodes;
+  uint64_t dqb_btime;
+  uint64_t dqb_itime;
+  uint32_t dqb_valid;
 };
 
 #define dq_bhardlimit dq_dqb.dqb_bhardlimit
@@ -86,10 +87,10 @@
 #define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
 
 struct dqinfo {
-    uint64_t dqi_bgrace;
-    uint64_t dqi_igrace;
-    uint32_t dqi_flags;
-    uint32_t dqi_valid;
+  uint64_t dqi_bgrace;
+  uint64_t dqi_igrace;
+  uint32_t dqi_flags;
+  uint32_t dqi_valid;
 };
 
 int quotactl(int, const char*, int, char*);
@@ -97,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_QUOTA_H_
diff --git a/arch/arm64/sysroot/include/sys/random.h b/arch/arm64/sysroot/include/sys/random.h
index 080c3b4..258201d 100644
--- a/arch/arm64/sysroot/include/sys/random.h
+++ b/arch/arm64/sysroot/include/sys/random.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_RANDOM_H_
+#define SYSROOT_SYS_RANDOM_H_
 
 #include <stddef.h>
 
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_RANDOM_H_
diff --git a/arch/arm64/sysroot/include/sys/reboot.h b/arch/arm64/sysroot/include/sys/reboot.h
index f28375d..a83629c 100644
--- a/arch/arm64/sysroot/include/sys/reboot.h
+++ b/arch/arm64/sysroot/include/sys/reboot.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_REBOOT_H_
+#define SYSROOT_SYS_REBOOT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_REBOOT_H_
diff --git a/arch/arm64/sysroot/include/sys/reg.h b/arch/arm64/sysroot/include/sys/reg.h
index 22a9caa..0f37ffe 100644
--- a/arch/arm64/sysroot/include/sys/reg.h
+++ b/arch/arm64/sysroot/include/sys/reg.h
@@ -1,6 +1,9 @@
-#pragma once
+#ifndef SYSROOT_SYS_REG_H_
+#define SYSROOT_SYS_REG_H_
 
 #include <limits.h>
 #include <unistd.h>
 
 #include <bits/reg.h>
+
+#endif  // SYSROOT_SYS_REG_H_
diff --git a/arch/arm64/sysroot/include/sys/select.h b/arch/arm64/sysroot/include/sys/select.h
index 25197d8..5d4fd7d 100644
--- a/arch/arm64/sysroot/include/sys/select.h
+++ b/arch/arm64/sysroot/include/sys/select.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SELECT_H_
+#define SYSROOT_SYS_SELECT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,21 +20,23 @@
 
 typedef unsigned long fd_mask;
 
-typedef struct { unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)]; } fd_set;
+typedef struct {
+  unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)];
+} fd_set;
 
-#define FD_ZERO(s)                                            \
-    do {                                                      \
-        int __i;                                              \
-        unsigned long* __b = (s)->fds_bits;                   \
-        for (__i = sizeof(fd_set) / sizeof(long); __i; __i--) \
-            *__b++ = 0;                                       \
-    } while (0)
+#define FD_ZERO(s)                                        \
+  do {                                                    \
+    int __i;                                              \
+    unsigned long* __b = (s)->fds_bits;                   \
+    for (__i = sizeof(fd_set) / sizeof(long); __i; __i--) \
+      *__b++ = 0;                                         \
+  } while (0)
 #define FD_SET(d, s) \
-    ((s)->fds_bits[(d) / (8 * sizeof(long))] |= (1UL << ((d) % (8 * sizeof(long)))))
+  ((s)->fds_bits[(d) / (8 * sizeof(long))] |= (1UL << ((d) % (8 * sizeof(long)))))
 #define FD_CLR(d, s) \
-    ((s)->fds_bits[(d) / (8 * sizeof(long))] &= ~(1UL << ((d) % (8 * sizeof(long)))))
+  ((s)->fds_bits[(d) / (8 * sizeof(long))] &= ~(1UL << ((d) % (8 * sizeof(long)))))
 #define FD_ISSET(d, s) \
-    !!((s)->fds_bits[(d) / (8 * sizeof(long))] & (1UL << ((d) % (8 * sizeof(long)))))
+  !!((s)->fds_bits[(d) / (8 * sizeof(long))] & (1UL << ((d) % (8 * sizeof(long)))))
 
 int select(int, fd_set* __restrict, fd_set* __restrict, fd_set* __restrict,
            struct timeval* __restrict);
@@ -47,3 +50,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SELECT_H_
diff --git a/arch/arm64/sysroot/include/sys/sem.h b/arch/arm64/sysroot/include/sys/sem.h
index 864161f..a4330af 100644
--- a/arch/arm64/sysroot/include/sys/sem.h
+++ b/arch/arm64/sysroot/include/sys/sem.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SEM_H_
+#define SYSROOT_SYS_SEM_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -12,10 +13,10 @@
 #ifdef _GNU_SOURCE
 #define __NEED_struct_timespec
 #endif
-#include <bits/alltypes.h>
-
 #include <sys/ipc.h>
 
+#include <bits/alltypes.h>
+
 #define SEM_UNDO 0x1000
 #define GETPID 11
 #define GETVAL 12
@@ -35,22 +36,22 @@
 #define SEM_INFO 19
 
 struct seminfo {
-    int semmap;
-    int semmni;
-    int semmns;
-    int semmnu;
-    int semmsl;
-    int semopm;
-    int semume;
-    int semusz;
-    int semvzx;
-    int semaem;
+  int semmap;
+  int semmni;
+  int semmns;
+  int semmnu;
+  int semmsl;
+  int semopm;
+  int semume;
+  int semusz;
+  int semvzx;
+  int semaem;
 };
 
 struct sembuf {
-    unsigned short sem_num;
-    short sem_op;
-    short sem_flg;
+  unsigned short sem_num;
+  short sem_op;
+  short sem_flg;
 };
 
 int semctl(int, int, int, ...);
@@ -64,3 +65,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SEM_H_
diff --git a/arch/arm64/sysroot/include/sys/sendfile.h b/arch/arm64/sysroot/include/sys/sendfile.h
deleted file mode 100644
index 1c94a6b..0000000
--- a/arch/arm64/sysroot/include/sys/sendfile.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <features.h>
-#include <unistd.h>
-
-ssize_t sendfile(int, int, off_t*, size_t);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/arm64/sysroot/include/sys/shm.h b/arch/arm64/sysroot/include/sys/shm.h
index b4780d6..55b4389 100644
--- a/arch/arm64/sysroot/include/sys/shm.h
+++ b/arch/arm64/sysroot/include/sys/shm.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SHM_H_
+#define SYSROOT_SYS_SHM_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,10 +11,10 @@
 #define __NEED_size_t
 #define __NEED_pid_t
 
-#include <bits/alltypes.h>
-
 #include <sys/ipc.h>
 
+#include <bits/alltypes.h>
+
 #ifdef _GNU_SOURCE
 #define __used_ids used_ids
 #define __swap_attempts swap_attempts
@@ -49,3 +50,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SHM_H_
diff --git a/arch/arm64/sysroot/include/sys/signalfd.h b/arch/arm64/sysroot/include/sys/signalfd.h
index 832cc78..46a5489 100644
--- a/arch/arm64/sysroot/include/sys/signalfd.h
+++ b/arch/arm64/sysroot/include/sys/signalfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SIGNALFD_H_
+#define SYSROOT_SYS_SIGNALFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,26 +18,28 @@
 int signalfd(int, const sigset_t*, int);
 
 struct signalfd_siginfo {
-    uint32_t ssi_signo;
-    int32_t ssi_errno;
-    int32_t ssi_code;
-    uint32_t ssi_pid;
-    uint32_t ssi_uid;
-    int32_t ssi_fd;
-    uint32_t ssi_tid;
-    uint32_t ssi_band;
-    uint32_t ssi_overrun;
-    uint32_t ssi_trapno;
-    int32_t ssi_status;
-    int32_t ssi_int;
-    uint64_t ssi_ptr;
-    uint64_t ssi_utime;
-    uint64_t ssi_stime;
-    uint64_t ssi_addr;
-    uint16_t ssi_addr_lsb;
-    uint8_t pad[128 - 12 * 4 - 4 * 8 - 2];
+  uint32_t ssi_signo;
+  int32_t ssi_errno;
+  int32_t ssi_code;
+  uint32_t ssi_pid;
+  uint32_t ssi_uid;
+  int32_t ssi_fd;
+  uint32_t ssi_tid;
+  uint32_t ssi_band;
+  uint32_t ssi_overrun;
+  uint32_t ssi_trapno;
+  int32_t ssi_status;
+  int32_t ssi_int;
+  uint64_t ssi_ptr;
+  uint64_t ssi_utime;
+  uint64_t ssi_stime;
+  uint64_t ssi_addr;
+  uint16_t ssi_addr_lsb;
+  uint8_t pad[128 - 12 * 4 - 4 * 8 - 2];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SIGNALFD_H_
diff --git a/arch/arm64/sysroot/include/sys/socket.h b/arch/arm64/sysroot/include/sys/socket.h
index 10167be..7f68e6e 100644
--- a/arch/arm64/sysroot/include/sys/socket.h
+++ b/arch/arm64/sysroot/include/sys/socket.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SOCKET_H_
+#define SYSROOT_SYS_SOCKET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,19 +17,18 @@
 #define __NEED_struct_iovec
 
 #include <bits/alltypes.h>
-
 #include <bits/socket.h>
 
 #ifdef _GNU_SOURCE
 struct ucred {
-    pid_t pid;
-    uid_t uid;
-    gid_t gid;
+  pid_t pid;
+  uid_t uid;
+  gid_t gid;
 };
 
 struct mmsghdr {
-    struct msghdr msg_hdr;
-    unsigned int msg_len;
+  struct msghdr msg_hdr;
+  unsigned int msg_len;
 };
 
 struct timespec;
@@ -38,8 +38,8 @@
 #endif
 
 struct linger {
-    int l_onoff;
-    int l_linger;
+  int l_onoff;
+  int l_linger;
 };
 
 #define SHUT_RD 0
@@ -260,16 +260,15 @@
 #define __MHDR_END(mhdr) ((unsigned char*)(mhdr)->msg_control + (mhdr)->msg_controllen)
 
 #define CMSG_DATA(cmsg) ((unsigned char*)(((struct cmsghdr*)(cmsg)) + 1))
-#define CMSG_NXTHDR(mhdr, cmsg)                                            \
-    ((cmsg)->cmsg_len < sizeof(struct cmsghdr)                             \
-         ? (struct cmsghdr*)0                                              \
-         : (__CMSG_NEXT(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) \
-                ? (struct cmsghdr*)0                                       \
-                : ((struct cmsghdr*)__CMSG_NEXT(cmsg))))
-#define CMSG_FIRSTHDR(mhdr)                                   \
-    ((size_t)(mhdr)->msg_controllen >= sizeof(struct cmsghdr) \
-         ? (struct cmsghdr*)(mhdr)->msg_control               \
-         : (struct cmsghdr*)0)
+#define CMSG_NXTHDR(mhdr, cmsg)                                          \
+  ((cmsg)->cmsg_len < sizeof(struct cmsghdr)                             \
+       ? (struct cmsghdr*)0                                              \
+       : (__CMSG_NEXT(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) \
+              ? (struct cmsghdr*)0                                       \
+              : ((struct cmsghdr*)__CMSG_NEXT(cmsg))))
+#define CMSG_FIRSTHDR(mhdr)                                                                        \
+  ((size_t)(mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? (struct cmsghdr*)(mhdr)->msg_control \
+                                                            : (struct cmsghdr*)0)
 
 #define CMSG_ALIGN(len) (((len) + sizeof(size_t) - 1) & (size_t) ~(sizeof(size_t) - 1))
 #define CMSG_SPACE(len) (CMSG_ALIGN(len) + CMSG_ALIGN(sizeof(struct cmsghdr)))
@@ -279,14 +278,14 @@
 #define SCM_CREDENTIALS 0x02
 
 struct sockaddr {
-    sa_family_t sa_family;
-    char sa_data[14];
+  sa_family_t sa_family;
+  char sa_data[14];
 };
 
 struct sockaddr_storage {
-    sa_family_t ss_family;
-    unsigned long __ss_align;
-    char __ss_padding[128 - 2 * sizeof(unsigned long)];
+  sa_family_t ss_family;
+  unsigned long __ss_align;
+  char __ss_padding[128 - 2 * sizeof(unsigned long)];
 };
 
 int socket(int, int, int);
@@ -319,3 +318,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SOCKET_H_
diff --git a/arch/arm64/sysroot/include/sys/stat.h b/arch/arm64/sysroot/include/sys/stat.h
index 2be2ff5..d58e26c 100644
--- a/arch/arm64/sysroot/include/sys/stat.h
+++ b/arch/arm64/sysroot/include/sys/stat.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_STAT_H_
+#define SYSROOT_SYS_STAT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,7 +20,6 @@
 #define __NEED_struct_timespec
 
 #include <bits/alltypes.h>
-
 #include <bits/stat.h>
 
 #define st_atime st_atim.tv_sec
@@ -98,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STAT_H_
diff --git a/arch/arm64/sysroot/include/sys/statfs.h b/arch/arm64/sysroot/include/sys/statfs.h
index c2a3d41..1459181 100644
--- a/arch/arm64/sysroot/include/sys/statfs.h
+++ b/arch/arm64/sysroot/include/sys/statfs.h
@@ -1,14 +1,16 @@
-#pragma once
+#ifndef SYSROOT_SYS_STATFS_H_
+#define SYSROOT_SYS_STATFS_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <sys/statvfs.h>
 
-typedef struct __fsid_t { int __val[2]; } fsid_t;
+typedef struct __fsid_t {
+  int __val[2];
+} fsid_t;
 
 #include <bits/statfs.h>
 
@@ -18,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STATFS_H_
diff --git a/arch/arm64/sysroot/include/sys/statvfs.h b/arch/arm64/sysroot/include/sys/statvfs.h
index 6031e66..0423246 100644
--- a/arch/arm64/sysroot/include/sys/statvfs.h
+++ b/arch/arm64/sysroot/include/sys/statvfs.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_STATVFS_H_
+#define SYSROOT_SYS_STATVFS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -8,23 +9,23 @@
 
 #define __NEED_fsblkcnt_t
 #define __NEED_fsfilcnt_t
-#include <bits/alltypes.h>
-
 #include <endian.h>
 
+#include <bits/alltypes.h>
+
 struct statvfs {
-    unsigned long f_bsize, f_frsize;
-    fsblkcnt_t f_blocks, f_bfree, f_bavail;
-    fsfilcnt_t f_files, f_ffree, f_favail;
+  unsigned long f_bsize, f_frsize;
+  fsblkcnt_t f_blocks, f_bfree, f_bavail;
+  fsfilcnt_t f_files, f_ffree, f_favail;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned long f_fsid;
-    unsigned : 8 * (2 * sizeof(int) - sizeof(long));
+  unsigned long f_fsid;
+  unsigned : 8 * (2 * sizeof(int) - sizeof(long));
 #else
-    unsigned : 8 * (2 * sizeof(int) - sizeof(long));
-    unsigned long f_fsid;
+  unsigned : 8 * (2 * sizeof(int) - sizeof(long));
+  unsigned long f_fsid;
 #endif
-    unsigned long f_flag, f_namemax;
-    int __reserved[6];
+  unsigned long f_flag, f_namemax;
+  int __reserved[6];
 };
 
 int statvfs(const char* __restrict, struct statvfs* __restrict);
@@ -45,3 +46,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STATVFS_H_
diff --git a/arch/arm64/sysroot/include/sys/swap.h b/arch/arm64/sysroot/include/sys/swap.h
index e9d516d..6420606 100644
--- a/arch/arm64/sysroot/include/sys/swap.h
+++ b/arch/arm64/sysroot/include/sys/swap.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SWAP_H_
+#define SYSROOT_SYS_SWAP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,3 +16,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SWAP_H_
diff --git a/arch/arm64/sysroot/include/sys/time.h b/arch/arm64/sysroot/include/sys/time.h
index 81c410a..a9476c7 100644
--- a/arch/arm64/sysroot/include/sys/time.h
+++ b/arch/arm64/sysroot/include/sys/time.h
@@ -1,11 +1,11 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIME_H_
+#define SYSROOT_SYS_TIME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <sys/select.h>
 
 int gettimeofday(struct timeval* __restrict, void* __restrict);
@@ -17,8 +17,8 @@
 #define ITIMER_PROF 2
 
 struct itimerval {
-    struct timeval it_interval;
-    struct timeval it_value;
+  struct timeval it_interval;
+  struct timeval it_value;
 };
 
 int getitimer(int, struct itimerval*);
@@ -29,8 +29,8 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 struct timezone {
-    int tz_minuteswest;
-    int tz_dsttime;
+  int tz_minuteswest;
+  int tz_dsttime;
 };
 int futimes(int, const struct timeval[2]);
 int futimesat(int, const char*, const struct timeval[2]);
@@ -40,24 +40,26 @@
 #define timerisset(t) ((t)->tv_sec || (t)->tv_usec)
 #define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0)
 #define timercmp(s, t, op) \
-    ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op(t)->tv_usec : (s)->tv_sec op(t)->tv_sec)
-#define timeradd(s, t, a)                                             \
-    (void)((a)->tv_sec = (s)->tv_sec + (t)->tv_sec,                   \
-           ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
-               ((a)->tv_usec -= 1000000, (a)->tv_sec++))
-#define timersub(s, t, a)                                      \
-    (void)((a)->tv_sec = (s)->tv_sec - (t)->tv_sec,            \
-           ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
-               ((a)->tv_usec += 1000000, (a)->tv_sec--))
+  ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op(t)->tv_usec : (s)->tv_sec op(t)->tv_sec)
+#define timeradd(s, t, a)                                           \
+  (void)((a)->tv_sec = (s)->tv_sec + (t)->tv_sec,                   \
+         ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
+             ((a)->tv_usec -= 1000000, (a)->tv_sec++))
+#define timersub(s, t, a)                                    \
+  (void)((a)->tv_sec = (s)->tv_sec - (t)->tv_sec,            \
+         ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
+             ((a)->tv_usec += 1000000, (a)->tv_sec--))
 #endif
 
 #if defined(_GNU_SOURCE)
 #define TIMEVAL_TO_TIMESPEC(tv, ts) \
-    ((ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0)
+  ((ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0)
 #define TIMESPEC_TO_TIMEVAL(tv, ts) \
-    ((tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0)
+  ((tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0)
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIME_H_
diff --git a/arch/arm64/sysroot/include/sys/timeb.h b/arch/arm64/sysroot/include/sys/timeb.h
index 560158b..bbb7e34 100644
--- a/arch/arm64/sysroot/include/sys/timeb.h
+++ b/arch/arm64/sysroot/include/sys/timeb.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMEB_H_
+#define SYSROOT_SYS_TIMEB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,9 +10,9 @@
 #include <bits/alltypes.h>
 
 struct timeb {
-    time_t time;
-    unsigned short millitm;
-    short timezone, dstflag;
+  time_t time;
+  unsigned short millitm;
+  short timezone, dstflag;
 };
 
 int ftime(struct timeb*);
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMEB_H_
diff --git a/arch/arm64/sysroot/include/sys/timerfd.h b/arch/arm64/sysroot/include/sys/timerfd.h
index c6b52b3..499a938 100644
--- a/arch/arm64/sysroot/include/sys/timerfd.h
+++ b/arch/arm64/sysroot/include/sys/timerfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMERFD_H_
+#define SYSROOT_SYS_TIMERFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -21,3 +22,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMERFD_H_
diff --git a/arch/arm64/sysroot/include/sys/times.h b/arch/arm64/sysroot/include/sys/times.h
index d573297..ec5d3d6 100644
--- a/arch/arm64/sysroot/include/sys/times.h
+++ b/arch/arm64/sysroot/include/sys/times.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMES_H_
+#define SYSROOT_SYS_TIMES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -8,10 +9,10 @@
 #include <bits/alltypes.h>
 
 struct tms {
-    clock_t tms_utime;
-    clock_t tms_stime;
-    clock_t tms_cutime;
-    clock_t tms_cstime;
+  clock_t tms_utime;
+  clock_t tms_stime;
+  clock_t tms_cutime;
+  clock_t tms_cstime;
 };
 
 clock_t times(struct tms*);
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMES_H_
diff --git a/arch/arm64/sysroot/include/sys/timex.h b/arch/arm64/sysroot/include/sys/timex.h
index 8aa166e..9981c93 100644
--- a/arch/arm64/sysroot/include/sys/timex.h
+++ b/arch/arm64/sysroot/include/sys/timex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMEX_H_
+#define SYSROOT_SYS_TIMEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -6,26 +7,26 @@
 
 #define __NEED_clockid_t
 
-#include <bits/alltypes.h>
-
 #include <sys/time.h>
 
+#include <bits/alltypes.h>
+
 struct ntptimeval {
-    struct timeval time;
-    long maxerror, esterror;
+  struct timeval time;
+  long maxerror, esterror;
 };
 
 struct timex {
-    unsigned modes;
-    long offset, freq, maxerror, esterror;
-    int status;
-    long constant, precision, tolerance;
-    struct timeval time;
-    long tick, ppsfreq, jitter;
-    int shift;
-    long stabil, jitcnt, calcnt, errcnt, stbcnt;
-    int tai;
-    int __padding[11];
+  unsigned modes;
+  long offset, freq, maxerror, esterror;
+  int status;
+  long constant, precision, tolerance;
+  struct timeval time;
+  long tick, ppsfreq, jitter;
+  int shift;
+  long stabil, jitcnt, calcnt, errcnt, stbcnt;
+  int tai;
+  int __padding[11];
 };
 
 #define ADJ_OFFSET 0x0001
@@ -74,9 +75,9 @@
 #define STA_MODE 0x4000
 #define STA_CLK 0x8000
 
-#define STA_RONLY                                                                             \
-    (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | \
-     STA_MODE | STA_CLK)
+#define STA_RONLY                                                                           \
+  (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | \
+   STA_MODE | STA_CLK)
 
 #define TIME_OK 0
 #define TIME_INS 1
@@ -94,3 +95,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMEX_H_
diff --git a/arch/arm64/sysroot/include/sys/ttydefaults.h b/arch/arm64/sysroot/include/sys/ttydefaults.h
index 742e3a9..e4994fe 100644
--- a/arch/arm64/sysroot/include/sys/ttydefaults.h
+++ b/arch/arm64/sysroot/include/sys/ttydefaults.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TTYDEFAULTS_H_
+#define SYSROOT_SYS_TTYDEFAULTS_H_
 
 #define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
 #define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
@@ -34,3 +35,5 @@
 #define CBRK CEOL
 #define CRPRNT CREPRINT
 #define CFLUSH CDISCARD
+
+#endif  // SYSROOT_SYS_TTYDEFAULTS_H_
diff --git a/arch/arm64/sysroot/include/sys/types.h b/arch/arm64/sysroot/include/sys/types.h
index b1c2a27..ea195a0 100644
--- a/arch/arm64/sysroot/include/sys/types.h
+++ b/arch/arm64/sysroot/include/sys/types.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TYPES_H_
+#define SYSROOT_SYS_TYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -71,3 +72,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TYPES_H_
diff --git a/arch/arm64/sysroot/include/sys/uio.h b/arch/arm64/sysroot/include/sys/uio.h
index e9f7b5d..4762083 100644
--- a/arch/arm64/sysroot/include/sys/uio.h
+++ b/arch/arm64/sysroot/include/sys/uio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_UIO_H_
+#define SYSROOT_SYS_UIO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UIO_H_
diff --git a/arch/arm64/sysroot/include/sys/un.h b/arch/arm64/sysroot/include/sys/un.h
index 52bebd4..425c801 100644
--- a/arch/arm64/sysroot/include/sys/un.h
+++ b/arch/arm64/sysroot/include/sys/un.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_UN_H_
+#define SYSROOT_SYS_UN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,8 +15,8 @@
 #include <bits/alltypes.h>
 
 struct sockaddr_un {
-    sa_family_t sun_family;
-    char sun_path[108];
+  sa_family_t sun_family;
+  char sun_path[108];
 };
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -26,3 +27,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UN_H_
diff --git a/arch/arm64/sysroot/include/sys/utsname.h b/arch/arm64/sysroot/include/sys/utsname.h
index 0333c82..5d5fee1 100644
--- a/arch/arm64/sysroot/include/sys/utsname.h
+++ b/arch/arm64/sysroot/include/sys/utsname.h
@@ -1,21 +1,23 @@
-#pragma once
+#ifndef SYSROOT_SYS_UTSNAME_H_
+#define SYSROOT_SYS_UTSNAME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+#include <limits.h>
 
 struct utsname {
-    char sysname[65];
-    char nodename[65];
-    char release[65];
-    char version[65];
-    char machine[65];
+  char sysname[65];
+  char nodename[HOST_NAME_MAX + 1];
+  char release[65];
+  char version[65];
+  char machine[65];
 #ifdef _GNU_SOURCE
-    char domainname[65];
+  char domainname[65];
 #else
-    char __domainname[65];
+  char __domainname[65];
 #endif
 };
 
@@ -24,3 +26,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UTSNAME_H_
diff --git a/arch/arm64/sysroot/include/sys/wait.h b/arch/arm64/sysroot/include/sys/wait.h
index f31bb8e..3b33520 100644
--- a/arch/arm64/sysroot/include/sys/wait.h
+++ b/arch/arm64/sysroot/include/sys/wait.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_WAIT_H_
+#define SYSROOT_SYS_WAIT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,9 +11,7 @@
 #define __NEED_id_t
 #include <bits/alltypes.h>
 
-typedef enum { P_ALL = 0,
-               P_PID = 1,
-               P_PGID = 2 } idtype_t;
+typedef enum { P_ALL = 0, P_PID = 1, P_PGID = 2 } idtype_t;
 
 pid_t wait(int*);
 pid_t waitpid(pid_t, int*, int);
@@ -43,3 +42,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_WAIT_H_
diff --git a/arch/arm64/sysroot/include/sysexits.h b/arch/arm64/sysroot/include/sysexits.h
index 82f672a..ca2782d 100644
--- a/arch/arm64/sysroot/include/sysexits.h
+++ b/arch/arm64/sysroot/include/sysexits.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYSEXITS_H_
+#define SYSROOT_SYSEXITS_H_
 
 #define EX_OK 0
 #define EX__BASE 64
@@ -18,3 +19,5 @@
 #define EX_NOPERM 77
 #define EX_CONFIG 78
 #define EX__MAX 78
+
+#endif  // SYSROOT_SYSEXITS_H_
diff --git a/arch/arm64/sysroot/include/syslog.h b/arch/arm64/sysroot/include/syslog.h
index 76fdce7..dcb09e3 100644
--- a/arch/arm64/sysroot/include/syslog.h
+++ b/arch/arm64/sysroot/include/syslog.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYSLOG_H_
+#define SYSROOT_SYSLOG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -69,50 +70,52 @@
 #define INTERNAL_NOPRI 0x10
 #define INTERNAL_MARK (LOG_NFACILITIES << 3)
 typedef struct {
-    char* c_name;
-    int c_val;
+  char* c_name;
+  int c_val;
 } CODE;
-#define prioritynames                                \
-    ((CODE*)(const CODE[]){{"alert", LOG_ALERT},     \
-                           {"crit", LOG_CRIT},       \
-                           {"debug", LOG_DEBUG},     \
-                           {"emerg", LOG_EMERG},     \
-                           {"err", LOG_ERR},         \
-                           {"error", LOG_ERR},       \
-                           {"info", LOG_INFO},       \
-                           {"none", INTERNAL_NOPRI}, \
-                           {"notice", LOG_NOTICE},   \
-                           {"panic", LOG_EMERG},     \
-                           {"warn", LOG_WARNING},    \
-                           {"warning", LOG_WARNING}, \
-                           {0, -1}})
-#define facilitynames                                  \
-    ((CODE*)(const CODE[]){{"auth", LOG_AUTH},         \
-                           {"authpriv", LOG_AUTHPRIV}, \
-                           {"cron", LOG_CRON},         \
-                           {"daemon", LOG_DAEMON},     \
-                           {"ftp", LOG_FTP},           \
-                           {"kern", LOG_KERN},         \
-                           {"lpr", LOG_LPR},           \
-                           {"mail", LOG_MAIL},         \
-                           {"mark", INTERNAL_MARK},    \
-                           {"news", LOG_NEWS},         \
-                           {"security", LOG_AUTH},     \
-                           {"syslog", LOG_SYSLOG},     \
-                           {"user", LOG_USER},         \
-                           {"uucp", LOG_UUCP},         \
-                           {"local0", LOG_LOCAL0},     \
-                           {"local1", LOG_LOCAL1},     \
-                           {"local2", LOG_LOCAL2},     \
-                           {"local3", LOG_LOCAL3},     \
-                           {"local4", LOG_LOCAL4},     \
-                           {"local5", LOG_LOCAL5},     \
-                           {"local6", LOG_LOCAL6},     \
-                           {"local7", LOG_LOCAL7},     \
-                           {0, -1}})
+#define prioritynames                              \
+  ((CODE*)(const CODE[]){{"alert", LOG_ALERT},     \
+                         {"crit", LOG_CRIT},       \
+                         {"debug", LOG_DEBUG},     \
+                         {"emerg", LOG_EMERG},     \
+                         {"err", LOG_ERR},         \
+                         {"error", LOG_ERR},       \
+                         {"info", LOG_INFO},       \
+                         {"none", INTERNAL_NOPRI}, \
+                         {"notice", LOG_NOTICE},   \
+                         {"panic", LOG_EMERG},     \
+                         {"warn", LOG_WARNING},    \
+                         {"warning", LOG_WARNING}, \
+                         {0, -1}})
+#define facilitynames                                \
+  ((CODE*)(const CODE[]){{"auth", LOG_AUTH},         \
+                         {"authpriv", LOG_AUTHPRIV}, \
+                         {"cron", LOG_CRON},         \
+                         {"daemon", LOG_DAEMON},     \
+                         {"ftp", LOG_FTP},           \
+                         {"kern", LOG_KERN},         \
+                         {"lpr", LOG_LPR},           \
+                         {"mail", LOG_MAIL},         \
+                         {"mark", INTERNAL_MARK},    \
+                         {"news", LOG_NEWS},         \
+                         {"security", LOG_AUTH},     \
+                         {"syslog", LOG_SYSLOG},     \
+                         {"user", LOG_USER},         \
+                         {"uucp", LOG_UUCP},         \
+                         {"local0", LOG_LOCAL0},     \
+                         {"local1", LOG_LOCAL1},     \
+                         {"local2", LOG_LOCAL2},     \
+                         {"local3", LOG_LOCAL3},     \
+                         {"local4", LOG_LOCAL4},     \
+                         {"local5", LOG_LOCAL5},     \
+                         {"local6", LOG_LOCAL6},     \
+                         {"local7", LOG_LOCAL7},     \
+                         {0, -1}})
 #endif
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYSLOG_H_
diff --git a/arch/arm64/sysroot/include/tar.h b/arch/arm64/sysroot/include/tar.h
index 7703c2b..2dcb983 100644
--- a/arch/arm64/sysroot/include/tar.h
+++ b/arch/arm64/sysroot/include/tar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_TAR_H_
+#define SYSROOT_TAR_H_
 
 #define TSUID 04000
 #define TSGID 02000
@@ -28,3 +29,5 @@
 
 #define TVERSION "00"
 #define TVERSLEN 2
+
+#endif  // SYSROOT_TAR_H_
diff --git a/arch/arm64/sysroot/include/termios.h b/arch/arm64/sysroot/include/termios.h
index 65c9d66..4ccfe13 100644
--- a/arch/arm64/sysroot/include/termios.h
+++ b/arch/arm64/sysroot/include/termios.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_TERMIOS_H_
+#define SYSROOT_TERMIOS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -41,3 +42,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_TERMIOS_H_
diff --git a/arch/arm64/sysroot/include/threads.h b/arch/arm64/sysroot/include/threads.h
index 8711302..480a6f7 100644
--- a/arch/arm64/sysroot/include/threads.h
+++ b/arch/arm64/sysroot/include/threads.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_THREADS_H_
+#define SYSROOT_THREADS_H_
 
 #include <features.h>
 #include <time.h>
@@ -24,26 +25,26 @@
 #define TSS_DTOR_ITERATIONS 4
 
 enum {
-    thrd_success = 0,
-    thrd_busy = 1,
-    thrd_error = 2,
-    thrd_nomem = 3,
-    thrd_timedout = 4,
+  thrd_success = 0,
+  thrd_busy = 1,
+  thrd_error = 2,
+  thrd_nomem = 3,
+  thrd_timedout = 4,
 };
 
 // These are bitfield values; initialize with e.g. (mtx_plain|mtx_timed).
 // mtx_recursive is not implemented.
 enum {
-    mtx_plain = 0,
-    mtx_recursive = 1,
-    mtx_timed = 2,
+  mtx_plain = 0,
+  mtx_recursive = 1,
+  mtx_timed = 2,
 };
 
 #ifdef _ALL_SOURCE
 #define MTX_INIT \
-    {}
+  {}
 #define CND_INIT \
-    {}
+  {}
 #endif
 
 #define ONCE_FLAG_INIT 0
@@ -76,14 +77,14 @@
 #ifdef __clang__
     __attribute__((__acquire_capability__(__m)))
 #endif
-;
+    ;
 int mtx_timedlock(mtx_t* __restrict, const struct timespec* __restrict);
 int mtx_trylock(mtx_t*);
 int mtx_unlock(mtx_t* __m)
 #ifdef __clang__
     __attribute__((__release_capability__(__m)))
 #endif
-;
+    ;
 
 int cnd_init(cnd_t*);
 void cnd_destroy(cnd_t*);
@@ -103,3 +104,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_THREADS_H_
diff --git a/arch/arm64/sysroot/include/time.h b/arch/arm64/sysroot/include/time.h
index c20b7db..b81da45 100644
--- a/arch/arm64/sysroot/include/time.h
+++ b/arch/arm64/sysroot/include/time.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_TIME_H_
+#define SYSROOT_TIME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -27,17 +29,17 @@
 #endif
 
 struct tm {
-    int tm_sec;
-    int tm_min;
-    int tm_hour;
-    int tm_mday;
-    int tm_mon;
-    int tm_year;
-    int tm_wday;
-    int tm_yday;
-    int tm_isdst;
-    long __tm_gmtoff;
-    const char* __tm_zone;
+  int tm_sec;
+  int tm_min;
+  int tm_hour;
+  int tm_mday;
+  int tm_mon;
+  int tm_year;
+  int tm_wday;
+  int tm_yday;
+  int tm_isdst;
+  long __tm_gmtoff;
+  const char* __tm_zone;
 };
 
 clock_t clock(void);
@@ -66,8 +68,8 @@
 void tzset(void);
 
 struct itimerspec {
-    struct timespec it_interval;
-    struct timespec it_value;
+  struct timespec it_interval;
+  struct timespec it_value;
 };
 
 #define CLOCK_REALTIME 0
@@ -118,3 +120,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_TIME_H_
diff --git a/arch/arm64/sysroot/include/uchar.h b/arch/arm64/sysroot/include/uchar.h
index 73e5e5a..79cda7c 100644
--- a/arch/arm64/sysroot/include/uchar.h
+++ b/arch/arm64/sysroot/include/uchar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_UCHAR_H_
+#define SYSROOT_UCHAR_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,9 +11,10 @@
 #define __NEED_mbstate_t
 #define __NEED_size_t
 
-#include <bits/alltypes.h>
 #include <features.h>
 
+#include <bits/alltypes.h>
+
 size_t c16rtomb(char* __restrict, char16_t, mbstate_t* __restrict);
 size_t mbrtoc16(char16_t* __restrict, const char* __restrict, size_t, mbstate_t* __restrict);
 
@@ -22,3 +24,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UCHAR_H_
diff --git a/arch/arm64/sysroot/include/ucontext.h b/arch/arm64/sysroot/include/ucontext.h
index 930bb71..ccd910f 100644
--- a/arch/arm64/sysroot/include/ucontext.h
+++ b/arch/arm64/sysroot/include/ucontext.h
@@ -1,11 +1,11 @@
-#pragma once
+#ifndef SYSROOT_UCONTEXT_H_
+#define SYSROOT_UCONTEXT_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <signal.h>
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -22,3 +22,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UCONTEXT_H_
diff --git a/arch/arm64/sysroot/include/unistd.h b/arch/arm64/sysroot/include/unistd.h
index 4f91876..e400030 100644
--- a/arch/arm64/sysroot/include/unistd.h
+++ b/arch/arm64/sysroot/include/unistd.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_UNISTD_H_
+#define SYSROOT_UNISTD_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define STDIN_FILENO 0
@@ -134,8 +136,6 @@
 void sync(void);
 int syncfs(int);
 pid_t setpgrp(void);
-char* crypt(const char*, const char*);
-void encrypt(char*, int);
 void swab(const void* __restrict, void* __restrict, ssize_t);
 #endif
 
@@ -432,3 +432,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UNISTD_H_
diff --git a/arch/arm64/sysroot/include/utime.h b/arch/arm64/sysroot/include/utime.h
index 25e0ff7..b4368aa 100644
--- a/arch/arm64/sysroot/include/utime.h
+++ b/arch/arm64/sysroot/include/utime.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_UTIME_H_
+#define SYSROOT_UTIME_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,8 +10,8 @@
 #include <bits/alltypes.h>
 
 struct utimbuf {
-    time_t actime;
-    time_t modtime;
+  time_t actime;
+  time_t modtime;
 };
 
 int utime(const char*, const struct utimbuf*);
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UTIME_H_
diff --git a/arch/arm64/sysroot/include/values.h b/arch/arm64/sysroot/include/values.h
index a139dca..0862584 100644
--- a/arch/arm64/sysroot/include/values.h
+++ b/arch/arm64/sysroot/include/values.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_VALUES_H_
+#define SYSROOT_VALUES_H_
 
 #include <limits.h>
 
@@ -34,3 +35,5 @@
 #define FMAXEXP FLT_MAX_EXP
 
 #define BITSPERBYTE CHAR_BIT
+
+#endif  // SYSROOT_VALUES_H_
diff --git a/arch/arm64/sysroot/include/wchar.h b/arch/arm64/sysroot/include/wchar.h
index 5578085..aaa7e9e 100644
--- a/arch/arm64/sysroot/include/wchar.h
+++ b/arch/arm64/sysroot/include/wchar.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_WCHAR_H_
+#define SYSROOT_WCHAR_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_FILE
@@ -32,13 +34,13 @@
 #ifndef WCHAR_MIN
 #if defined(__WCHAR_MIN__)
 #define WCHAR_MIN __WCHAR_MIN__
-#else // defined(__WCHAR_MIN__)
+#else  // defined(__WCHAR_MIN__)
 #if defined(__WCHAR_UNSIGNED__)
 #define WCHAR_MIN (L'\0' + 0)
 #else
 #define WCHAR_MIN (-WCHAR_MAX - 1)
-#endif // defined (__WCHAR_UNSIGNED)
-#endif // defined(__WCHAR_MIN__)
+#endif  // defined (__WCHAR_UNSIGNED)
+#endif  // defined(__WCHAR_MIN__)
 #endif
 
 #undef WEOF
@@ -179,3 +181,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WCHAR_H_
diff --git a/arch/arm64/sysroot/include/wctype.h b/arch/arm64/sysroot/include/wctype.h
index 8c86840..5a04bb8 100644
--- a/arch/arm64/sysroot/include/wctype.h
+++ b/arch/arm64/sysroot/include/wctype.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_WCTYPE_H_
+#define SYSROOT_WCTYPE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -55,3 +56,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WCTYPE_H_
diff --git a/arch/arm64/sysroot/include/wordexp.h b/arch/arm64/sysroot/include/wordexp.h
index 26f8646..dd6caa0 100644
--- a/arch/arm64/sysroot/include/wordexp.h
+++ b/arch/arm64/sysroot/include/wordexp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_WORDEXP_H_
+#define SYSROOT_WORDEXP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,9 +19,9 @@
 #define WRDE_UNDEF 32
 
 typedef struct {
-    size_t we_wordc;
-    char** we_wordv;
-    size_t we_offs;
+  size_t we_wordc;
+  char** we_wordv;
+  size_t we_offs;
 } wordexp_t;
 
 #define WRDE_NOSYS -1
@@ -36,3 +37,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WORDEXP_H_
diff --git a/arch/arm64/sysroot/include/zircon/assert.h b/arch/arm64/sysroot/include/zircon/assert.h
index 6175321..d53115d 100644
--- a/arch/arm64/sysroot/include/zircon/assert.h
+++ b/arch/arm64/sysroot/include/zircon/assert.h
@@ -2,8 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_ASSERT_
-#define ZIRCON_ASSERT_
+#ifndef SYSROOT_ZIRCON_ASSERT_
+#define SYSROOT_ZIRCON_ASSERT_
+
+// For a description of which asserts are enabled at which debug levels, see the documentation for
+// GN build argument |assert_level|.
 
 #ifdef _KERNEL
 #include <assert.h>
@@ -16,61 +19,69 @@
 #define ZX_DEBUG_ASSERT_MSG_COND(args...) DEBUG_ASSERT_MSG_COND(args)
 #define ZX_DEBUG_ASSERT_IMPLEMENTED DEBUG_ASSERT_IMPLEMENTED
 
-#ifdef ZX_DEBUGLEVEL
-#undef ZX_DEBUGLEVEL
-#endif
-#define ZX_DEBUGLEVEL LK_DEBUGLEVEL
-
-#else // #ifdef _KERNEL
-
-#include <stdio.h>  // for printf
-#include <stdlib.h> // for abort
+#else  // #ifdef _KERNEL
 
 #include <zircon/compiler.h>
 
-#define ZX_PANIC(fmt, ...)          \
-    do {                            \
-        printf(fmt, ##__VA_ARGS__); \
-        abort();                    \
-    } while (0)
+__BEGIN_CDECLS
+void __zx_panic(const char* format, ...) __NO_RETURN __PRINTFLIKE(1, 2);
+__END_CDECLS
 
-#define ZX_ASSERT(x)                                                            \
-    do {                                                                        \
-        if (unlikely(!(x))) {                                                   \
-            ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
-        }                                                                       \
-    } while (0)
+#define ZX_PANIC(fmt, ...) __zx_panic((fmt), ##__VA_ARGS__)
 
-#define ZX_ASSERT_MSG(x, msg, msgargs...)                       \
-    do {                                                        \
-        if (unlikely(!(x))) {                                   \
-            ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n" msg "\n", \
-                     __FILE__, __LINE__, #x, ##msgargs);        \
-        }                                                       \
-    } while (0)
+// Assert that |x| is true, else panic.
+//
+// ZX_ASSERT is always enabled and |x| will be evaluated regardless of any build arguments.
+#define ZX_ASSERT(x)                                                      \
+  do {                                                                    \
+    if (unlikely(!(x))) {                                                 \
+      ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
+    }                                                                     \
+  } while (0)
 
-// conditionally implement DEBUG_ASSERT based on ZX_DEBUGLEVEL in kernel space
-// user space does not currently implement DEBUG_ASSERT
-#ifdef ZX_DEBUGLEVEL
-#define ZX_DEBUG_ASSERT_IMPLEMENTED (ZX_DEBUGLEVEL > 1)
+// Assert that |x| is true, else panic with the given message.
+//
+// ZX_ASSERT_MSG is always enabled and |x| will be evaluated regardless of any build arguments.
+#define ZX_ASSERT_MSG(x, msg, msgargs...)                                                     \
+  do {                                                                                        \
+    if (unlikely(!(x))) {                                                                     \
+      ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n" msg "\n", __FILE__, __LINE__, #x, ##msgargs); \
+    }                                                                                         \
+  } while (0)
+
+// Conditionally implement ZX_DEBUG_ASSERT based on ZX_ASSERT_LEVEL.
+#ifdef ZX_ASSERT_LEVEL
+
+// ZX_DEBUG_ASSERT_IMPLEMENTED is intended to be used to conditionalize code that is logically part
+// of a debug assert. It's useful for performing complex consistency checks that are difficult to
+// work into a ZX_DEBUG_ASSERT statement.
+#define ZX_DEBUG_ASSERT_IMPLEMENTED (ZX_ASSERT_LEVEL > 1)
 #else
 #define ZX_DEBUG_ASSERT_IMPLEMENTED 0
 #endif
 
-#define ZX_DEBUG_ASSERT(x)                                                            \
-    do {                                                                              \
-        if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                          \
-            ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
-        }                                                                             \
-    } while (0)
+// Assert that |x| is true, else panic.
+//
+// Depending on build arguments, ZX_DEBUG_ASSERT may or may not be enabled. When disabled, |x| will
+// not be evaluated.
+#define ZX_DEBUG_ASSERT(x)                                                      \
+  do {                                                                          \
+    if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                        \
+      ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
+    }                                                                           \
+  } while (0)
 
-#define ZX_DEBUG_ASSERT_MSG(x, msg, msgargs...)                       \
-    do {                                                              \
-        if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {          \
-            ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n" msg "\n", \
-                     __FILE__, __LINE__, #x, ##msgargs);              \
-        }                                                             \
-    } while (0)
+// Assert that |x| is true, else panic with the given message.
+//
+// Depending on build arguments, ZX_DEBUG_ASSERT_MSG may or may not be enabled. When disabled, |x|
+// will not be evaluated.
+#define ZX_DEBUG_ASSERT_MSG(x, msg, msgargs...)                                         \
+  do {                                                                                  \
+    if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                                \
+      ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n" msg "\n", __FILE__, __LINE__, #x, \
+               ##msgargs);                                                              \
+    }                                                                                   \
+  } while (0)
 
 // implement _COND versions of ZX_DEBUG_ASSERT which only emit the body if
 // ZX_DEBUG_ASSERT_IMPLEMENTED is set
@@ -78,9 +89,13 @@
 #define ZX_DEBUG_ASSERT_COND(x) ZX_DEBUG_ASSERT(x)
 #define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) ZX_DEBUG_ASSERT_MSG(x, msg, msgargs)
 #else
-#define ZX_DEBUG_ASSERT_COND(x) do { } while (0)
-#define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) do { } while (0)
+#define ZX_DEBUG_ASSERT_COND(x) \
+  do {                          \
+  } while (0)
+#define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) \
+  do {                                               \
+  } while (0)
 #endif
-#endif // #ifdef _KERNEL
+#endif  // #ifdef _KERNEL
 
-#endif // ZIRCON_ASSERT_
+#endif  // SYSROOT_ZIRCON_ASSERT_
diff --git a/arch/arm64/sysroot/include/zircon/boot/bootdata.h b/arch/arm64/sysroot/include/zircon/boot/bootdata.h
deleted file mode 100644
index d49b9b1..0000000
--- a/arch/arm64/sysroot/include/zircon/boot/bootdata.h
+++ /dev/null
@@ -1,317 +0,0 @@
-// 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.
-
-#pragma once
-
-#ifndef __ASSEMBLER__
-#include <zircon/compiler.h>
-#include <stdbool.h>
-#include <stdint.h>
-#endif
-
-// lsw of sha256("bootdata")
-#define BOOTDATA_MAGIC (0x868cf7e6)
-
-// lsw of sha256("bootitem")
-#define BOOTITEM_MAGIC (0xb5781729)
-
-// Round n up to the next 8 byte boundary
-#define BOOTDATA_ALIGN(n) (((n) + 7) & (~7))
-
-#define BOOTITEM_NO_CRC32 (0x4a87e8d6)
-
-// This flag is required.
-#define BOOTDATA_FLAG_V2         (0x00010000)
-
-// Bootdata items with the CRC32 flag must have a valid crc32.
-// Otherwise their crc32 field must contain BOOTITEM_NO_CRC32
-#define BOOTDATA_FLAG_CRC32      (0x00020000)
-
-// Bootdata types that have least significant byte set to 'm'
-// are reserved for driver metadata
-#define BOOTDATA_KIND_METADATA   (0x0000006D)
-#define BOOTDATA_KIND_MASK       (0x000000FF)
-
-// Containers are used to wrap a set of bootdata items
-// written to a file or partition.  The "length" is the
-// length of the set of following bootdata items.  The
-// "extra" is the value BOOTDATA_MAGIC and "flags" is
-// set to 0.
-#define BOOTDATA_CONTAINER        (0x544f4f42) // BOOT
-
-// BOOTFS images.  The "extra" field is the decompressed
-// size of the image, if compressed, otherwise the same
-// as the "length" field.
-#define BOOTDATA_BOOTFS_BOOT      (0x42534642) // BFSB
-#define BOOTDATA_BOOTFS_SYSTEM    (0x53534642) // BFSS
-#define BOOTDATA_BOOTFS_DISCARD   (0x58534642) // BFSX
-
-#define BOOTDATA_BOOTFS_MASK      (0x00FFFFFF)
-#define BOOTDATA_BOOTFS_TYPE      (0x00534642) // BFS\0
-
-// Virtual disk images.  The header fields and compression protocol
-// are the same as for the BOOTFS types, but the payload before
-// compression is a raw disk image rather than BOOTFS format.
-#define BOOTDATA_RAMDISK          (0x4b534452) // RDSK
-
-// A Zircon Kernel Image
-// Content: bootdata_kernel_t
-#define BOOTDATA_KERNEL           (0x4c4e524b) // KRNL
-
-// A Zircon Partition Map
-// Content: bootdata_partition_map_t
-// The bootdata_t.extra field is used as a board specific index
-// to specify which device the partition map applies to.
-#define BOOTDATA_PARTITION_MAP    (0x5452506D) // mPRT
-
-// MAC Address for Ethernet, Wifi, Bluetooth, etc.
-// Content: uint8_t[] (variable length based on type of MAC address)
-// The bootdata_t.extra field is used as a board specific index
-// to specify which device the MAC address applies to.
-#define BOOTDATA_MAC_ADDRESS      (0x43414D6D) // mMAC
-
-// Flag indicating that the bootfs is compressed.
-#define BOOTDATA_BOOTFS_FLAG_COMPRESSED  (1 << 0)
-
-
-// These items are for passing from bootloader to kernel
-
-// Kernel Command Line String
-// Content: uint8_t[]
-#define BOOTDATA_CMDLINE          (0x4c444d43) // CMDL
-
-// ACPI Root Table Pointer
-// Content: uint64_t phys addr
-#define BOOTDATA_ACPI_RSDP        (0x50445352) // RSDP
-
-// SMBIOS entry point pointer
-// Content: uint64_t phys addr
-#define BOOTDATA_SMBIOS           (0x49424d53) // SMBI
-
-// Framebuffer Parameters
-// Content: bootdata_swfb_t
-#define BOOTDATA_FRAMEBUFFER      (0x42465753) // SWFB
-
-// Debug Serial Port
-// Content: bootdata_uart_t
-#define BOOTDATA_DEBUG_UART       (0x54524155) // UART
-
-// Platform ID Information
-// Content: bootdata_platform_id_t
-#define BOOTDATA_PLATFORM_ID      (0x44494C50) // PLID
-
-// Memory which will persist across warm boots
-// Content bootdata_lastlog_nvram_t
-#define BOOTDATA_LASTLOG_NVRAM    (0x4c4c564e) // NVLL
-
-// This reflects a typo we need to support for a while
-#define BOOTDATA_LASTLOG_NVRAM2   (0x4c4c5643) // CVLL
-
-// E820 Memory Table
-// Content: e820entry[]
-#define BOOTDATA_E820_TABLE       (0x30323845) // E820
-
-// EFI Memory Map
-// Content: a uint64_t entrysz followed by a set of
-// efi_memory_descriptor aligned on entrysz
-#define BOOTDATA_EFI_MEMORY_MAP   (0x4d494645) // EFIM
-
-// EFI System Table
-// Content: a uint64_t physical address of the table
-#define BOOTDATA_EFI_SYSTEM_TABLE (0x53494645) // EFIS
-
-// Last crashlog
-// Content: ascii/utf8 log data from previous boot
-#define BOOTDATA_LAST_CRASHLOG    (0x4d4f4f42) // BOOM
-
-// CPU configuration
-// Content: bootdata_cpu_config_t
-#define BOOTDATA_CPU_CONFIG       (0x43555043) // CPUC
-
-// Memory configuration
-// Content: one or more of bootdata_mem_range_t (count determined by bootdata_t length)
-#define BOOTDATA_MEM_CONFIG       (0x434D454D) // MEMC
-
-// Kernel driver configuration
-// Content: driver specific struct, with type determined by bootdata "extra" field
-#define BOOTDATA_KERNEL_DRIVER    (0x5652444B) // KDRV
-
-#define BOOTDATA_IGNORE           (0x50494b53) // SKIP
-
-#ifndef __ASSEMBLER__
-__BEGIN_CDECLS;
-
-// BootData header, describing the type and size of data
-// used to initialize the system. All fields are little-endian.
-//
-// BootData headers in a stream must be 8-byte-aligned.
-//
-// The length field specifies the actual payload length
-// and does not include the size of padding.
-typedef struct {
-    // Boot data type
-    uint32_t type;
-
-    // Size of the payload following this header
-    uint32_t length;
-
-    // type-specific extra data
-    // For CONTAINER this is MAGIC.
-    // For BOOTFS this is the decompressed size.
-    uint32_t extra;
-
-    // Flags for the boot data. See flag descriptions for each type.
-    uint32_t flags;
-
-    // For future expansion.  Set to 0.
-    uint32_t reserved0;
-    uint32_t reserved1;
-
-    // Must be BOOTITEM_MAGIC
-    uint32_t magic;
-
-    // Must be the CRC32 of payload if FLAG_CRC32 is set,
-    // otherwise must be BOOTITEM_NO_CRC32
-    uint32_t crc32;
-} bootdata_t;
-
-typedef struct {
-    uint64_t base; // physical base addr
-    uint32_t width;
-    uint32_t height;
-    uint32_t stride;
-    uint32_t format;
-} bootdata_swfb_t;
-
-typedef struct {
-    uint64_t entry64;
-    uint64_t reserved;
-} bootdata_kernel_t;
-
-#define BOOTDATA_PART_NAME_LEN 32
-#define BOOTDATA_PART_GUID_LEN 16
-
-typedef struct {
-    uint8_t type_guid[BOOTDATA_PART_GUID_LEN];
-    uint8_t uniq_guid[BOOTDATA_PART_GUID_LEN];
-    uint64_t first_block;
-    uint64_t last_block;
-    uint64_t flags;
-    char name[BOOTDATA_PART_NAME_LEN];
-} bootdata_partition_t;
-
-typedef struct {
-    uint64_t block_count;
-    uint64_t block_size;
-    uint32_t partition_count;
-    uint32_t reserved;
-    char guid[BOOTDATA_PART_GUID_LEN];
-    bootdata_partition_t partitions[];
-} bootdata_partition_map_t;
-
-typedef struct {
-    uint64_t base;
-    uint64_t length;
-} bootdata_nvram_t;
-
-#define BOOTDATA_UART_NONE 0
-#define BOOTDATA_UART_PC_PORT 1
-#define BOOTDATA_UART_PC_MMIO 2
-typedef struct {
-    uint64_t base;
-    uint32_t type;
-    uint32_t irq;
-} bootdata_uart_t;
-
-typedef struct {
-    uint32_t vid;
-    uint32_t pid;
-    char board_name[32];
-} bootdata_platform_id_t;
-
-typedef struct {
-    uint32_t cpu_count;     // number of CPU cores in the cluster
-    uint32_t type;          // for future use
-    uint32_t flags;         // for future use
-    uint32_t reserved;
-} bootdata_cpu_cluster_t;
-
-typedef struct {
-    uint32_t cluster_count;
-    uint32_t reserved[3];
-    bootdata_cpu_cluster_t clusters[];
-} bootdata_cpu_config_t;
-
-#define BOOTDATA_MEM_RANGE_RAM          1
-#define BOOTDATA_MEM_RANGE_PERIPHERAL   2
-#define BOOTDATA_MEM_RANGE_RESERVED     3
-typedef struct {
-    uint64_t    paddr;
-    uint64_t    length;
-    uint32_t    type;
-    uint32_t    reserved;
-} bootdata_mem_range_t;
-
-/* EFI Variable for Crash Log */
-#define ZIRCON_VENDOR_GUID \
-    {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}}
-#define ZIRCON_CRASHLOG_EFIVAR \
-    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 };
-#define ZIRCON_CRASHLOG_EFIATTR \
-    (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
-
-__END_CDECLS;
-
-
-// BOOTFS is a trivial "filesystem" format
-//
-// It consists of a bootfs_header_t
-//
-// Followed by a series of bootfs_entry_t's of:
-//   name length (32bit le)
-//   data size   (32bit le)
-//   data offset (32bit le)
-//   namedata   (namelength bytes, includes \0)
-//
-// - data offsets must be page aligned (multiple of 4096)
-// - entries start on uint32 boundaries
-
-//lsw of sha256("bootfs")
-#define BOOTFS_MAGIC (0xa56d3ff9)
-
-#define BOOTFS_PAGE_SIZE (4096)
-#define BOOTFS_PAGE_ALIGN(size) \
-    (((size) + BOOTFS_PAGE_SIZE - 1) & -BOOTFS_PAGE_SIZE)
-
-#define BOOTFS_MAX_NAME_LEN 256
-
-typedef struct bootfs_header {
-    // magic value BOOTFS_MAGIC
-    uint32_t magic;
-
-    // total size of all bootfs_entry_t's
-    // does not include the size of the bootfs_header_t
-    uint32_t dirsize;
-
-    // 0, 0
-    uint32_t reserved0;
-    uint32_t reserved1;
-} bootfs_header_t;
-
-typedef struct bootfs_entry {
-    uint32_t name_len;
-    uint32_t data_len;
-    uint32_t data_off;
-    char name[];
-} bootfs_entry_t;
-
-#define BOOTFS_ALIGN(nlen) (((nlen) + 3) & (~3))
-#define BOOTFS_RECSIZE(entry) \
-    (sizeof(bootfs_entry_t) + BOOTFS_ALIGN(entry->name_len))
-
-static inline bool bootdata_is_metadata(uint32_t type) {
-    return ((type & BOOTDATA_KIND_MASK) == BOOTDATA_KIND_METADATA);
-}
-
-#endif
diff --git a/arch/arm64/sysroot/include/zircon/boot/bootfs.h b/arch/arm64/sysroot/include/zircon/boot/bootfs.h
new file mode 100644
index 0000000..8cc2644
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/boot/bootfs.h
@@ -0,0 +1,66 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_BOOT_BOOTFS_H_
+#define SYSROOT_ZIRCON_BOOT_BOOTFS_H_
+
+#include <stdint.h>
+
+// The payload (after decompression) of an item in BOOTFS format consists
+// of separate "file" images that are each aligned to ZBI_BOOTFS_PAGE_SIZE
+// bytes from the beginning of the item payload.  The first "file" consists
+// of a zbi_bootfs_header_t followed by directory entries.
+#define ZBI_BOOTFS_PAGE_SIZE (4096u)
+
+#define ZBI_BOOTFS_PAGE_ALIGN(size) \
+  (((size) + ZBI_BOOTFS_PAGE_SIZE - 1) & ~(ZBI_BOOTFS_PAGE_SIZE - 1))
+
+typedef struct {
+  // Must be ZBI_BOOTFS_MAGIC.
+  uint32_t magic;
+
+  // Size in bytes of all the directory entries.
+  // Does not include the size of the zbi_bootfs_header_t.
+  uint32_t dirsize;
+
+  // Reserved for future use.  Set to 0.
+  uint32_t reserved0;
+  uint32_t reserved1;
+} zbi_bootfs_header_t;
+
+// LSW of sha256("bootfs")
+#define ZBI_BOOTFS_MAGIC (0xa56d3ff9)
+
+// Each directory entry holds a pathname and gives the offset and size
+// of the contents of the file by that name.
+typedef struct {
+  // Length of the name[] field at the end.  This length includes the
+  // NUL terminator, which must be present, but does not include any
+  // alignment padding required before the next directory entry.
+  uint32_t name_len;
+
+  // Length of the file in bytes.  This is an exact size that is not
+  // rounded, though the file is always padded with zeros up to a
+  // multiple of ZBI_BOOTFS_PAGE_SIZE.
+  uint32_t data_len;
+
+  // Offset from the beginning of the payload (zbi_bootfs_header_t) to
+  // the file's data.  This must be a multiple of ZBI_BOOTFS_PAGE_SIZE.
+  uint32_t data_off;
+
+  // Pathname of the file, a UTF-8 string.  This must include a NUL
+  // terminator at the end.  It must not begin with a '/', but it may
+  // contain '/' separators for subdirectories.
+  char name[];
+} zbi_bootfs_dirent_t;
+
+// Each directory entry has a variable size of [16,268] bytes that
+// must be a multiple of 4 bytes.
+#define ZBI_BOOTFS_DIRENT_SIZE(name_len) \
+  ((sizeof(zbi_bootfs_dirent_t) + (name_len) + 3) & -(size_t)4)
+
+// zbi_bootfs_dirent_t.name_len must be > 1 and <= ZBI_BOOTFS_MAX_NAME_LEN.
+#define ZBI_BOOTFS_MAX_NAME_LEN (256)
+
+#endif  // SYSROOT_ZIRCON_BOOT_BOOTFS_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/crash-reason.h b/arch/arm64/sysroot/include/zircon/boot/crash-reason.h
new file mode 100644
index 0000000..f626fac
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/boot/crash-reason.h
@@ -0,0 +1,59 @@
+// Copyright 2020 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.
+
+#ifndef SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
+#define SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
+
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+// 0 is reserved for "Invalid".  It will never be used by a functioning
+// crash-logger.
+#define ZIRCON_CRASH_REASON_INVALID ((uint32_t)0)
+
+// "Unknown" indicates that the system does not know the reason for a recent
+// crash.  The primary use of this reason is to be something which can be left
+// in the crashlog in case the system spontaneously reboots without a chance to
+// gracefully finalize the log, perhaps because of something like a hardware
+// watchdog timer.
+#define ZIRCON_CRASH_REASON_UNKNOWN ((uint32_t)1)
+
+// "No Crash" indicates that the system deliberately rebooted in an
+// orderly fashion.  No crash occurred.
+#define ZIRCON_CRASH_REASON_NO_CRASH ((uint32_t)2)
+
+// "OOM" indicates a crash triggered by the system because of an unrecoverable
+// out-of-memory situation.
+#define ZIRCON_CRASH_REASON_OOM ((uint32_t)3)
+
+// "Panic" indicates a crash triggered by the system because of an unrecoverable
+// kernel panic situation.
+#define ZIRCON_CRASH_REASON_PANIC ((uint32_t)4)
+
+// "Software watchdog" indicates a crash triggered by a kernel level software
+// watchdog construct.  Note that this is distinct from a hardware based WDT.
+// If the system reboots because of a hardware watchdog, it will have no chance
+// to record the reboot reason, and the crashlog will indicate "unknown".  The
+// HW reboot reason may be known, but only if the bootloader reports it to us.
+#define ZIRCON_CRASH_REASON_SOFTWARE_WATCHDOG ((uint32_t)5)
+
+#ifndef __ASSEMBLER__
+#if !__cplusplus
+typedef uint32_t zircon_crash_reason_t;
+#else   // !__cplusplus
+enum class ZirconCrashReason : uint32_t {
+  Invalid = ZIRCON_CRASH_REASON_INVALID,
+  Unknown = ZIRCON_CRASH_REASON_UNKNOWN,
+  NoCrash = ZIRCON_CRASH_REASON_NO_CRASH,
+  Oom = ZIRCON_CRASH_REASON_OOM,
+  Panic = ZIRCON_CRASH_REASON_PANIC,
+  SoftwareWatchdog = ZIRCON_CRASH_REASON_SOFTWARE_WATCHDOG,
+};
+
+// Using alias to maintain compatibility with APIs meant to be used by both C and C++.
+using zircon_crash_reason_t = ZirconCrashReason;
+#endif  // !__cplusplus
+#endif  // __ASSEMBLER__
+
+#endif  // SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/driver-config.h b/arch/arm64/sysroot/include/zircon/boot/driver-config.h
index 4913ae1..7f72fca 100644
--- a/arch/arm64/sysroot/include/zircon/boot/driver-config.h
+++ b/arch/arm64/sysroot/include/zircon/boot/driver-config.h
@@ -2,87 +2,162 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
+#define SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
 
-#include <zircon/compiler.h>
 #include <stdint.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
 
-// BOOTDATA_KERNEL_DRIVER bootdata types
-#define KDRV_ARM_PSCI           0x49435350  // 'PSCI'
-#define KDRV_ARM_GIC_V2         0x32434947  // 'GIC2'
-#define KDRV_ARM_GIC_V3         0x33434947  // 'GIC3'
-#define KDRV_ARM_GENERIC_TIMER  0x4D495441  // 'ATIM'
-#define KDRV_PL011_UART         0x55304C50  // 'PL0U'
-#define KDRV_AMLOGIC_UART       0x554C4D41  // 'AMLU'
-#define KDRV_NXP_IMX_UART       0x55584D49  // 'IMXU'
-#define KDRV_MT8167_UART        0x5538544D  // 'MT8U'
-#define KDRV_HISILICON_POWER    0x4F505348  // 'HSPO'
-#define KDRV_AMLOGIC_HDCP       0x484C4D41  // 'AMLH'
+// ZBI_TYPE_KERNEL_DRIVER item types (for zbi_header_t.extra)
+#define KDRV_ARM_PSCI 0x49435350                // 'PSCI'
+#define KDRV_ARM_GIC_V2 0x32434947              // 'GIC2'
+#define KDRV_ARM_GIC_V3 0x33434947              // 'GIC3'
+#define KDRV_ARM_GENERIC_TIMER 0x4D495441       // 'ATIM'
+#define KDRV_PL011_UART 0x55304C50              // 'PL0U'
+#define KDRV_AMLOGIC_UART 0x554C4D41            // 'AMLU'
+#define KDRV_NXP_IMX_UART 0x55584D49            // 'IMXU'
+#define KDRV_MT8167_UART 0x5538544D             // 'MT8U'
+#define KDRV_AMLOGIC_HDCP 0x484C4D41            // 'AMLH'
+#define KDRV_MSM_UART 0x554D534D                // 'MSMU'
+#define KDRV_MSM_POWER 1347244877               // 'MSMP'
+#define KDRV_DW8250_UART 0x44573855             // 'DW8U'
+#define KDRV_AS370_POWER 0x50303733             // '370P'
+#define KDRV_AMLOGIC_RNG 0x484C4D52             // 'AMLR'
+#define KDRV_GENERIC_32BIT_WATCHDOG 0x32334457  // 'WD32'
+#define KDRV_I8250_PIO_UART 0x30353238          // '8250'
+#define KDRV_I8250_MMIO_UART 0x4d353238         // '825M'
 
-// kernel driver struct that can be used for simple drivers
-// used by KDRV_PL011_UART, KDRV_AMLOGIC_UART and KDRV_NXP_IMX_UART
+// Kernel driver struct that can be used for simple drivers.
+// Used by KDRV_PL011_UART, KDRV_AMLOGIC_UART, KDRV_NXP_IMX_UART,
+// and KDRV_I8250_MMIO_UART.
 typedef struct {
-    uint64_t mmio_phys;
-    uint32_t irq;
+  uint64_t mmio_phys;
+  uint32_t irq;
 } dcfg_simple_t;
 
+// Used by KDRV_I8250_PIO_UART.
+typedef struct {
+  uint16_t base;
+  uint32_t irq;
+} dcfg_simple_pio_t;
+
 // for KDRV_MT8167_UART
 typedef struct {
-    uint64_t soc_mmio_phys;
-    uint64_t uart_mmio_phys;
-    uint32_t irq;
+  uint64_t soc_mmio_phys;
+  uint64_t uart_mmio_phys;
+  uint32_t irq;
 } dcfg_soc_uart_t;
 
 // for KDRV_ARM_PSCI
 typedef struct {
-    bool use_hvc;
-    uint64_t shutdown_args[3];
-    uint64_t reboot_args[3];
-    uint64_t reboot_bootloader_args[3];
-    uint64_t reboot_recovery_args[3];
+  bool use_hvc;
+  uint64_t shutdown_args[3];
+  uint64_t reboot_args[3];
+  uint64_t reboot_bootloader_args[3];
+  uint64_t reboot_recovery_args[3];
 } dcfg_arm_psci_driver_t;
 
+typedef struct {
+  uint64_t soc_imem_phys;
+  uint64_t soc_imem_offset;
+} dcfg_msm_power_driver_t;
+
 // for KDRV_ARM_GIC_V2
 typedef struct {
-    uint64_t mmio_phys;
-    uint64_t msi_frame_phys;
-    uint64_t gicd_offset;
-    uint64_t gicc_offset;
-    uint64_t gich_offset;
-    uint64_t gicv_offset;
-    uint32_t ipi_base;
-    bool optional;
-    bool use_msi;
+  uint64_t mmio_phys;
+  uint64_t msi_frame_phys;
+  uint64_t gicd_offset;
+  uint64_t gicc_offset;
+  uint64_t gich_offset;
+  uint64_t gicv_offset;
+  uint32_t ipi_base;
+  bool optional;
+  bool use_msi;
 } dcfg_arm_gicv2_driver_t;
 
 // for KDRV_ARM_GIC_V3
 typedef struct {
-    uint64_t mmio_phys;
-    uint64_t gicd_offset;
-    uint64_t gicr_offset;
-    uint64_t gicr_stride;
-    uint64_t mx8_gpr_phys;
-    uint32_t ipi_base;
-    bool optional;
+  uint64_t mmio_phys;
+  uint64_t gicd_offset;
+  uint64_t gicr_offset;
+  uint64_t gicr_stride;
+  uint64_t mx8_gpr_phys;
+  uint32_t ipi_base;
+  bool optional;
 } dcfg_arm_gicv3_driver_t;
 
 // for KDRV_ARM_GENERIC_TIMER
 typedef struct {
-    uint32_t irq_phys;
-    uint32_t irq_virt;
-    uint32_t irq_sphys;
-    uint32_t freq_override;
+  uint32_t irq_phys;
+  uint32_t irq_virt;
+  uint32_t irq_sphys;
+  uint32_t freq_override;
 } dcfg_arm_generic_timer_driver_t;
 
-// for KDRV_HISILICON_POWER
-typedef struct {
-    uint64_t sctrl_phys;
-    uint64_t pmu_phys;
-} dcfg_hisilicon_power_driver_t;
-
 // for KDRV_AMLOGIC_HDCP
 typedef struct {
-    uint64_t preset_phys;
-    uint64_t hiu_phys;
-    uint64_t hdmitx_phys;
+  uint64_t preset_phys;
+  uint64_t hiu_phys;
+  uint64_t hdmitx_phys;
 } dcfg_amlogic_hdcp_driver_t;
+
+// for KDRV_AMLOGIC_RNG
+typedef struct {
+  uint64_t rng_data_phys;
+  uint64_t rng_status_phys;
+  uint64_t rng_refresh_interval_usec;
+} dcfg_amlogic_rng_driver_t;
+
+// Defines a register write action for a generic kernel watchdog driver.  An
+// action consists of the following steps.
+//
+// 1) Read from the register located a physical address |addr|
+// 2) Clear all of the bits in the value which was read using the |clr_mask|
+// 3) Set all of the bits in the value using the |set_mask|
+// 4) Write this value back to the address located at addr.
+//
+typedef struct {
+  uint64_t addr;
+  uint32_t clr_mask;
+  uint32_t set_mask;
+} dcfg_generic_32bit_watchdog_action_t;
+
+#define KDRV_GENERIC_32BIT_WATCHDOG_FLAG_ENABLED ((uint32_t)0x00000001)
+#define KDRV_GENERIC_32BIT_WATCHDOG_MIN_PERIOD ZX_MSEC(1)
+
+// Definitions of actions which may be taken by a generic 32 bit watchdog timer
+// kernel driver which may be passed by a bootloader.  Field definitions are as
+// follows.
+//
+// |pet_action|
+// The address and masks needed to "pet" (aka, dismiss) a hardware watchdog timer.
+//
+// |enable_action|
+// The address and masks needed to enable a hardware watchdog timer.  If enable
+// is an unsupported operation, the addr of the |enable_action| shall be zero.
+//
+// |disable_action|
+// The address and masks needed to disable a hardware watchdog timer.  If
+// disable is an unsupported operation, the addr of the |disable_action| shall
+// be zero.
+//
+// |watchdog_period_nsec|
+// The period of the watchdog timer given in nanoseconds.  When enabled, the
+// watchdog timer driver must pet the watch dog at least this often.  The value
+// must be at least 1 mSec, typically much larger (on the order of a second or
+// two)
+//
+// |flags|
+// Storage for additional flags.  Currently, only one flag is defined,
+// "FLAG_ENABLED".  When this flag is set, it indicates that the watchdog timer
+// was left enabled by the bootloader at startup.
+typedef struct {
+  dcfg_generic_32bit_watchdog_action_t pet_action;
+  dcfg_generic_32bit_watchdog_action_t enable_action;
+  dcfg_generic_32bit_watchdog_action_t disable_action;
+  zx_duration_t watchdog_period_nsec;
+  uint32_t flags;
+} dcfg_generic_32bit_watchdog_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/e820.h b/arch/arm64/sysroot/include/zircon/boot/e820.h
index fb8c340..f0f98f0 100644
--- a/arch/arm64/sysroot/include/zircon/boot/e820.h
+++ b/arch/arm64/sysroot/include/zircon/boot/e820.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_E820_H_
+#define SYSROOT_ZIRCON_BOOT_E820_H_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
@@ -14,7 +15,9 @@
 #define E820_UNUSABLE 5
 
 typedef struct e820entry {
-    uint64_t addr;
-    uint64_t size;
-    uint32_t type;
+  uint64_t addr;
+  uint64_t size;
+  uint32_t type;
 } __PACKED e820entry_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_E820_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/image.h b/arch/arm64/sysroot/include/zircon/boot/image.h
index de2411e..28663b6 100644
--- a/arch/arm64/sysroot/include/zircon/boot/image.h
+++ b/arch/arm64/sysroot/include/zircon/boot/image.h
@@ -2,12 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_IMAGE_H_
+#define SYSROOT_ZIRCON_BOOT_IMAGE_H_
+
+// This file contains assembly code that cannot be clang formatted.
+// clang-format off
 
 #ifndef __ASSEMBLER__
 #include <stdint.h>
 #endif
 
+
 // Zircon Boot Image format (ZBI).
 //
 // A Zircon Boot Image consists of a container header followed by boot
@@ -108,6 +113,7 @@
     macro(ZBI_TYPE_DISCARD, "DISCARD", ".bin") \
     macro(ZBI_TYPE_STORAGE_RAMDISK, "RAMDISK", ".bin") \
     macro(ZBI_TYPE_STORAGE_BOOTFS, "BOOTFS", ".bin") \
+    macro(ZBI_TYPE_STORAGE_BOOTFS_FACTORY, "BOOTFS_FACTORY", ".bin") \
     macro(ZBI_TYPE_CMDLINE, "CMDLINE", ".txt") \
     macro(ZBI_TYPE_CRASHLOG, "CRASHLOG", ".bin") \
     macro(ZBI_TYPE_NVRAM, "NVRAM", ".bin") \
@@ -121,12 +127,17 @@
     macro(ZBI_TYPE_EFI_MEMORY_MAP, "EFI_MEMORY_MAP", ".bin") \
     macro(ZBI_TYPE_EFI_SYSTEM_TABLE, "EFI_SYSTEM_TABLE", ".bin") \
     macro(ZBI_TYPE_E820_TABLE, "E820_TABLE", ".bin") \
-    macro(ZBI_TYPE_DEBUG_UART, "DEBUG_UART", ".bin") \
     macro(ZBI_TYPE_FRAMEBUFFER, "FRAMEBUFFER", ".bin") \
     macro(ZBI_TYPE_DRV_MAC_ADDRESS, "DRV_MAC_ADDRESS", ".bin") \
     macro(ZBI_TYPE_DRV_PARTITION_MAP, "DRV_PARTITION_MAP", ".bin") \
-    macro(ZBI_TYPE_BOOT_CONFIG, "BOOT_CONFIG", ".bin") \
-    macro(ZBI_TYPE_BOOT_VERSION, "BOOT_VERSION", ".bin")
+    macro(ZBI_TYPE_DRV_BOARD_PRIVATE, "DRV_BOARD_PRIVATE", ".bin") \
+    macro(ZBI_TYPE_DRV_BOARD_INFO, "DRV_BOARD_INFO", ".bin") \
+    macro(ZBI_TYPE_IMAGE_ARGS, "IMAGE_ARGS", ".txt") \
+    macro(ZBI_TYPE_BOOT_VERSION, "BOOT_VERSION", ".bin") \
+    macro(ZBI_TYPE_HW_REBOOT_REASON, "HW_REBOOT_REASON", ".bin") \
+    macro(ZBI_TYPE_SERIAL_NUMBER, "SERIAL_NUMBER", ".txt") \
+    macro(ZBI_TYPE_BOOTLOADER_FILE, "BOOTLOADER_FILE", ".bin") \
+    macro(ZBI_TYPE_DEVICETREE, "DEVICETREE", ".dtb")
 
 // Each ZBI starts with a container header.
 //     length:          Total size of the image after this header.
@@ -197,12 +208,12 @@
 //     The kernel assumes it was loaded at a fixed physical address of
 //     0x100000 (1MB).  zbi_kernel_t.entry is the absolute physical address
 //     of the PC location where the kernel will start.
-//     TODO(SEC-31): Perhaps this will change??
+//     TODO(fxbug.dev/24762): Perhaps this will change??
 //     The processor is in 64-bit mode with direct virtual to physical
 //     mapping covering the physical memory where the kernel and
-//     bootloader-constructed ZBI were loaded, which must be below 4GB.
-//     The %rsi register (or %esi, since the high 32 bits must be zero)
-//     holds the physical address of the bootloader-constructed ZBI.
+//     bootloader-constructed ZBI were loaded.
+//     The %rsi register holds the physical address of the
+//     bootloader-constructed ZBI.
 //     All other registers are unspecified.
 //
 //  ARM64
@@ -257,12 +268,29 @@
 // The interpretation of the payload (after possible decompression) is
 // indicated by the specific zbi_header_t.type value.
 //
-// If ZBI_FLAG_STORAGE_COMPRESSED is set in zbi_header_t.flags, then the
-// payload is compressed with LZ4 and zbi_header_t.extra gives the exact
-// size of the decompressed payload.  If ZBI_FLAG_STORAGE_COMPRESSED is
-// not set, then zbi_header_t.extra matches zbi_header_t.length.
+// **Note:** The ZBI_TYPE_STORAGE_* types are not a long-term stable ABI.
+//  - Items of these types are always packed for a specific version of the
+//    kernel and userland boot services, often in the same build that compiles
+//    the kernel.
+//  - These item types are **not** expected to be synthesized or
+//    examined by boot loaders.
+//  - New versions of the `zbi` tool will usually retain the ability to
+//    read old formats and non-default switches to write old formats, for
+//    diagnostic use.
 //
-// TODO(mcgrathr): Document or point to the details of the LZ4 header format.
+// The zbi_header_t.extra field always gives the exact size of the
+// original, uncompressed payload.  That equals zbi_header_t.length when
+// the payload is not compressed.  If ZBI_FLAG_STORAGE_COMPRESSED is set in
+// zbi_header_t.flags, then the payload is compressed.
+//
+// **Note:** Magic-number and header bytes at the start of the compressed
+// payload indicate the compression algorithm and parameters.  The set of
+// compression formats is not a long-term stable ABI.
+//  - Zircon [userboot](../../../../docs/userboot.md) and core services
+//    do the decompression.  A given kernel build's `userboot` will usually
+//    only support one particular compression format.
+//  - The `zbi` tool will usually retain the ability to compress and
+//    decompress for old formats, and can be used to convert between formats.
 #define ZBI_FLAG_STORAGE_COMPRESSED     (0x00000001)
 
 // A virtual disk image.  This is meant to be treated as if it were a
@@ -270,72 +298,14 @@
 // the storage device, in whatever format that might be.
 #define ZBI_TYPE_STORAGE_RAMDISK        (0x4b534452) // RDSK
 
-// The /boot filesystem in BOOTFS format, specified below.
+// The /boot filesystem in BOOTFS format, specified in <zircon/boot/bootfs.h>.
 // A complete ZBI must have exactly one ZBI_TYPE_STORAGE_BOOTFS item.
 // Zircon [userboot](../../../../docs/userboot.md) handles the contents
 // of this filesystem.
 #define ZBI_TYPE_STORAGE_BOOTFS         (0x42534642) // BFSB
 
-// The payload (after decompression) of an item in BOOTFS format consists
-// of separate "file" images that are each aligned to ZBI_BOOTFS_PAGE_SIZE
-// bytes from the beginning of the item payload.  The first "file" consists
-// of a zbi_bootfs_header_t followed by directory entries.
-#define ZBI_BOOTFS_PAGE_SIZE            (4096u)
-
-#define ZBI_BOOTFS_PAGE_ALIGN(size) \
-    (((size) + ZBI_BOOTFS_PAGE_SIZE - 1) & -ZBI_BOOTFS_PAGE_SIZE)
-
-#ifndef __ASSEMBLER__
-typedef struct {
-    // Must be ZBI_BOOTFS_MAGIC.
-    uint32_t magic;
-
-    // Size in bytes of all the directory entries.
-    // Does not include the size of the zbi_bootfs_header_t.
-    uint32_t dirsize;
-
-    // Reserved for future use.  Set to 0.
-    uint32_t reserved0;
-    uint32_t reserved1;
-} zbi_bootfs_header_t;
-#endif
-
-// LSW of sha256("bootfs")
-#define ZBI_BOOTFS_MAGIC                (0xa56d3ff9)
-
-// Each directory entry holds a pathname and gives the offset and size
-// of the contents of the file by that name.
-#ifndef __ASSEMBLER__
-typedef struct {
-    // Length of the name[] field at the end.  This length includes the
-    // NUL terminator, which must be present, but does not include any
-    // alignment padding required before the next directory entry.
-    uint32_t name_len;
-
-    // Length of the file in bytes.  This is an exact size that is not
-    // rounded, though the file is always padded with zeros up to a
-    // multiple of ZBI_BOOTFS_PAGE_SIZE.
-    uint32_t data_len;
-
-    // Offset from the beginning of the payload (zbi_bootfs_header_t) to
-    // the file's data.  This must be a multiple of ZBI_BOOTFS_PAGE_SIZE.
-    uint32_t data_off;
-
-    // Pathname of the file, a UTF-8 string.  This must include a NUL
-    // terminator at the end.  It must not begin with a '/', but it may
-    // contain '/' separators for subdirectories.
-    char name[];
-} zbi_bootfs_dirent_t;
-#endif
-
-// Each directory entry has a variable size of [16,268] bytes that
-// must be a multiple of 4 bytes.
-#define ZBI_BOOTFS_DIRENT_SIZE(name_len) \
-    ((sizeof(zbi_bootfs_dirent_t) + (name_len) + 3) & -(size_t)4)
-
-// zbi_bootfs_dirent_t.name_len must be > 1 and <= ZBI_BOOTFS_MAX_NAME_LEN.
-#define ZBI_BOOTFS_MAX_NAME_LEN         (256)
-
+// Device-specific factory data, stored in BOOTFS format, specified below.
+#define ZBI_TYPE_STORAGE_BOOTFS_FACTORY (0x46534642) // BFSF
 
 // The remaining types are used to communicate information from the boot
 // loader to the kernel.  Usually these are synthesized in memory by the
@@ -380,6 +350,14 @@
 } zbi_platform_id_t;
 #endif
 
+#define ZBI_TYPE_DRV_BOARD_INFO         (0x4953426D) // mBSI
+// Board-specific information.
+#ifndef __ASSEMBLER__
+typedef struct {
+    uint32_t revision;
+} zbi_board_info_t;
+#endif
+
 // CPU configuration, a zbi_cpu_config_t header followed by one or more
 // zbi_cpu_cluster_t entries.  zbi_header_t.length must equal
 // zbi_cpu_config_t.cluster_count * sizeof(zbi_cpu_cluster_t).
@@ -447,7 +425,9 @@
 }  zbi_topology_arm_info_t;
 
 typedef struct {
-    uint32_t apic_id;
+    // Indexes here correspond to the logical_ids index for the thread.
+    uint32_t apic_ids[ZBI_MAX_SMT];
+    uint32_t apic_id_count;
 }  zbi_topology_x86_info_t;
 
 typedef struct {
@@ -467,14 +447,33 @@
 } zbi_topology_processor_t;
 
 typedef struct {
-    // Relative performance level of this processor in the system, with 0
-    // representing the lowest performance.
-    // For example on a two cluster ARM big.LITTLE system 0 would be the little
-    // cores and 1 would represent the big cores.
+    // Relative performance level of this processor in the system. The value is
+    // interpreted as the performance of this processor relative to the maximum
+    // performance processor in the system. No specific values are required for
+    // the performance level, only that the following relationship holds:
+    //
+    //   Pmax is the value of performance_class for the maximum performance
+    //   processor in the system, operating at its maximum operating point.
+    //
+    //   P is the value of performance_class for this processor, operating at
+    //   its maximum operating point.
+    //
+    //   R is the performance ratio of this processor to the maximum performance
+    //   processor in the system in the range (0.0, 1.0].
+    //
+    //   R = (P + 1) / (Pmax + 1)
+    //
+    // If accuracy is limited, choose a conservative value that slightly under-
+    // estimates the performance of lower-performance processors.
     uint8_t performance_class;
 } zbi_topology_cluster_t;
 
 typedef struct {
+    // Unique id of this cache node. No other semantics are assumed.
+    uint32_t cache_id;
+} zbi_topology_cache_t;
+
+typedef struct {
   // Starting and ending memory addresses of this numa region.
   uint64_t start_address;
   uint64_t end_address;
@@ -499,6 +498,7 @@
         zbi_topology_processor_t processor;
         zbi_topology_cluster_t cluster;
         zbi_topology_numa_region_t numa_region;
+        zbi_topology_cache_t cache;
     } entity;
 } zbi_topology_node_t;
 
@@ -544,29 +544,18 @@
 #define ZIRCON_VENDOR_GUID \
     {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}}
 #define ZIRCON_CRASHLOG_EFIVAR \
-    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 };
+    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 }
 #define ZIRCON_CRASHLOG_EFIATTR \
     (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
 
-// Debug serial port, a zbi_uart_t entry.
-#define ZBI_TYPE_DEBUG_UART             (0x54524155) // UART
-#ifndef __ASSEMBLER__
-typedef struct {
-    uint64_t base;
-    uint32_t type;
-    uint32_t irq;
-} zbi_uart_t;
-#endif
-#define ZBI_UART_NONE                   (0)
-#define ZBI_UART_PC_PORT                (1)
-#define ZBI_UART_PC_MMIO                (2)
-
 // Framebuffer parameters, a zbi_swfb_t entry.
 #define ZBI_TYPE_FRAMEBUFFER            (0x42465753) // SWFB
 
-// A copy of the boot configuration stored as a kvstore
-// within the sysconfig partition.
-#define ZBI_TYPE_BOOT_CONFIG        (0x47464342) // BCFG
+// The image arguments, data is a trivial text format of one "key=value" per line
+// with leading whitespace stripped and "#" comment lines and blank lines ignored.
+// It is processed by bootsvc and parsed args are shared to others via Arguments service.
+// TODO: the format can be streamlined after the /config/devmgr compat support is removed.
+#define ZBI_TYPE_IMAGE_ARGS          (0x47524149) // IARG
 
 // A copy of the boot version stored within the sysconfig
 // partition
@@ -602,6 +591,10 @@
 #define ZBI_TYPE_DRV_PARTITION_MAP      (0x5452506D) // mPRT
 #define ZBI_PARTITION_NAME_LEN          (32)
 #define ZBI_PARTITION_GUID_LEN          (16)
+
+// Private information for the board driver.
+#define ZBI_TYPE_DRV_BOARD_PRIVATE      (0x524F426D) // mBOR
+
 #ifndef __ASSEMBLER__
 typedef struct {
     // GUID specifying the format and use of data stored in the partition.
@@ -639,3 +632,50 @@
     zbi_partition_t partitions[];
 } zbi_partition_map_t;
 #endif
+
+
+#define ZBI_TYPE_HW_REBOOT_REASON       (0x42525748) // HWRB
+
+#define ZBI_HW_REBOOT_UNDEFINED         ((uint32_t)0)
+#define ZBI_HW_REBOOT_COLD              ((uint32_t)1)
+#define ZBI_HW_REBOOT_WARM              ((uint32_t)2)
+#define ZBI_HW_REBOOT_BROWNOUT          ((uint32_t)3)
+#define ZBI_HW_REBOOT_WATCHDOG          ((uint32_t)4)
+
+#ifndef __ASSEMBLER__
+#ifndef __cplusplus
+typedef uint32_t zbi_hw_reboot_reason_t;
+#else
+enum class ZbiHwRebootReason : uint32_t {
+    Undefined = ZBI_HW_REBOOT_UNDEFINED,
+    Cold = ZBI_HW_REBOOT_COLD,
+    Warm = ZBI_HW_REBOOT_WARM,
+    Brownout = ZBI_HW_REBOOT_BROWNOUT,
+    Watchdog = ZBI_HW_REBOOT_WATCHDOG,
+};
+using zbi_hw_reboot_reason_t = ZbiHwRebootReason;
+#endif  // __cplusplus
+#endif  // __ASSEMBLER__
+
+// The serial number, an unterminated ASCII string of printable non-whitespace
+// characters with length zbi_header_t.length.
+#define ZBI_TYPE_SERIAL_NUMBER          (0x4e4c5253) // SRLN
+
+// This type specifies a binary file passed in by the bootloader.
+// The first byte specifies the length of the filename without a NUL terminator.
+// The filename starts on the second byte.
+// The file contents are located immediately after the filename.
+//
+// Layout: | name_len |        name       |   payload
+//           ^(1 byte)  ^(name_len bytes)     ^(length of file)
+#define ZBI_TYPE_BOOTLOADER_FILE        (0x4C465442) // BTFL
+
+// The devicetree blob from the legacy boot loader, if any.  This is used only
+// for diagnostic and development purposes.  Zircon kernel and driver
+// configuration is entirely driven by specific ZBI items from the boot
+// loader.  The boot shims for legacy boot loaders pass the raw devicetree
+// along for development purposes, but extract information from it to populate
+// specific ZBI items such as ZBI_TYPE_KERNEL_DRIVER et al.
+#define ZBI_TYPE_DEVICETREE             (0xd00dfeed)
+
+#endif  // SYSROOT_ZIRCON_BOOT_IMAGE_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/multiboot.h b/arch/arm64/sysroot/include/zircon/boot/multiboot.h
index 0076832..85cf0a6 100644
--- a/arch/arm64/sysroot/include/zircon/boot/multiboot.h
+++ b/arch/arm64/sysroot/include/zircon/boot/multiboot.h
@@ -1,23 +1,22 @@
-// Copyright 2016 The Fuchsia Authors
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
 // Copyright (c) 2009 Corey Tabaka
-//
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file or at
-// https://opensource.org/licenses/MIT
 
-#ifndef __PLATFORM_MULTIBOOT_H
-#define __PLATFORM_MULTIBOOT_H
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SYSROOT_ZIRCON_MULTIBOOT_H_
+#define SYSROOT_ZIRCON_MULTIBOOT_H_
 
 /* magic number for multiboot header */
-#define MULTIBOOT_HEADER_MAGIC      0x1BADB002
+#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
 
 // Flags for multiboot header:
 //   0x00000002: Boot loader should provide memory map.
 //   0x00010000: *_addr fields in multiboot_header_t are used.
-#define MULTIBOOT_HEADER_FLAGS      0x00010002
+#define MULTIBOOT_HEADER_FLAGS 0x00010002
 
 /* magic number passed by multiboot-compliant boot loaders */
-#define MULTIBOOT_BOOTLOADER_MAGIC  0x2BADB002
+#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
 
 #ifndef __ASSEMBLER__
 
@@ -25,52 +24,52 @@
 
 /* multiboot header */
 typedef struct multiboot_header {
-    uint32_t magic;
-    uint32_t flags;
-    uint32_t checksum;
-    uint32_t header_addr;
-    uint32_t load_addr;
-    uint32_t load_end_addr;
-    uint32_t bss_end_addr;
-    uint32_t entry_addr;
+  uint32_t magic;
+  uint32_t flags;
+  uint32_t checksum;
+  uint32_t header_addr;
+  uint32_t load_addr;
+  uint32_t load_end_addr;
+  uint32_t bss_end_addr;
+  uint32_t entry_addr;
 } multiboot_header_t;
 
 /* symbol table for a.out */
 typedef struct aout_symbol_table {
-    uint32_t tabsize;
-    uint32_t strsize;
-    uint32_t addr;
-    uint32_t reserved;
+  uint32_t tabsize;
+  uint32_t strsize;
+  uint32_t addr;
+  uint32_t reserved;
 } aout_symbol_table_t;
 
 /* section header table for ELF */
 typedef struct elf_section_header_table {
-    uint32_t num;
-    uint32_t size;
-    uint32_t addr;
-    uint32_t shndx;
+  uint32_t num;
+  uint32_t size;
+  uint32_t addr;
+  uint32_t shndx;
 } elf_section_header_table_t;
 
 /* multiboot info */
 typedef struct multiboot_info {
-    uint32_t flags;
-    uint32_t mem_lower;
-    uint32_t mem_upper;
-    uint32_t boot_device;
-    uint32_t cmdline;
-    uint32_t mods_count;
-    uint32_t mods_addr;
-    union {
-        aout_symbol_table_t aout_sym;
-        elf_section_header_table_t elf_sec;
-    } u;
-    uint32_t mmap_length;
-    uint32_t mmap_addr;
-    uint32_t drives_length;
-    uint32_t drives_addr;
-    uint32_t config_table;
-    uint32_t boot_loader_name;
-    uint32_t apm_table;
+  uint32_t flags;
+  uint32_t mem_lower;
+  uint32_t mem_upper;
+  uint32_t boot_device;
+  uint32_t cmdline;
+  uint32_t mods_count;
+  uint32_t mods_addr;
+  union {
+    aout_symbol_table_t aout_sym;
+    elf_section_header_table_t elf_sec;
+  } u;
+  uint32_t mmap_length;
+  uint32_t mmap_addr;
+  uint32_t drives_length;
+  uint32_t drives_addr;
+  uint32_t config_table;
+  uint32_t boot_loader_name;
+  uint32_t apm_table;
 } multiboot_info_t;
 
 #define MB_INFO_MEM_SIZE 0x001
@@ -88,20 +87,20 @@
 
 /* module structure */
 typedef struct module {
-    uint32_t mod_start;
-    uint32_t mod_end;
-    uint32_t string;
-    uint32_t reserved;
+  uint32_t mod_start;
+  uint32_t mod_end;
+  uint32_t string;
+  uint32_t reserved;
 } module_t;
 
 /* memory map - be careful that the offset 0 is base_addr_low without size */
 typedef struct memory_map {
-    uint32_t size;
-    uint32_t base_addr_low;
-    uint32_t base_addr_high;
-    uint32_t length_low;
-    uint32_t length_high;
-    uint32_t type;
+  uint32_t size;
+  uint32_t base_addr_low;
+  uint32_t base_addr_high;
+  uint32_t length_low;
+  uint32_t length_high;
+  uint32_t type;
 } memory_map_t;
 
 /* memory map entry types */
@@ -112,4 +111,4 @@
 
 #endif
 
-#endif
+#endif  // SYSROOT_ZIRCON_BOOT_MULTIBOOT_
diff --git a/arch/arm64/sysroot/include/zircon/boot/netboot.h b/arch/arm64/sysroot/include/zircon/boot/netboot.h
index 25973c6..1586352 100644
--- a/arch/arm64/sysroot/include/zircon/boot/netboot.h
+++ b/arch/arm64/sysroot/include/zircon/boot/netboot.h
@@ -2,14 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_NETBOOT_H_
+#define SYSROOT_ZIRCON_BOOT_NETBOOT_H_
 
 #include <stddef.h>
 #include <stdint.h>
+#include <zircon/types.h>
 
 // clang-format off
 
-#define BOOTLOADER_VERSION "0.7.13"
+#define BOOTLOADER_VERSION "0.7.22"
 
 #define NB_MAGIC              0xAA774217
 #define NB_DEBUGLOG_MAGIC     0xAEAE1123
@@ -34,6 +36,7 @@
 #define NB_CLOSE             10  // arg=0
 #define NB_LAST_DATA         11  // arg=offset, data=data
 #define NB_REBOOT            12  // arg=0
+#define NB_GET_ADVERT        13  // arg=0
 
 #define NB_ACK                0 // arg=0 or -err, NB_READ: data=data
 #define NB_FILE_RECEIVED      0x70000001 // arg=size
@@ -62,10 +65,17 @@
 #define NB_FVM_FILENAME NB_IMAGE_PREFIX NB_FVM_HOST_FILENAME
 #define NB_BOOTLOADER_HOST_FILENAME "bootloader.img"
 #define NB_BOOTLOADER_FILENAME NB_IMAGE_PREFIX NB_BOOTLOADER_HOST_FILENAME
-#define NB_EFI_HOST_FILENAME "efi.img"
-#define NB_EFI_FILENAME NB_IMAGE_PREFIX NB_EFI_HOST_FILENAME
-#define NB_KERNC_HOST_FILENAME "kernc.img"
-#define NB_KERNC_FILENAME NB_IMAGE_PREFIX NB_KERNC_HOST_FILENAME
+// Firmware images are slightly different, as they have an optional type suffix:
+//   firmware_     <- type = "" (the default)
+//   firmware_foo  <- type = "foo"
+#define NB_FIRMWARE_HOST_FILENAME_PREFIX "firmware_"
+#define NB_FIRMWARE_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARE_HOST_FILENAME_PREFIX
+#define NB_FIRMWAREA_HOST_FILENAME_PREFIX "firmwarea_"
+#define NB_FIRMWAREA_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREA_HOST_FILENAME_PREFIX
+#define NB_FIRMWAREB_HOST_FILENAME_PREFIX "firmwareb_"
+#define NB_FIRMWAREB_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREB_HOST_FILENAME_PREFIX
+#define NB_FIRMWARER_HOST_FILENAME_PREFIX "firmwarer_"
+#define NB_FIRMWARER_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARER_HOST_FILENAME_PREFIX
 #define NB_ZIRCONA_HOST_FILENAME "zircona.img"
 #define NB_ZIRCONA_FILENAME NB_IMAGE_PREFIX NB_ZIRCONA_HOST_FILENAME
 #define NB_ZIRCONB_HOST_FILENAME "zirconb.img"
@@ -76,8 +86,36 @@
 #define NB_VBMETAA_FILENAME NB_IMAGE_PREFIX NB_VBMETAA_HOST_FILENAME
 #define NB_VBMETAB_HOST_FILENAME "vbmetab.img"
 #define NB_VBMETAB_FILENAME NB_IMAGE_PREFIX NB_VBMETAB_HOST_FILENAME
+#define NB_VBMETAR_HOST_FILENAME "vbmetar.img"
+#define NB_VBMETAR_FILENAME NB_IMAGE_PREFIX NB_VBMETAR_HOST_FILENAME
 #define NB_SSHAUTH_HOST_FILENAME "authorized_keys"
 #define NB_SSHAUTH_FILENAME NB_IMAGE_PREFIX NB_SSHAUTH_HOST_FILENAME
+#define NB_BOARD_NAME_HOST_FILENAME "board_name"
+#define NB_BOARD_NAME_FILENAME NB_IMAGE_PREFIX NB_BOARD_NAME_HOST_FILENAME
+#define NB_BOARD_REVISION_HOST_FILENAME "board_revision"
+#define NB_BOARD_REVISION_FILENAME NB_IMAGE_PREFIX NB_BOARD_REVISION_HOST_FILENAME
+#define NB_BOARD_INFO_HOST_FILENAME "board_info"
+#define NB_BOARD_INFO_FILENAME NB_IMAGE_PREFIX NB_BOARD_INFO_HOST_FILENAME
+#define NB_INIT_PARTITION_TABLES_HOST_FILENAME "init_partition_tables"
+#define NB_INIT_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_INIT_PARTITION_TABLES_HOST_FILENAME
+#define NB_WIPE_PARTITION_TABLES_HOST_FILENAME "wipe_partition_tables"
+#define NB_WIPE_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_WIPE_PARTITION_TABLES_HOST_FILENAME
+
+// Should match paver FIDL definition.
+// Length does not include the '\0' terminator, so when allocating a character
+// buffer to hold the type use (NB_FIRMWARE_TYPE_MAX_LENGTH  + 1).
+#define NB_FIRMWARE_TYPE_MAX_LENGTH 256
+
+typedef struct board_info {
+  char board_name[ZX_MAX_NAME_LEN];
+  uint32_t board_revision;
+  uint8_t mac_address[8];
+} board_info_t;
+
+typedef struct modify_partition_table_info {
+  // Path of block device to initialize or wipe.
+  char block_device_path[ZX_MAX_NAME_LEN + 1];
+} modify_partition_table_info_t;
 
 typedef struct nbmsg_t {
     uint32_t magic;
@@ -114,3 +152,5 @@
     char nodename[MAX_NODENAME_LENGTH];
     char data[MAX_LOG_DATA];
 } logpacket_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_NETBOOT_H_
diff --git a/arch/arm64/sysroot/include/zircon/boot/sysconfig.h b/arch/arm64/sysroot/include/zircon/boot/sysconfig.h
index fe59efa..1f7d49b 100644
--- a/arch/arm64/sysroot/include/zircon/boot/sysconfig.h
+++ b/arch/arm64/sysroot/include/zircon/boot/sysconfig.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
+#define SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
 
 // Zircon sysconfig partition format
 //
@@ -19,8 +20,10 @@
 //                  If present, this overrides boot-default, and the bootloader
 //                  deletes this section after use.
 
-#define ZX_SYSCONFIG_KVSTORE_SIZE           32768
-#define ZX_SYSCONFIG_VERSION_A_OFFSET       (0 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_VERSION_B_OFFSET       (1 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET    (2 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_BOOT_ONESHOT_OFFSET    (3 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_KVSTORE_SIZE 32768
+#define ZX_SYSCONFIG_VERSION_A_OFFSET (0 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_VERSION_B_OFFSET (1 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET (2 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_BOOT_ONESHOT_OFFSET (3 * ZX_SYSCONFIG_KVSTORE_SIZE)
+
+#endif  // SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
diff --git a/arch/arm64/sysroot/include/zircon/compiler.h b/arch/arm64/sysroot/include/zircon/compiler.h
index fb3bb42..ce2bcea 100644
--- a/arch/arm64/sysroot/include/zircon/compiler.h
+++ b/arch/arm64/sysroot/include/zircon/compiler.h
@@ -2,7 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_COMPILER_H_
+#define SYSROOT_ZIRCON_COMPILER_H_
+
+#ifndef __has_feature
+#define __has_feature(x) 0
+#endif
+
+#ifndef __has_cpp_attribute
+#define __has_cpp_attribute(x) 0
+#endif
 
 #ifndef __ASSEMBLER__
 
@@ -10,14 +19,14 @@
 #error "Unrecognized compiler!"
 #endif
 
-#define likely(x)       __builtin_expect(!!(x), 1)
-#define unlikely(x)     __builtin_expect(!!(x), 0)
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
 #define __UNUSED __attribute__((__unused__))
 #define __USED __attribute__((__used__))
 #define __PACKED __attribute__((packed))
 #define __ALIGNED(x) __attribute__((aligned(x)))
-#define __PRINTFLIKE(__fmt,__varargs) __attribute__((__format__ (__printf__, __fmt, __varargs)))
-#define __SCANFLIKE(__fmt,__varargs) __attribute__((__format__ (__scanf__, __fmt, __varargs)))
+#define __PRINTFLIKE(__fmt, __varargs) __attribute__((__format__(__printf__, __fmt, __varargs)))
+#define __SCANFLIKE(__fmt, __varargs) __attribute__((__format__(__scanf__, __fmt, __varargs)))
 #define __SECTION(x) __attribute__((__section__(x)))
 #define __PURE __attribute__((__pure__))
 #define __CONST __attribute__((__const__))
@@ -39,18 +48,21 @@
 #define __LEAF_FN __attribute__((__leaf__))
 #define __OPTIMIZE(x) __attribute__((__optimize__(x)))
 #define __EXTERNALLY_VISIBLE __attribute__((__externally_visible__))
-#define __THREAD_ANNOTATION(x)
 #define __NO_SAFESTACK
+#define __THREAD_ANNOTATION(x)
 #else
 #define __LEAF_FN
 #define __OPTIMIZE(x)
 #define __EXTERNALLY_VISIBLE
+// The thread safety annotations are frequently used with C++ standard library
+// types in userspace, so only enable the annotations if we know that the C++
+// standard library types are annotated or if we're in kernel code.
+#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) || defined(_KERNEL)
 #define __THREAD_ANNOTATION(x) __attribute__((x))
-#define __NO_SAFESTACK __attribute__((__no_sanitize__("safe-stack")))
-#endif
-
-#ifndef __has_feature
-#define __has_feature(x) 0
+#else
+#define __THREAD_ANNOTATION(x)
+#endif  // _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS
+#define __NO_SAFESTACK __attribute__((__no_sanitize__("safe-stack", "shadow-call-stack")))
 #endif
 
 #define __ALWAYS_INLINE __attribute__((__always_inline__))
@@ -60,19 +72,51 @@
 #define __UNREACHABLE __builtin_unreachable()
 #define __WEAK_ALIAS(x) __attribute__((__weak__, __alias__(x)))
 #define __ALIAS(x) __attribute__((__alias__(x)))
-#define __EXPORT __attribute__ ((__visibility__("default")))
-#define __LOCAL  __attribute__ ((__visibility__("hidden")))
+#define __EXPORT __attribute__((__visibility__("default")))
+#define __LOCAL __attribute__((__visibility__("hidden")))
 #define __THREAD __thread
 #define __offsetof(type, field) __builtin_offsetof(type, field)
 
+// Only define __NO_UNIQUE_ADDRESS for C++, since it doesn't make sense in C.
+#ifdef __cplusplus
+#if __has_cpp_attribute(no_unique_address)
+#define __NO_UNIQUE_ADDRESS [[no_unique_address]]
+#else
+#define __NO_UNIQUE_ADDRESS
+#endif
+#endif  // ifdef __cplusplus
+
 #if defined(__cplusplus) && __cplusplus >= 201703L
 #define __FALLTHROUGH [[fallthrough]]
 #elif defined(__cplusplus) && defined(__clang__)
 #define __FALLTHROUGH [[clang::fallthrough]]
-#elif __GNUC__ >= 7
+// The GNU style attribute is supported by Clang for C code, but __GNUC__ for
+// clang right now is 4.
+#elif __GNUC__ >= 7 || (!defined(__cplusplus) && defined(__clang__))
 #define __FALLTHROUGH __attribute__((__fallthrough__))
 #else
-#define __FALLTHROUGH do {} while (0)
+#define __FALLTHROUGH \
+  do {                \
+  } while (0)
+#endif
+
+// C++17 onwards supports [[nodiscard]] on a constructor, warning if
+// a temporary object is created without a name. Such objects would be
+// immediately destroyed again, while the user's expectation might be
+// that it would last the scope.
+//
+// We could ideally just use [[nodiscard]] (or __WARN_UNUSED_RESULT)
+// directly, except GCC < 10.0 has a bug preventing it from being used
+// on constructors. __WARN_UNUSED_CONSTRUCTOR allows us to tag
+// constructors in supported compilers, and is simply ignored in older
+// compilers.
+#if defined(__cplusplus)
+// Clang and GCC versions >= 10.0 support [[nodiscard]] on constructors.
+#if __cplusplus >= 201703L && (defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 10)))
+#define __WARN_UNUSED_CONSTRUCTOR [[nodiscard]]
+#else
+#define __WARN_UNUSED_CONSTRUCTOR
+#endif
 #endif
 
 // Publicly exposed thread annotation macros. These have a long and ugly name to
@@ -80,12 +124,17 @@
 #define __TA_CAPABILITY(x) __THREAD_ANNOTATION(__capability__(x))
 #define __TA_GUARDED(x) __THREAD_ANNOTATION(__guarded_by__(x))
 #define __TA_ACQUIRE(...) __THREAD_ANNOTATION(__acquire_capability__(__VA_ARGS__))
+#define __TA_ACQUIRE_SHARED(...) __THREAD_ANNOTATION(__acquire_shared_capability__(__VA_ARGS__))
 #define __TA_TRY_ACQUIRE(...) __THREAD_ANNOTATION(__try_acquire_capability__(__VA_ARGS__))
 #define __TA_ACQUIRED_BEFORE(...) __THREAD_ANNOTATION(__acquired_before__(__VA_ARGS__))
 #define __TA_ACQUIRED_AFTER(...) __THREAD_ANNOTATION(__acquired_after__(__VA_ARGS__))
 #define __TA_RELEASE(...) __THREAD_ANNOTATION(__release_capability__(__VA_ARGS__))
+#define __TA_RELEASE_SHARED(...) __THREAD_ANNOTATION(__release_shared_capability__(__VA_ARGS__))
 #define __TA_REQUIRES(...) __THREAD_ANNOTATION(__requires_capability__(__VA_ARGS__))
+#define __TA_REQUIRES_SHARED(...) __THREAD_ANNOTATION(__requires_shared_capability__(__VA_ARGS__))
 #define __TA_EXCLUDES(...) __THREAD_ANNOTATION(__locks_excluded__(__VA_ARGS__))
+#define __TA_ASSERT(...) __THREAD_ANNOTATION(__assert_capability__(__VA_ARGS__))
+#define __TA_ASSERT_SHARED(...) __THREAD_ANNOTATION(__assert_shared_capability__(__VA_ARGS__))
 #define __TA_RETURN_CAPABILITY(x) __THREAD_ANNOTATION(__lock_returned__(x))
 #define __TA_SCOPED_CAPABILITY __THREAD_ANNOTATION(__scoped_lockable__)
 #define __TA_NO_THREAD_SAFETY_ANALYSIS __THREAD_ANNOTATION(__no_thread_safety_analysis__)
@@ -103,8 +152,8 @@
 
 /* CPP header guards */
 #ifdef __cplusplus
-#define __BEGIN_CDECLS  extern "C" {
-#define __END_CDECLS    }
+#define __BEGIN_CDECLS extern "C" {
+#define __END_CDECLS }
 #else
 #define __BEGIN_CDECLS
 #define __END_CDECLS
@@ -120,3 +169,23 @@
 #define add_overflow(a, b, c) __builtin_add_overflow(a, b, c)
 #define sub_overflow(a, b, c) __builtin_sub_overflow(a, b, c)
 #define mul_overflow(a, b, c) __builtin_mul_overflow(a, b, c)
+
+// A workaround to help static analyzer identify assertion failures
+#if defined(__clang__)
+#define __ANALYZER_CREATE_SINK __attribute__((analyzer_noreturn))
+#else
+#define __ANALYZER_CREATE_SINK  // no-op
+#endif
+
+// Lifetime analysis
+#ifndef __OWNER
+#ifdef __clang__
+#define __OWNER(x) [[gsl::Owner(x)]]
+#define __POINTER(x) [[gsl::Pointer(x)]]
+#else
+#define __OWNER(x)
+#define __POINTER(x)
+#endif
+#endif
+
+#endif  // SYSROOT_ZIRCON_COMPILER_H_
diff --git a/arch/arm64/sysroot/include/zircon/device/audio.h b/arch/arm64/sysroot/include/zircon/device/audio.h
new file mode 100644
index 0000000..01b966e
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/device/audio.h
@@ -0,0 +1,467 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_DEVICE_AUDIO_H_
+#define SYSROOT_ZIRCON_DEVICE_AUDIO_H_
+
+#include <sys/types.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+#include <cassert>
+#include <cstdio>
+
+// When communicating with an Audio driver using zx_channel_call, do not use
+// the AUDIO_INVALID_TRANSACTION_ID as your message's transaction ID.  It is
+// reserved for async notifications sent from the driver to the application.
+#define AUDIO_INVALID_TRANSACTION_ID ((zx_txid_t)0)
+
+__BEGIN_CDECLS
+
+typedef uint32_t audio_cmd_t;
+
+// Commands sent on the stream channel
+#define AUDIO_STREAM_CMD_GET_FORMATS ((audio_cmd_t)0x1000)
+#define AUDIO_STREAM_CMD_SET_FORMAT ((audio_cmd_t)0x1001)
+#define AUDIO_STREAM_CMD_GET_GAIN ((audio_cmd_t)0x1002)
+#define AUDIO_STREAM_CMD_SET_GAIN ((audio_cmd_t)0x1003)
+#define AUDIO_STREAM_CMD_PLUG_DETECT ((audio_cmd_t)0x1004)
+#define AUDIO_STREAM_CMD_GET_UNIQUE_ID ((audio_cmd_t)0x1005)
+#define AUDIO_STREAM_CMD_GET_STRING ((audio_cmd_t)0x1006)
+#define AUDIO_STREAM_CMD_GET_CLOCK_DOMAIN ((audio_cmd_t)0x1007)
+
+// Async notifications sent on the stream channel.
+#define AUDIO_STREAM_PLUG_DETECT_NOTIFY ((audio_cmd_t)0x2000)
+
+// Commands sent on the ring buffer channel
+#define AUDIO_RB_CMD_GET_FIFO_DEPTH ((audio_cmd_t)0x3000)
+#define AUDIO_RB_CMD_GET_BUFFER ((audio_cmd_t)0x3001)
+#define AUDIO_RB_CMD_START ((audio_cmd_t)0x3002)
+#define AUDIO_RB_CMD_STOP ((audio_cmd_t)0x3003)
+
+// Async notifications sent on the ring buffer channel.
+#define AUDIO_RB_POSITION_NOTIFY ((audio_cmd_t)0x4000)
+
+// Flags used to modify commands.
+// The NO_ACK flag can be used with the SET_GAIN and PLUG_DETECT commands.
+#define AUDIO_FLAG_NO_ACK ((audio_cmd_t)0x80000000)
+
+typedef struct audio_cmd_hdr {
+  zx_txid_t transaction_id;
+  audio_cmd_t cmd;
+} audio_cmd_hdr_t;
+
+static_assert(sizeof(audio_cmd_hdr_t) == 8,
+              "audio_cmd_hdr_t should be 8 bytes! "
+              "If sizeof(zx_txid_t has changed from 4 to 8, "
+              "consider repacking the structs in audio.h");
+
+// audio_sample_format_t
+//
+// Bitfield which describes audio sample format as they reside in memory.
+//
+typedef uint32_t audio_sample_format_t;
+#define AUDIO_SAMPLE_FORMAT_BITSTREAM ((audio_sample_format_t)(1u << 0))
+#define AUDIO_SAMPLE_FORMAT_8BIT ((audio_sample_format_t)(1u << 1))
+#define AUDIO_SAMPLE_FORMAT_16BIT ((audio_sample_format_t)(1u << 2))
+#define AUDIO_SAMPLE_FORMAT_20BIT_PACKED ((audio_sample_format_t)(1u << 4))
+#define AUDIO_SAMPLE_FORMAT_24BIT_PACKED ((audio_sample_format_t)(1u << 5))
+#define AUDIO_SAMPLE_FORMAT_20BIT_IN32 ((audio_sample_format_t)(1u << 6))
+#define AUDIO_SAMPLE_FORMAT_24BIT_IN32 ((audio_sample_format_t)(1u << 7))
+#define AUDIO_SAMPLE_FORMAT_32BIT ((audio_sample_format_t)(1u << 8))
+#define AUDIO_SAMPLE_FORMAT_32BIT_FLOAT ((audio_sample_format_t)(1u << 9))
+#define AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED ((audio_sample_format_t)(1u << 30))
+#define AUDIO_SAMPLE_FORMAT_FLAG_INVERT_ENDIAN ((audio_sample_format_t)(1u << 31))
+#define AUDIO_SAMPLE_FORMAT_FLAG_MASK                          \
+  ((audio_sample_format_t)(AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED | \
+                           AUDIO_SAMPLE_FORMAT_FLAG_INVERT_ENDIAN))
+
+// audio_stream_format_range_t
+//
+// A structure used along with the AUDIO_STREAM_CMD_GET_FORMATS command in order
+// to describe the formats supported by an audio stream.
+#define ASF_RANGE_FLAG_FPS_CONTINUOUS ((uint16_t)(1u << 0))
+#define ASF_RANGE_FLAG_FPS_48000_FAMILY ((uint16_t)(1u << 1))
+#define ASF_RANGE_FLAG_FPS_44100_FAMILY ((uint16_t)(1u << 2))
+typedef struct audio_stream_format_range {
+  audio_sample_format_t sample_formats;
+  uint32_t min_frames_per_second;
+  uint32_t max_frames_per_second;
+  uint8_t min_channels;
+  uint8_t max_channels;
+  uint16_t flags;
+} __PACKED audio_stream_format_range_t;
+
+static_assert(sizeof(audio_stream_format_range_t) == 16,
+              "audio_stream_format_range_t should be 16 bytes!");
+
+// audio_set_gain_flags_t
+//
+// Flags used by the AUDIO_STREAM_CMD_SET_GAIN message.
+//
+typedef uint32_t audio_set_gain_flags_t;
+#define AUDIO_SGF_MUTE_VALID \
+  ((audio_set_gain_flags_t)0x1)  // Whether or not the mute flag is valid.
+#define AUDIO_SGF_AGC_VALID ((audio_set_gain_flags_t)0x2)  // Whether or not the agc flag is valid.
+#define AUDIO_SGF_GAIN_VALID \
+  ((audio_set_gain_flags_t)0x4)  // Whether or not the gain float is valid.
+#define AUDIO_SGF_MUTE ((audio_set_gain_flags_t)0x40000000)  // Whether or not to mute the stream.
+#define AUDIO_SGF_AGC \
+  ((audio_set_gain_flags_t)0x80000000)  // Whether or not enable AGC for the stream.
+
+// audio_pd_flags_t
+//
+// Flags used by AUDIO_STREAM_CMD_PLUG_DETECT commands to enable or disable
+// asynchronous plug detect notifications.
+//
+typedef uint32_t audio_pd_flags_t;
+#define AUDIO_PDF_NONE ((audio_pd_flags_t)0)
+#define AUDIO_PDF_ENABLE_NOTIFICATIONS ((audio_pd_flags_t)0x40000000)
+#define AUDIO_PDF_DISABLE_NOTIFICATIONS ((audio_pd_flags_t)0x80000000)
+
+// audio_pd_notify_flags_t
+//
+// Flags used by responses to the AUDIO_STREAM_CMD_PLUG_DETECT
+// message, and by AUDIO_STREAM_PLUG_DETECT_NOTIFY messages.
+//
+typedef uint32_t audio_pd_notify_flags_t;
+#define AUDIO_PDNF_HARDWIRED \
+  ((audio_pd_notify_flags_t)0x1)  // Stream is hardwired (will always be plugged in)
+#define AUDIO_PDNF_CAN_NOTIFY \
+  ((audio_pd_notify_flags_t)0x2)  // Stream is able to notify of plug state changes.
+#define AUDIO_PDNF_PLUGGED ((audio_pd_notify_flags_t)0x80000000)  // Stream is currently plugged in.
+
+// AUDIO_STREAM_CMD_GET_FORMATS
+//
+// Must not be used with the NO_ACK flag.
+#define AUDIO_STREAM_CMD_GET_FORMATS_MAX_RANGES_PER_RESPONSE (15u)
+typedef struct audio_stream_cmd_get_formats_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_formats_req_t;
+
+// TODO(johngro) : Figure out if zx_txid_t is ever going to go up to 8 bytes or
+// not.  If it is, just remove the _pad field below.  If not, either keep it as
+// a _pad field, or repurpose it for some flags of some form.  Right now, we use
+// it to make sure that format_ranges is aligned to a 16 byte boundary.
+typedef struct audio_stream_cmd_get_formats_resp {
+  audio_cmd_hdr_t hdr;
+  uint32_t _pad;
+  uint16_t format_range_count;
+  uint16_t first_format_range_ndx;
+  audio_stream_format_range_t format_ranges[AUDIO_STREAM_CMD_GET_FORMATS_MAX_RANGES_PER_RESPONSE];
+} audio_stream_cmd_get_formats_resp_t;
+
+static_assert(sizeof(audio_stream_cmd_get_formats_resp_t) == 256,
+              "audio_stream_cmd_get_formats_resp_t must be 256 bytes");
+
+#define AUDIO_SET_FORMAT_REQ_BITMASK_DISABLED ((uint64_t)0)
+
+// AUDIO_STREAM_CMD_SET_FORMAT
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_set_format_req {
+  audio_cmd_hdr_t hdr;
+  uint32_t frames_per_second;
+  audio_sample_format_t sample_format;
+  uint16_t channels;
+  uint64_t channels_to_use_bitmask;
+} audio_stream_cmd_set_format_req_t;
+
+typedef struct audio_stream_cmd_set_format_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint64_t external_delay_nsec;
+
+  // Note: Upon success, a channel used to control the audio buffer will also
+  // be returned.
+} audio_stream_cmd_set_format_resp_t;
+
+// AUDIO_STREAM_CMD_GET_GAIN
+//
+// Request that a gain notification be sent with the current details of the
+// streams current gain settings as well as gain setting capabilities.
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_get_gain_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_gain_req_t;
+
+typedef struct audio_stream_cmd_get_gain_resp {
+  // TODO(johngro) : Is there value in exposing the gain step to the level
+  // above the lowest level stream interface, or should we have all drivers
+  // behave as if they have continuous control at all times?
+  audio_cmd_hdr_t hdr;
+
+  bool cur_mute;   // True if the stream is currently muted.
+  bool cur_agc;    // True if the stream has AGC currently enabled.
+  float cur_gain;  // The current setting gain of the stream in dB
+
+  bool can_mute;    // True if the stream is capable of muting
+  bool can_agc;     // True if the stream has support for AGC
+  float min_gain;   // The minimum valid gain setting, in dB
+  float max_gain;   // The maximum valid gain setting, in dB
+  float gain_step;  // The smallest valid gain increment, counted from the minimum gain.
+} audio_stream_cmd_get_gain_resp_t;
+
+// AUDIO_STREAM_CMD_SET_GAIN
+//
+// Request that a stream change its gain settings to most closely match those
+// requested.  Gain values for Valid requests will be rounded to the nearest
+// gain step.  For example, if a stream can control its gain on the range from
+// -60.0 to 0.0 dB, a request to set the gain to -33.3 dB will result in a gain
+// of -33.5 being applied.
+//
+// Gain change requests outside of the capabilities of the stream's
+// amplifier will be rejected with a result of ZX_ERR_INVALID_ARGS.  Using the
+// previous example, requests for gains of -65.0 or +3dB would be rejected.
+// Similarly,  If an amplifier is capable of gain control but cannot mute, a
+// request to mute will be rejected.
+//
+// TODO(johngro) : Is this the correct behavior?  Should we just apply sensible
+// limits instead?  IOW - If the user requests a gain of -1000 dB, should we
+// just set the gain to -60dB?  Likewise, if they request mute but the amplifier
+// has no hard mute feature, should we just set the gain to the minimum
+// permitted gain?
+//
+// May be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_set_gain_req {
+  audio_cmd_hdr_t hdr;
+  audio_set_gain_flags_t flags;
+  float gain;
+} audio_stream_cmd_set_gain_req_t;
+
+typedef struct audio_stream_cmd_set_gain_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  // The current gain settings observed immediately after processing the set
+  // gain request.
+  bool cur_mute;
+  bool cur_agc;
+  float cur_gain;
+} audio_stream_cmd_set_gain_resp_t;
+
+// AUDIO_STREAM_CMD_PLUG_DETECT
+//
+// Trigger a plug detect operation and/or enable/disable asynchronous plug
+// detect notifications.
+//
+// May be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_plug_detect_req {
+  audio_cmd_hdr_t hdr;
+  audio_pd_flags_t flags;  // Options used to enable or disable notifications
+} audio_stream_cmd_plug_detect_req_t;
+
+typedef struct audio_stream_cmd_plug_detect_resp {
+  audio_cmd_hdr_t hdr;
+  audio_pd_notify_flags_t flags;  // The current plug state and capabilities
+  zx_time_t plug_state_time;      // The time of the plug state last change.
+} audio_stream_cmd_plug_detect_resp_t;
+
+// AUDIO_STREAM_PLUG_DETECT_NOTIFY
+//
+// Message asynchronously in response to a plug state change to clients who have
+// registered for plug state notifications.
+//
+// Note: Solicited and unsolicited plug detect messages currently use the same
+// structure and contain the same information.  The difference between the two
+// is that Solicited messages, use AUDIO_STREAM_CMD_PLUG_DETECT as the value of
+// the `cmd` field of their header and the transaction ID of the request sent by
+// the client.  Unsolicited messages use AUDIO_STREAM_PLUG_DETECT_NOTIFY as the
+// value value of the `cmd` field of their header, and
+// AUDIO_INVALID_TRANSACTION_ID for their transaction ID.
+typedef audio_stream_cmd_plug_detect_resp_t audio_stream_plug_detect_notify_t;
+
+// AUDIO_STREAM_CMD_GET_UNIQUE_ID
+//
+// Fetch a globally unique, but persistent ID for the stream.
+//
+// Drivers should make every effort to return as unique an identifier as
+// possible for each stream that they publish.  This ID must not change between
+// boots.  When available, using a globally unique device serial number is
+// strongly encouraged.  Other possible sources of unique-ness include a
+// driver's physical connection path, driver binding information, manufacturer
+// calibration data, and so on.
+//
+// Note: a small number of hardcoded unique ID has been provided for built-in
+// devices.  Platform drivers for systems with hardwired audio devices may use
+// these unique IDs as appropriate to signal which audio streams represent the
+// built-in devices for the system.  Drivers for hot-pluggable audio devices
+// should *never* use these identifiers.
+//
+// Even given this, higher level code should *not* depend on these identifiers
+// being perfectly unique, and should be prepared to take steps to de-dupe
+// identifiers when needed.
+typedef struct audio_stream_cmd_get_unique_id_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_unique_id_req_t;
+
+typedef struct audio_stream_unique_id {
+  uint8_t data[16];
+} audio_stream_unique_id_t;
+
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_SPEAKERS \
+  {                                             \
+    .data = { 0x01, 0x00 }                      \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_HEADPHONE_JACK \
+  {                                                   \
+    .data = { 0x02, 0x00 }                            \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_MICROPHONE \
+  {                                               \
+    .data = { 0x03, 0x00 }                        \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_HEADSET_JACK \
+  {                                                 \
+    .data = { 0x04, 0x00 }                          \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_BT \
+  {                                       \
+    .data = { 0x05, 0x00 }                \
+  }
+
+typedef struct audio_stream_cmd_get_unique_id_resp {
+  audio_cmd_hdr_t hdr;
+  audio_stream_unique_id_t unique_id;
+} audio_stream_cmd_get_unique_id_resp_t;
+
+// AUDIO_STREAM_CMD_GET_STRING
+//
+// Fetch the specified string from a device's static string table.  Strings
+// returned by the device driver...
+//
+// ++ Must be encoded using UTF8
+// ++ May contain embedded NULLs
+// ++ May not be NULL terminated
+//
+// Drivers are encouraged to NULL terminate all of their strings whenever
+// possible, but are not required to do so if the response buffer is too small.
+//
+typedef uint32_t audio_stream_string_id_t;
+#define AUDIO_STREAM_STR_ID_MANUFACTURER ((audio_stream_string_id_t)0x80000000)
+#define AUDIO_STREAM_STR_ID_PRODUCT ((audio_stream_string_id_t)0x80000001)
+
+typedef struct audio_stream_cmd_get_string_req {
+  audio_cmd_hdr_t hdr;
+  audio_stream_string_id_t id;
+} audio_stream_cmd_get_string_req_t;
+
+typedef struct audio_stream_cmd_get_string_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  audio_stream_string_id_t id;
+  uint32_t strlen;
+  uint8_t str[256 - sizeof(audio_cmd_hdr_t) - (3 * sizeof(uint32_t))];
+} audio_stream_cmd_get_string_resp_t;
+
+static_assert(sizeof(audio_stream_cmd_get_string_resp_t) == 256,
+              "audio_stream_cmd_get_string_resp_t must be exactly 256 bytes");
+
+// AUDIO_STREAM_CMD_GET_CLOCK_DOMAIN
+//
+// Fetch the hardware clock domain for this device.
+// On products containing audio devices that are not locked to the local system clock, the board
+// driver will provide a clock tree entry to the audio driver at driver startup time. From that,
+// the audio driver can extract the clock domain and provide it to the sender, upon receiving this
+// command. This domain value is all that the sender needs, in order to locate controls for that
+// clock domain in the clock tree and trim that clock domain's rate.
+// On products containing audio devices that are locked to the local system monotonic clock, a clock
+// domain value of 0 should be returned.
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_get_clock_domain_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_clock_domain_req_t;
+
+typedef struct audio_stream_cmd_get_clock_domain_resp {
+  audio_cmd_hdr_t hdr;
+  int32_t clock_domain;
+} audio_stream_cmd_get_clock_domain_resp_t;
+
+//
+// Ring-buffer commands
+//
+
+// AUDIO_RB_CMD_GET_FIFO_DEPTH
+//
+// TODO(johngro) : Is calling this "FIFO" depth appropriate?  Should it be some
+// direction neutral form of something like "max-read-ahead-amount" or something
+// instead?
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_rb_cmd_get_fifo_depth_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_get_fifo_depth_req_t;
+
+typedef struct audio_rb_cmd_get_fifo_depth_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+
+  // A representation (in bytes) of how far ahead audio hardware may read
+  // into the stream (in the case of output) or may hold onto audio before
+  // writing it to memory (in the case of input).
+  uint32_t fifo_depth;
+} audio_rb_cmd_get_fifo_depth_resp_t;
+
+// AUDIO_RB_CMD_GET_BUFFER
+typedef struct audio_rb_cmd_get_buffer_req {
+  audio_cmd_hdr_t hdr;
+
+  uint32_t min_ring_buffer_frames;
+  uint32_t notifications_per_ring;
+} audio_rb_cmd_get_buffer_req_t;
+
+typedef struct audio_rb_cmd_get_buffer_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint32_t num_ring_buffer_frames;
+
+  // NOTE: If result == ZX_OK, a VMO handle representing the ring buffer to
+  // be used will be returned as well.  Clients may map this buffer with
+  // read-write permissions in the case of an output stream, or read-only
+  // permissions in the case of an input stream.  The size of the VMO
+  // indicates where the wrap point of the ring (in bytes) is located in the
+  // VMO.  This size *must* always be an integral number of audio frames.
+  //
+  // TODO(johngro) : Should we provide some indication of whether or not this
+  // memory is being used directly for HW DMA and may need explicit cache
+  // flushing/invalidation?
+} audio_rb_cmd_get_buffer_resp_t;
+
+// AUDIO_RB_CMD_START
+typedef struct audio_rb_cmd_start_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_start_req_t;
+
+typedef struct audio_rb_cmd_start_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint64_t start_time;
+} audio_rb_cmd_start_resp_t;
+
+// AUDIO_RB_CMD_STOP
+typedef struct audio_rb_cmd_stop_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_stop_req_t;
+
+typedef struct audio_rb_cmd_stop_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+} audio_rb_cmd_stop_resp_t;
+
+// AUDIO_RB_POSITION_NOTIFY
+typedef struct audio_rb_position_notify {
+  audio_cmd_hdr_t hdr;
+
+  // The time, per system monotonic clock, of the below byte position.
+  zx_time_t monotonic_time;
+
+  // The current position (in bytes) of the driver/hardware's read (output) or
+  // write (input) pointer in the ring buffer.
+  uint32_t ring_buffer_pos;
+} audio_rb_position_notify_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_DEVICE_AUDIO_H_
diff --git a/arch/arm64/sysroot/include/zircon/device/ioctl-wrapper.h b/arch/arm64/sysroot/include/zircon/device/ioctl-wrapper.h
deleted file mode 100644
index 81a1286..0000000
--- a/arch/arm64/sysroot/include/zircon/device/ioctl-wrapper.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <zircon/compiler.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-__BEGIN_CDECLS
-
-extern ssize_t fdio_ioctl(int fd, int op, const void* in_buf, size_t in_len, void* out_buf, size_t out_len);
-
-#define IOCTL_WRAPPER(name, op) \
-static inline ssize_t name(int fd) {             \
-    return fdio_ioctl(fd, op, NULL, 0, NULL, 0); \
-}
-
-#define IOCTL_WRAPPER_IN(name, op, type) \
-static inline ssize_t name(int fd, const type* in) {     \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, NULL, 0); \
-}
-
-#define IOCTL_WRAPPER_VARIN(name, op, type) \
-static inline ssize_t name(int fd, const type* in, size_t in_len) { \
-    return fdio_ioctl(fd, op, in, in_len, NULL, 0);                  \
-}
-
-#define IOCTL_WRAPPER_OUT(name, op, type) \
-static inline ssize_t name(int fd, type* out) {            \
-    return fdio_ioctl(fd, op, NULL, 0, out, out ? sizeof(*out) : 0); \
-}
-
-#define IOCTL_WRAPPER_VAROUT(name, op, type) \
-static inline ssize_t name(int fd, type* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, NULL, 0, out, out_len);           \
-}
-
-#define IOCTL_WRAPPER_INOUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, outtype* out) { \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, out, out ? sizeof(*out) : 0);   \
-}
-
-#define IOCTL_WRAPPER_VARIN_OUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, size_t in_len, outtype* out) { \
-    return fdio_ioctl(fd, op, in, in_len, out, out ? sizeof(*out) : 0);                       \
-}
-
-#define IOCTL_WRAPPER_IN_VAROUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, outtype* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, out, out_len);                        \
-}
-
-#define IOCTL_WRAPPER_VARIN_VAROUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, size_t in_len, outtype* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, in, in_len, out, out_len);                                            \
-}
-
-__END_CDECLS
diff --git a/arch/arm64/sysroot/include/zircon/device/ioctl.h b/arch/arm64/sysroot/include/zircon/device/ioctl.h
deleted file mode 100644
index 7df5529..0000000
--- a/arch/arm64/sysroot/include/zircon/device/ioctl.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-// DEFAULT ioctls accept and received byte[] data
-// the particular ioctl may define more specific structures
-#define IOCTL_KIND_DEFAULT          0x0
-
-// GET_HANDLE ioctls accept plain data and return
-// a single handle, optionally followed by plain data
-#define IOCTL_KIND_GET_HANDLE       0x1
-
-// GET_TWO_HANDLES ioctls accept plain data and return
-// two handles, optionally followed by plain data
-#define IOCTL_KIND_GET_TWO_HANDLES  0x2
-
-// GET_THREE_HANDLES ioctls accept plain data and return
-// three handles, optionally followed by plain data
-#define IOCTL_KIND_GET_THREE_HANDLES 0x4
-
-// SET_HANDLE ioctls accept a handle, and optionally
-// plain data afterwards.
-#define IOCTL_KIND_SET_HANDLE       0x3
-
-// SET_TWO_HANDLES ioctls accepts two handles, and
-// optionally plain data afterwards.
-#define IOCTL_KIND_SET_TWO_HANDLES  0x5
-
-// core device/vfs ioctl families
-#define IOCTL_FAMILY_RESERVED       0x00
-#define IOCTL_FAMILY_DEVICE         0x01
-#define IOCTL_FAMILY_VFS            0x02
-#define IOCTL_FAMILY_DMCTL          0x03
-#define IOCTL_FAMILY_TEST           0x04
-
-// device protocol families
-#define IOCTL_FAMILY_CONSOLE        0x10
-#define IOCTL_FAMILY_INPUT          0x11
-// 0x12 unused
-#define IOCTL_FAMILY_BLOCK          0x13
-#define IOCTL_FAMILY_I2C            0x14
-#define IOCTL_FAMILY_USB_DEVICE     0x16
-#define IOCTL_FAMILY_HID            0x17
-// 0x18 unused
-#define IOCTL_FAMILY_AUDIO          0x19
-#define IOCTL_FAMILY_MIDI           0x1A
-#define IOCTL_FAMILY_KTRACE         0x1B
-#define IOCTL_FAMILY_BT_HCI         0x1C
-#define IOCTL_FAMILY_SYSINFO        0x1D
-// 0x1E unused
-#define IOCTL_FAMILY_RTC            0x1F  // ioctls for RTC
-#define IOCTL_FAMILY_ETH            0x20
-#define IOCTL_FAMILY_INSNTRACE      0x21  // ioctls for instruction tracing
-#define IOCTL_FAMILY_RAMDISK        0x22
-#define IOCTL_FAMILY_SDMMC          0x23
-#define IOCTL_FAMILY_WLAN           0x24
-#define IOCTL_FAMILY_PTY            0x25
-#define IOCTL_FAMILY_NETCONFIG      0x26
-#define IOCTL_FAMILY_ETHERTAP       0x27
-#define IOCTL_FAMILY_USB_PERIPHERAL 0x28
-#define IOCTL_FAMILY_USB_VIRT_BUS   0x29
-#define IOCTL_FAMILY_CPUPERF        0x2A
-#define IOCTL_FAMILY_POWER          0x30
-#define IOCTL_FAMILY_THERMAL        0x31
-#define IOCTL_FAMILY_CAMERA         0x32
-#define IOCTL_FAMILY_BT_HOST        0x33
-#define IOCTL_FAMILY_WLANPHY        0x34
-#define IOCTL_FAMILY_SERIAL         0x35
-#define IOCTL_FAMILY_WLANTAP        0x36
-#define IOCTL_FAMILY_DISPLAY_CONTROLLER 0x37
-#define IOCTL_FAMILY_DEBUG          0x38
-#define IOCTL_FAMILY_AUDIO_CODEC    0x39
-#define IOCTL_FAMILY_BACKLIGHT      0x3A
-#define IOCTL_FAMILY_NAND_TEST      0x3B
-#define IOCTL_FAMILY_TEE            0x3C
-#define IOCTL_FAMILY_SKIP_BLOCK     0x3D
-#define IOCTL_FAMILY_USB_TEST       0x3E
-#define IOCTL_FAMILY_CLK            0x3F
-// 0x40 unused.
-#define IOCTL_FAMILY_QMI            0x41
-
-// IOCTL constructor
-// --K-FFNN
-#define IOCTL(kind, family, number) \
-    ((((kind) & 0xF) << 20) | (((family) & 0xFF) << 8) | ((number) & 0xFF))
-
-// IOCTL accessors
-#define IOCTL_KIND(n) (((n) >> 20) & 0xF)
-#define IOCTL_FAMILY(n) (((n) >> 8) & 0xFF)
-#define IOCTL_NUMBER(n) ((n) & 0xFF)
diff --git a/arch/arm64/sysroot/include/zircon/device/ramdisk.h b/arch/arm64/sysroot/include/zircon/device/ramdisk.h
deleted file mode 100644
index dac72b9..0000000
--- a/arch/arm64/sysroot/include/zircon/device/ramdisk.h
+++ /dev/null
@@ -1,83 +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.
-
-#pragma once
-
-#include <limits.h>
-#include <zircon/boot/image.h>
-#include <zircon/device/ioctl.h>
-#include <zircon/device/ioctl-wrapper.h>
-#include <zircon/types.h>
-
-#define IOCTL_RAMDISK_CONFIG \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 1)
-#define IOCTL_RAMDISK_CONFIG_VMO \
-    IOCTL(IOCTL_KIND_SET_HANDLE, IOCTL_FAMILY_RAMDISK, 4)
-#define IOCTL_RAMDISK_UNLINK \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 2)
-#define IOCTL_RAMDISK_SET_FLAGS \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 3)
-#define IOCTL_RAMDISK_WAKE_UP \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 4)
-#define IOCTL_RAMDISK_SLEEP_AFTER \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 5)
-#define IOCTL_RAMDISK_GET_BLK_COUNTS \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 6)
-
-// Ramdisk-specific flags
-#define RAMDISK_FLAG_RESUME_ON_WAKE 0xFF000001
-
-typedef struct ramdisk_ioctl_config {
-    uint64_t blk_size;
-    uint64_t blk_count;
-    uint8_t type_guid[ZBI_PARTITION_GUID_LEN];
-} ramdisk_ioctl_config_t;
-
-typedef struct ramdisk_ioctl_config_response {
-    char name[NAME_MAX + 1];
-} ramdisk_ioctl_config_response_t;
-
-typedef struct ramdisk_blk_counts {
-    uint64_t received;
-    uint64_t successful;
-    uint64_t failed;
-} ramdisk_blk_counts_t;
-
-// ssize_t ioctl_ramdisk_config(int fd, const ramdisk_ioctl_config_t* in,
-//                              ramdisk_ioctl_config_response_t* out);
-IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config, IOCTL_RAMDISK_CONFIG, ramdisk_ioctl_config_t,
-                    ramdisk_ioctl_config_response_t);
-
-// ssize_t ioctl_ramdisk_config_vmo(int fd, const zx_handle_t* in,
-//                                  ramdisk_ioctl_config_response_t* out);
-IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config_vmo, IOCTL_RAMDISK_CONFIG_VMO,
-                    zx_handle_t, ramdisk_ioctl_config_response_t);
-
-// ssize_t ioctl_ramdisk_unlink(int fd);
-IOCTL_WRAPPER(ioctl_ramdisk_unlink, IOCTL_RAMDISK_UNLINK);
-
-// ssize_t ioctl_ramdisk_set_flags(int fd, uint32_t* in);
-// The flags to set match block_info_t.flags. This is intended to simulate the behavior
-// of other block devices, so it should be used only for tests.
-IOCTL_WRAPPER_IN(ioctl_ramdisk_set_flags, IOCTL_RAMDISK_SET_FLAGS, uint32_t);
-
-// ssize_t ioctl_ramdisk_wake_up(int fd);
-// "Wakes" the ramdisk, if it was sleeping.
-// Transactions are no longer expected to fail after this point, and the ramdisk will not sleep
-// again until the next call to SLEEP_AFTER.
-// This will reset the current transaction count.
-IOCTL_WRAPPER(ioctl_ramdisk_wake_up, IOCTL_RAMDISK_WAKE_UP);
-
-// ssize_t ioctl_ramdisk_sleep_after(int fd, uint64_t* in);
-// Tell the ramdisk to "sleep" after |in| blocks have been written successfully.
-// After this point, all incoming transactions will fail.
-// This will reset the current block count.
-// NOTE! Use caution with RAMDISK_FLAG_RESUME_ON_WAKE set; sleeping with this flags will cause I/O
-// to block indefinitely until another call invokes |ioctl_ramdisk_wake_up|.
-IOCTL_WRAPPER_IN(ioctl_ramdisk_sleep_after, IOCTL_RAMDISK_SLEEP_AFTER, uint64_t);
-
-// ssize_t ioctl_ramdisk_get_blk_counts(int fd, ramdisk_blk_counts_t* out);
-// Retrieve the number of received, successful, and failed block writes since the last call to
-// sleep/wake.
-IOCTL_WRAPPER_OUT(ioctl_ramdisk_get_blk_counts, IOCTL_RAMDISK_GET_BLK_COUNTS, ramdisk_blk_counts_t);
diff --git a/arch/arm64/sysroot/include/zircon/dlfcn.h b/arch/arm64/sysroot/include/zircon/dlfcn.h
index af4a62b..f37e9be 100644
--- a/arch/arm64/sysroot/include/zircon/dlfcn.h
+++ b/arch/arm64/sysroot/include/zircon/dlfcn.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_DLFCN_H_
+#define SYSROOT_ZIRCON_DLFCN_H_
 
 #include <dlfcn.h>
 #include <zircon/compiler.h>
@@ -30,3 +31,5 @@
 zx_status_t dl_clone_loader_service(zx_handle_t* out);
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_DLFCN_H_
diff --git a/arch/arm64/sysroot/include/zircon/driver/binding.h b/arch/arm64/sysroot/include/zircon/driver/binding.h
deleted file mode 100644
index 7c05026..0000000
--- a/arch/arm64/sysroot/include/zircon/driver/binding.h
+++ /dev/null
@@ -1,286 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <assert.h>
-#include <zircon/compiler.h>
-#include <stdalign.h>
-#include <stddef.h>
-#include <stdint.h>
-
-__BEGIN_CDECLS;
-
-// COAABBBB VVVVVVVV  Condition Opcode paramA paramB Value
-
-#define OP_ABORT  0x0 // if (cond) return no-match
-#define OP_MATCH  0x1 // if (cond) return match
-#define OP_GOTO   0x2 // if (cond) advance to next LABEL(paramA)
-#define OP_SET    0x3 // if (cond) flags |= paramA
-#define OP_CLEAR  0x4 // if (cond) flags &= (~paramA)
-#define OP_LABEL  0x5 // no-op, labels line with paramA
-
-#define COND_AL   0x0 // true
-#define COND_EQ   0x1 // bind(paramB) == Value
-#define COND_NE   0x2 // bind(paramB) != Value
-#define COND_GT   0x3 // bind(paramB) > Value
-#define COND_LT   0x4 // bind(paramB) < Value
-#define COND_GE   0x5 // bind(paramB) >= Value
-#define COND_LE   0x6 // bind(paramB) <= Value
-#define COND_MASK 0x7 // (bind(paramB) & Value) != 0
-#define COND_BITS 0x8 // (bind(paramB) & Value) == Value
-
-// branches are forward-only
-// branches always go to the first matching LABEL
-// branches that cannot find a matching LABEL are treated as ABORTs
-// there is an implied unconditional ABORT after the last instruction
-// flags are initially zero, may be set/cleared with SET/CLEAR
-// flags may be tested by comparison against BIND_FLAGS
-
-#define BINDINST(c,o,a,b,v) \
-    { (((c)&0xF)<<28)|(((o)&0xF)<<24)|(((a)&0xFF)<<16)|((b)&0xFFFF),(v) }
-
-#define BINDINST_CC(n) ((n) >> 28)
-#define BINDINST_OP(n) (((n) >> 24) & 0xF)
-#define BINDINST_PA(n) (((n) >> 16) & 0xFF)
-#define BINDINST_PB(n) ((n) & 0xFFFF)
-
-#define BI_ABORT()            BINDINST(COND_AL,OP_ABORT,0,0,0)
-#define BI_MATCH()            BINDINST(COND_AL,OP_MATCH,0,0,0)
-#define BI_GOTO(n)            BINDINST(COND_AL,OP_GOTO,n,0,0)
-#define BI_SET(f)             BINDINST(COND_AL,OP_SET,f,0,0)
-#define BI_CLEAR(f)           BINDINST(COND_AL,OP_CLEAR,f,0,0)
-#define BI_LABEL(n)           BINDINST(COND_AL,OP_LABEL,n,0,0)
-
-#define BI_ABORT_IF(c,b,v)    BINDINST(COND_##c,OP_ABORT,0,b,v)
-#define BI_MATCH_IF(c,b,v)    BINDINST(COND_##c,OP_MATCH,0,b,v)
-#define BI_GOTO_IF(c,b,v,n)   BINDINST(COND_##c,OP_GOTO,n,b,v)
-#define BI_SET_IF(c,b,v,f)    BINDINST(COND_##c,OP_SET,f,b,v)
-#define BI_CLEAR_IF(c,b,v,f)  BINDINST(COND_##c,OP_CLEAR,f,b,v)
-
-// for drivers that only want to be bound on user request
-#define BI_ABORT_IF_AUTOBIND  BI_ABORT_IF(NE, BIND_AUTOBIND, 0)
-
-// global binding variables at 0x00XX
-#define BIND_FLAGS            0x0000 // value of the flags register
-#define BIND_PROTOCOL         0x0001 // primary protcol of the device
-#define BIND_AUTOBIND         0x0002 // if this is an automated bind/load
-
-// pci binding variables at 0x01XX
-#define BIND_PCI_VID          0x0100
-#define BIND_PCI_DID          0x0101
-#define BIND_PCI_CLASS        0x0102
-#define BIND_PCI_SUBCLASS     0x0103
-#define BIND_PCI_INTERFACE    0x0104
-#define BIND_PCI_REVISION     0x0105
-#define BIND_PCI_BDF_ADDR     0x0106
-
-// pci binding variable utils
-#define BIND_PCI_BDF_PACK(bus, dev, func) \
-    ((((uint32_t)(bus)  & 0xFF) << 8) |   \
-     (((uint32_t)(dev)  & 0x1F) << 3) |   \
-      ((uint32_t)(func) & 0x07))
-
-#define BIND_PCI_BDF_UNPACK_BUS(bdf) (((uint32_t)(bdf) >> 8) & 0xFF)
-#define BIND_PCI_BDF_UNPACK_DEV(bdf) (((uint32_t)(bdf) >> 3) & 0x1F)
-#define BIND_PCI_BDF_UNPACK_FUNC(bdf) ((uint32_t)(bdf) & 0x07)
-
-// usb binding variables at 0x02XX
-// these are used for both ZX_PROTOCOL_USB and ZX_PROTOCOL_USB_FUNCTION
-#define BIND_USB_VID          0x0200
-#define BIND_USB_PID          0x0201
-#define BIND_USB_CLASS        0x0202
-#define BIND_USB_SUBCLASS     0x0203
-#define BIND_USB_PROTOCOL     0x0204
-
-// Platform bus binding variables at 0x03XX
-#define BIND_PLATFORM_DEV_VID 0x0300
-#define BIND_PLATFORM_DEV_PID 0x0301
-#define BIND_PLATFORM_DEV_DID 0x0302
-#define BIND_PLATFORM_PROTO   0x0303
-
-// ACPI binding variables at 0x04XX
-// The _HID is a 7- or 8-byte string. Because a bind property is 32-bit, use 2
-// properties to bind using the _HID. They are encoded in big endian order for
-// human readability. In the case of 7-byte _HID's, the 8th-byte shall be 0.
-#define BIND_ACPI_HID_0_3      0x0400 // char 0-3
-#define BIND_ACPI_HID_4_7      0x0401 // char 4-7
-// The _CID may be a valid HID value or a bus-specific string. The ACPI bus
-// driver only publishes those that are valid HID values.
-#define BIND_ACPI_CID_0_3      0x0402 // char 0-3
-#define BIND_ACPI_CID_4_7      0x0403 // char 4-7
-
-// Intel HDA Codec binding variables at 0x05XX
-#define BIND_IHDA_CODEC_VID         0x0500
-#define BIND_IHDA_CODEC_DID         0x0501
-#define BIND_IHDA_CODEC_MAJOR_REV   0x0502
-#define BIND_IHDA_CODEC_MINOR_REV   0x0503
-#define BIND_IHDA_CODEC_VENDOR_REV  0x0504
-#define BIND_IHDA_CODEC_VENDOR_STEP 0x0505
-
-// Serial binding variables at 0x06XX
-#define BIND_SERIAL_CLASS           0x0600
-#define BIND_SERIAL_VID             0x0601
-#define BIND_SERIAL_PID             0x0602
-
-// NAND binding variables at 0x07XX
-#define BIND_NAND_CLASS             0x0700
-
-// Bluetooth binding variables at 0x08XX
-#define BIND_BT_GATT_SVC_UUID16     0x0800
-// 128-bit UUID is split across 4 32-bit unsigned ints
-#define BIND_BT_GATT_SVC_UUID128_1     0x0801
-#define BIND_BT_GATT_SVC_UUID128_2     0x0802
-#define BIND_BT_GATT_SVC_UUID128_3     0x0803
-#define BIND_BT_GATT_SVC_UUID128_4     0x0804
-
-// SDIO binding variables at 0x09XX
-#define BIND_SDIO_VID             0x0900
-#define BIND_SDIO_PID             0x0901
-
-// I2C binding variables at 0x0AXX
-#define BIND_I2C_CLASS            0x0A00
-
-// TEMPORARY binding variables at 0xfXX
-// I2C_ADDR is a temporary way to bind the i2c touchscreen on the Acer12. This
-// binding will eventually be made via some sort of ACPI device enumeration.
-#define BIND_I2C_ADDR         0x0f00
-
-typedef struct zx_bind_inst {
-    uint32_t op;
-    uint32_t arg;
-} zx_bind_inst_t;
-
-typedef struct zx_device_prop {
-    uint16_t id;
-    uint16_t reserved;
-    uint32_t value;
-} zx_device_prop_t;
-
-// simple example
-#if 0
-zx_bind_inst_t i915_binding[] = {
-    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_PCI),
-    BI_ABORT_IF(NE, BIND_PCI_VID, 0x8086),
-    BI_MATCH_IF(EQ, BIND_PCI_DID, 0x1616), // broadwell
-    BI_MATCH_IF(EQ, BIND_PCI_DID, 0x1916), // skylake
-    BI_ABORT(),
-};
-#endif
-
-#define ZIRCON_NOTE_NAME "Zircon"
-#define ZIRCON_NOTE_DRIVER 0x31565244 // DRV1
-
-typedef struct {
-    // Elf64_Nhdr fields:
-    uint32_t namesz;
-    uint32_t descsz;
-    uint32_t type;
-    // ELF note name.  namesz is the exact size of the name (including '\0'),
-    // but the storage size is always rounded up to a multiple of 4 bytes.
-    char name[(sizeof(ZIRCON_NOTE_NAME) + 3) & -4];
-} zircon_driver_note_header_t;
-
-#define ZIRCON_DRIVER_NOTE_HEADER_INIT(object) {        \
-        /* .namesz = */ sizeof(ZIRCON_NOTE_NAME),              \
-        /* .descsz = */ (sizeof(object) -                       \
-                         sizeof(zircon_driver_note_header_t)), \
-        /* .type = */ ZIRCON_NOTE_DRIVER,                      \
-        /* .name = */ ZIRCON_NOTE_NAME,                        \
-    }
-
-typedef struct {
-    // See flag bits below.
-    uint32_t flags;
-
-    // Driver Metadata
-    uint32_t bindcount;
-    uint32_t reserved0;
-    char name[32];
-    char vendor[16];
-    char version[16];
-
-    // Driver Bind Program follows
-} zircon_driver_note_payload_t;
-
-// Flag bits in the driver note:
-
-// Driver is built with `-fsanitize=address` and can only be loaded into a
-// devhost that supports the ASan runtime.
-#define ZIRCON_DRIVER_NOTE_FLAG_ASAN (1u << 0)
-
-#define ZIRCON_DRIVER_NOTE_PAYLOAD_INIT(Driver,VendorName,Version,BindCount) \
-    {                                                               \
-        /* .flags = */ ZIRCON_DRIVER_NOTE_FLAGS,                    \
-        /* .bindcount = */ (BindCount),                             \
-        /* .reserved0 = */ 0,                                       \
-        /* .name = */ #Driver,                                      \
-        /* .vendor = */ VendorName,                                 \
-        /* .version = */ Version,                                   \
-    }
-
-#define ZIRCON_DRIVER_NOTE_FLAGS \
-    (__has_feature(address_sanitizer) ? ZIRCON_DRIVER_NOTE_FLAG_ASAN : 0)
-
-typedef struct {
-    zircon_driver_note_header_t header;
-    zircon_driver_note_payload_t payload;
-} zircon_driver_note_t;
-
-static_assert(offsetof(zircon_driver_note_t, payload) ==
-              sizeof(zircon_driver_note_header_t),
-              "alignment snafu?");
-
-// Without this, ASan will add redzone padding after the object, which
-// would make it invalid ELF note format.
-#if __has_feature(address_sanitizer)
-# define ZIRCON_DRIVER_NOTE_ASAN __attribute__((no_sanitize("address")))
-#else
-# define ZIRCON_DRIVER_NOTE_ASAN
-#endif
-
-// GCC has a quirk about how '__attribute__((visibility("default")))'
-// (__EXPORT here) works for const variables in C++.  The attribute has no
-// effect when used on the definition of a const variable, and GCC gives a
-// warning/error about that.  The attribute must appear on the "extern"
-// declaration of the variable instead.
-
-// We explicitly align the note to 4 bytes.  That's its natural alignment
-// anyway, but the compilers sometimes like to over-align as an
-// optimization while other tools sometimes like to complain if SHT_NOTE
-// sections are over-aligned (since this could result in padding being
-// inserted that makes it violate the ELF note format).  Standard C11
-// doesn't permit alignas(...) on a type but we could use __ALIGNED(4) on
-// all the types (i.e. GNU __attribute__ syntax instead of C11 syntax).
-// But the alignment of the types is not actually the issue: it's the
-// compiler deciding to over-align the individual object regardless of its
-// type's alignment, so we have to explicitly set the alignment of the
-// object to defeat any compiler default over-alignment.
-
-#define ZIRCON_DRIVER_BEGIN(Driver,Ops,VendorName,Version,BindCount) \
-zx_driver_rec_t __zircon_driver_rec__ __EXPORT = {\
-    /* .ops = */ &(Ops),\
-    /* .driver = */ NULL,\
-    /* .log_flags = */ 7, /* DDK_LOG_ERROR | DDK_LOG_WARN | DDK_LOG_INFO */\
-};\
-extern const struct zircon_driver_note __zircon_driver_note__ __EXPORT;\
-alignas(4) __SECTION(".note.zircon.driver." #Driver) ZIRCON_DRIVER_NOTE_ASAN \
-const struct zircon_driver_note {\
-    zircon_driver_note_t note;\
-    zx_bind_inst_t binding[BindCount];\
-} __zircon_driver_note__ = {\
-    /* .note = */{\
-        ZIRCON_DRIVER_NOTE_HEADER_INIT(__zircon_driver_note__),\
-        ZIRCON_DRIVER_NOTE_PAYLOAD_INIT(Driver,VendorName,Version,BindCount),\
-    },\
-    /* .binding = */ {
-
-#define ZIRCON_DRIVER_END(Driver) }};
-
-//TODO: if we moved the Ops from the BEGIN() to END() macro we
-//      could add a zircon_driver_note_t* to the zx_driver_rec_t,
-//      define it in END(), and have only one symbol to dlsym()
-//      when loading drivers
-
-__END_CDECLS;
diff --git a/arch/arm64/sysroot/include/zircon/errors.h b/arch/arm64/sysroot/include/zircon/errors.h
index 1c1ed80..390acfb 100644
--- a/arch/arm64/sysroot/include/zircon/errors.h
+++ b/arch/arm64/sysroot/include/zircon/errors.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_ERRORS_H_
+#define SYSROOT_ZIRCON_ERRORS_H_
 
 // Zircon statuses are signed 32 bit integers. The space of values is
 // divided as follows:
@@ -108,7 +109,6 @@
 // and should thus retry.
 #define ZX_ERR_UNAVAILABLE (-28)
 
-
 // ======= Permission check errors =======
 // ZX_ERR_ACCESS_DENIED: The caller did not have permission to perform
 // the specified operation.
@@ -229,3 +229,10 @@
 
 // ZX_ERR_CONNECTION_ABORTED: Connection was aborted.
 #define ZX_ERR_CONNECTION_ABORTED (-76)
+
+// ======= VDSO-private errors =======
+
+// ZX_ERR_INTERNAL_INTR_KILLED: A task was killed during an operation.
+#define ZX_ERR_INTERNAL_INTR_KILLED (-502)
+
+#endif  // SYSROOT_ZIRCON_ERRORS_H_
diff --git a/arch/arm64/sysroot/include/zircon/exception.h b/arch/arm64/sysroot/include/zircon/exception.h
new file mode 100644
index 0000000..bf3843b
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/exception.h
@@ -0,0 +1,19 @@
+// Copyright 2019 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.
+
+#pragma once
+
+#include <zircon/syscalls/exception.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+__EXPORT const char* _zx_exception_get_string(zx_excp_type_t exception);
+__EXPORT const char* zx_exception_get_string(zx_excp_type_t exception);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/arch/arm64/sysroot/include/zircon/features.h b/arch/arm64/sysroot/include/zircon/features.h
index a560007..d0c0720 100644
--- a/arch/arm64/sysroot/include/zircon/features.h
+++ b/arch/arm64/sysroot/include/zircon/features.h
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_FEATURES_H_
-#define ZIRCON_FEATURES_H_
+#ifndef SYSROOT_ZIRCON_FEATURES_H_
+#define SYSROOT_ZIRCON_FEATURES_H_
 
 // clang-format off
 
 // types of features that can be retrieved via |zx_system_get_features|
-#define ZX_FEATURE_KIND_CPU ((uint32_t)0)
+#define ZX_FEATURE_KIND_CPU                   ((uint32_t)0)
+#define ZX_FEATURE_KIND_HW_BREAKPOINT_COUNT   ((uint32_t)1)
+#define ZX_FEATURE_KIND_HW_WATCHPOINT_COUNT   ((uint32_t)2)
 
 // arch-independent CPU features
 #define ZX_HAS_CPU_FEATURES            ((uint32_t)(1u << 0))
@@ -35,6 +37,9 @@
 #define ZX_ARM64_FEATURE_ISA_SM4       ((uint32_t)(1u << 12))
 #define ZX_ARM64_FEATURE_ISA_DP        ((uint32_t)(1u << 13))
 #define ZX_ARM64_FEATURE_ISA_DPB       ((uint32_t)(1u << 14))
+#define ZX_ARM64_FEATURE_ISA_FHM       ((uint32_t)(1u << 15))
+#define ZX_ARM64_FEATURE_ISA_TS        ((uint32_t)(1u << 16))
+#define ZX_ARM64_FEATURE_ISA_RNDR      ((uint32_t)(1u << 17))
 
 #else
 
@@ -42,4 +47,4 @@
 
 #endif
 
-#endif // ZIRCON_FEATURES_H_
+#endif // SYSROOT_ZIRCON_FEATURES_H_
diff --git a/arch/arm64/sysroot/include/zircon/fidl.h b/arch/arm64/sysroot/include/zircon/fidl.h
index e971472..7388729 100644
--- a/arch/arm64/sysroot/include/zircon/fidl.h
+++ b/arch/arm64/sysroot/include/zircon/fidl.h
@@ -2,20 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_FIDL_H_
-#define ZIRCON_FIDL_H_
+#ifndef SYSROOT_ZIRCON_FIDL_H_
+#define SYSROOT_ZIRCON_FIDL_H_
 
-#include <assert.h>
-#include <stdalign.h>
-#include <stdint.h>
-
+#include <assert.h>    // NOLINT(modernize-deprecated-headers, foobar)
+#include <stdalign.h>  // NOLINT(modernize-deprecated-headers)
+#include <stdint.h>    // NOLINT(modernize-*)
 #include <zircon/compiler.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
 // Fidl data types have a representation in a wire format. This wire
-// format is shared by all language bindings, including C11 and C++14.
+// format is shared by all language bindings, including C11 and C++.
 //
 // The C bindings also define a representation of fidl data types. For
 // a given type, the size and alignment of all parts of the type agree
@@ -55,12 +54,21 @@
 #define FIDL_ALLOC_ABSENT ((uintptr_t)0)
 
 // Out of line allocations are all 8 byte aligned.
+// TODO(fxbug.dev/42792): Remove either this FIDL_ALIGN macro or the FidlAlign function in
+// fidl/internal.h.
 #define FIDL_ALIGNMENT ((size_t)8)
-#define FIDL_ALIGN(a) (((a) + 7) & ~7)
+#define FIDL_ALIGN(a) (((a) + 7u) & ~7u)
 #define FIDL_ALIGNDECL alignas(FIDL_ALIGNMENT)
 
-// An opaque struct representing the encoding of a particular fidl
-// type.
+// The maximum depth of out-of-line objects in the wire format.
+// 0 is the initial depth, 1 is the first out of line object, etc.
+// Tables count as two depth levels because the vector body and the
+// table elements are both out of line.
+#define FIDL_MAX_DEPTH 32
+
+// An opaque struct containing metadata for encoding a particular fidl
+// type. The actual length of the struct is different depending on the
+// kind of fidl type it is describing.
 typedef struct fidl_type fidl_type_t;
 
 // Primitive types.
@@ -119,11 +127,11 @@
 // but is checked as part of validation.
 
 typedef struct fidl_string {
-    // Number of UTF-8 code units (bytes), must be 0 if |data| is null.
-    uint64_t size;
+  // Number of UTF-8 code units (bytes), must be 0 if |data| is null.
+  uint64_t size;
 
-    // Pointer to UTF-8 code units (bytes) or null
-    char* data;
+  // Pointer to UTF-8 code units (bytes) or null
+  char* data;
 } fidl_string_t;
 
 // When encoded, an absent nullable string is represented as a
@@ -169,11 +177,11 @@
 // but is checked as part of validation.
 
 typedef struct fidl_vector {
-    // Number of elements, must be 0 if |data| is null.
-    uint64_t count;
+  // Number of elements, must be 0 if |data| is null.
+  uint64_t count;
 
-    // Pointer to element data or null.
-    void* data;
+  // Pointer to element data or null.
+  void* data;
 } fidl_vector_t;
 
 // When encoded, an absent nullable vector is represented as a
@@ -193,6 +201,42 @@
 // vector<T>:N   fidl_vector_t  A vector of T, up to N elements.
 // vector<T>:N?  fidl_vector_t  An optional vector of T,  up to N elements.
 
+// Envelope.
+
+// An efficient way to encapsulate uninterpreted FIDL messages.
+// - Stores a variable size uninterpreted payload out-of-line.
+// - Payload may contain an arbitrary number of bytes and handles.
+// - Allows for encapsulation of one FIDL message inside of another.
+// - Building block for extensible structures such as tables & extensible
+//   unions.
+
+// When encoded for transfer, |data| indicates presence of content:
+// - FIDL_ALLOC_ABSENT : envelope is null
+// - FIDL_ALLOC_PRESENT : envelope is non-null, |data| is the next out-of-line object
+// When decoded for consumption, |data| is a pointer to content.
+// - nullptr : envelope is null
+// - <valid pointer> : envelope is non-null, |data| is at indicated memory address
+
+typedef struct {
+  // The size of the entire envelope contents, including any additional
+  // out-of-line objects that the envelope may contain. For example, a
+  // vector<string>'s num_bytes for ["hello", "world"] would include the
+  // string contents in the size, not just the outer vector. Always a multiple
+  // of 8; must be zero if envelope is null.
+  uint32_t num_bytes;
+
+  // The number of handles in the envelope, including any additional
+  // out-of-line objects that the envelope contains. Must be zero if envelope is null.
+  uint32_t num_handles;
+
+  // A pointer to the out-of-line envelope data in decoded form, or
+  // FIDL_ALLOC_(ABSENT|PRESENT) in encoded form.
+  union {
+    void* data;
+    uintptr_t presence;
+  };
+} fidl_envelope_t;
+
 // Handle types.
 
 // Handle types are encoded directly. Just like primitive types, there
@@ -278,16 +322,53 @@
 //                                                   union_foo, or else
 //                                                   FIDL_ALLOC_ABSENT.
 
+// Tables.
+
+// Tables are 'flexible structs', where all members are optional, and new
+// members can be added, or old members removed while preserving ABI
+// compatibility. Each table member is referenced by ordinal, sequentially
+// assigned from 1 onward, with no gaps. Each member content is stored
+// out-of-line in an envelope, and a table is simply a vector of these envelopes
+// with the requirement that the last envelope must be present in order
+// to guarantee a canonical representation.
+
+typedef struct {
+  fidl_vector_t envelopes;
+} fidl_table_t;
+
+// Extensible unions.
+
+// Extensible unions, or "xunions" (colloquially pronounced "zoo-nions") are
+// similar to unions, except that storage for union members are out-of-line
+// rather than inline. This enables union members to be added and removed while
+// preserving ABI compatibility with the existing xunion definition.
+
+typedef uint64_t fidl_xunion_tag_t;
+
+enum {
+  kFidlXUnionEmptyTag = 0,  // The tag representing an empty xunion.
+};
+
+typedef struct {
+  fidl_xunion_tag_t tag;
+  fidl_envelope_t envelope;
+} fidl_xunion_t;
+
 // Messages.
 
 // All fidl messages share a common 16 byte header.
 
+enum {
+  kFidlWireFormatMagicNumberInitial = 1,
+};
+
 typedef struct fidl_message_header {
-    zx_txid_t txid;
-    // This reserved word is used by Epitaphs to represent an error value.
-    uint32_t reserved0;
-    uint32_t flags;
-    uint32_t ordinal;
+  zx_txid_t txid;
+  uint8_t flags[3];
+  // This value indicates the message's wire format. Two sides with different
+  // wire formats are incompatible with each other
+  uint8_t magic_number;
+  uint64_t ordinal;
 } fidl_message_header_t;
 
 // Messages which do not have a response use zero as a special
@@ -295,46 +376,65 @@
 
 #define FIDL_TXID_NO_RESPONSE 0ul
 
-// The system reserves the high half of the ordinal space.
+// An outgoing FIDL message.
+typedef struct fidl_outgoing_msg {
+  // The bytes of the message.
+  //
+  // The bytes of the message might be in the encoded or decoded form.
+  // Functions that take a |fidl_outgoing_msg_t| as an argument should document whether
+  // the expect encoded or decoded messages.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  void* bytes;
 
-#define FIDL_ORD_SYSTEM_MASK 0x80000000ul
+  // The handles of the message.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  zx_handle_t* handles;
 
-// A FIDL message.
-typedef struct fidl_msg {
-    // The bytes of the message.
-    //
-    // The bytes of the message might be in the encoded or decoded form.
-    // Functions that take a |fidl_msg_t| as an argument should document whether
-    // the expect encoded or decoded messages.
-    //
-    // See |num_bytes| for the number of bytes in the message.
-    void* bytes;
+  // The number of bytes in |bytes|.
+  uint32_t num_bytes;
 
-    // The handles of the message.
-    //
-    // See |num_bytes| for the number of bytes in the message.
-    zx_handle_t* handles;
+  // The number of handles in |handles|.
+  uint32_t num_handles;
+} fidl_outgoing_msg_t;
 
-    // The number of bytes in |bytes|.
-    uint32_t num_bytes;
+// An incoming FIDL message.
+typedef struct fidl_incoming_msg {
+  // The bytes of the message.
+  //
+  // The bytes of the message might be in the encoded or decoded form.
+  // Functions that take a |fidl_incoming_msg_t| as an argument should document whether
+  // the expect encoded or decoded messages.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  void* bytes;
 
-    // The number of handles in |handles|.
-    uint32_t num_handles;
-} fidl_msg_t;
+  // The handles of the message.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  zx_handle_t* handles;
+
+  // The number of bytes in |bytes|.
+  uint32_t num_bytes;
+
+  // The number of handles in |handles|.
+  uint32_t num_handles;
+} fidl_incoming_msg_t;
 
 // An outstanding FIDL transaction.
 typedef struct fidl_txn fidl_txn_t;
 struct fidl_txn {
-    // Replies to the outstanding request and complete the FIDL transaction.
-    //
-    // Pass the |fidl_txn_t| object itself as the first parameter. The |msg|
-    // should already be encoded. This function always consumes any handles
-    // present in |msg|.
-    //
-    // Call |reply| only once for each |txn| object. After |reply| returns, the
-    // |txn| object is considered invalid and might have been freed or reused
-    // for another purpose.
-    zx_status_t (*reply)(fidl_txn_t* txn, const fidl_msg_t* msg);
+  // Replies to the outstanding request and complete the FIDL transaction.
+  //
+  // Pass the |fidl_txn_t| object itself as the first parameter. The |msg|
+  // should already be encoded. This function always consumes any handles
+  // present in |msg|.
+  //
+  // Call |reply| only once for each |txn| object. After |reply| returns, the
+  // |txn| object is considered invalid and might have been freed or reused
+  // for another purpose.
+  zx_status_t (*reply)(fidl_txn_t* txn, const fidl_outgoing_msg_t* msg);
 };
 
 // An epitaph is a message that a server sends just prior to closing the
@@ -342,17 +442,22 @@
 // Epitaphs are defined in the FIDL wire format specification.  Once sent down
 // the wire, the channel should be closed.
 typedef struct fidl_epitaph {
-    FIDL_ALIGNDECL
+  FIDL_ALIGNDECL
 
-    // The error associated with this epitaph is stored in the reserved word of
-    // the message header.  System errors must be constants of type zx_status_t,
-    // which are all negative.  Positive numbers should be used for application
-    // errors.  A value of ZX_OK indicates no error.
-    fidl_message_header_t hdr;
+  // The method ordinal for all epitaphs must be kFidlOrdinalEpitaph
+  fidl_message_header_t hdr;
+
+  // The error associated with this epitaph is stored as a struct{int32} in
+  // the message payload. System errors must be constants of type zx_status_t,
+  // which are all negative. Positive numbers should be used for application
+  // errors. A value of ZX_OK indicates no error.
+  zx_status_t error;
 } fidl_epitaph_t;
 
 // This ordinal value is reserved for Epitaphs.
-#define FIDL_EPITAPH_ORDINAL 0xFFFFFFFF
+enum {
+  kFidlOrdinalEpitaph = 0xFFFFFFFFFFFFFFFF,
+};
 
 // Assumptions.
 
@@ -374,4 +479,4 @@
 
 __END_CDECLS
 
-#endif // ZIRCON_FIDL_H_
+#endif  // SYSROOT_ZIRCON_FIDL_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/debug/arm64.h b/arch/arm64/sysroot/include/zircon/hw/debug/arm64.h
new file mode 100644
index 0000000..b0b6ea3
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/debug/arm64.h
@@ -0,0 +1,278 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
+#define SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
+
+#include <stdint.h>
+
+// ARM64 Hardware Debug Resources
+// =================================================================================================
+
+// Hardware Breakpoints ----------------------------------------------------------------------------
+//
+// Hardware breakpoints permits to stop a thread when it executes an address setup in one of the
+// hw breakpoints registers. They will work independent whether the address in question is
+// read-only or not.
+
+// ARMv8 assures at least 2 hardware breakpoints.
+#define ARM64_MIN_HW_BREAKPOINTS 2
+#define ARM64_MAX_HW_BREAKPOINTS 16
+
+// Access macros:
+// All the relevant register fields are exposed through macros.
+// For convenience of use, use the get/set macros:
+//
+// uint64_t ARM64_<REG>_<FIELD>_GET(uint64_t reg)
+// void ARM64_<REG>_<FIELD>_SET(uint64_t* reg, uint64_t value)
+//
+// Examples:
+// uint64_t bas = ARM64_DBGBCR_BAS_GET(dbgbcr);
+// ARM64_DBGBCR_BAS_SET(&dbgbcr, modified_bas);
+
+// DBGBCR<n>: Debug Control Register for HW Breakpoint #n.
+//
+// Control register for HW breakpoints. There is one foreach HW breakpoint present within the
+// system. They go numbering by DBGBCR0, DBGBCR1, ... until the value defined in ID_AADFR0_EL1.
+//
+// For each control register, there is an equivalent DBGBVR<n> that holds the address the thread
+// will compare against.
+
+// The following fields are accepted by the user. All other fields are ignored (masked).
+//
+// - E
+
+// This mask is applied when to DBGBCR. Any set values on those fields will be overwritten.
+//
+// - PMC = 0b10
+// - BAS = 0b1111
+// - HMC = 0
+// - SSC = 0
+// - LBN = 0
+// - BT  = 0
+
+// Enable/disable the breakpoint.
+#define ARM64_DBGBCR_E 1lu  // Bit 0
+#define ARM64_DBGBCR_E_SHIFT 0u
+#define ARM64_DBGBCR_E_MASK (ARM64_DBGBCR_E << ARM64_DBGBCR_E_SHIFT)
+#define ARM64_DBGBCR_E_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_E_MASK, ARM64_DBGBCR_E_SHIFT)
+#define ARM64_DBGBCR_E_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_E_MASK, \
+                                          ARM64_DBGBCR_E_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_PMC 0b11lu  // Bits 1-2.
+#define ARM64_DBGBCR_PMC_SHIFT 1u
+#define ARM64_DBGBCR_PMC_MASK (ARM64_DBGBCR_PMC << ARM64_DBGBCR_PMC_SHIFT)
+#define ARM64_DBGBCR_PMC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_PMC_MASK, ARM64_DBGBCR_PMC_SHIFT)
+#define ARM64_DBGBCR_PMC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_PMC_MASK, \
+                                          ARM64_DBGBCR_PMC_SHIFT)
+
+// Byte Address Select. Defines which half-words triggers the breakpoint.
+// In AArch64 implementations (which zircon targets), is res1.
+#define ARM64_DBGBCR_BAS 0b1111lu  // Bits 5-8.
+#define ARM64_DBGBCR_BAS_SHIFT 5u
+#define ARM64_DBGBCR_BAS_MASK (ARM64_DBGBCR_BAS << ARM64_DBGBCR_BAS_SHIFT)
+#define ARM64_DBGBCR_BAS_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_BAS_MASK, ARM64_DBGBCR_BAS_SHIFT)
+#define ARM64_DBGBCR_BAS_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_BAS_MASK, \
+                                          ARM64_DBGBCR_BAS_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_HMC 0b1lu  // Bit 13.
+#define ARM64_DBGBCR_HMC_SHIFT 13u
+#define ARM64_DBGBCR_HMC_MASK (ARM64_DBGBCR_HMC << ARM64_DBGBCR_HMC_SHIFT)
+#define ARM64_DBGBCR_HMC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_HMC_MASK, ARM64_DBGBCR_HMC_SHIFT)
+#define ARM64_DBGBCR_HMC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_HMC_MASK, \
+                                          ARM64_DBGBCR_HMC_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_SSC 0b11lu  // Bits 14-15.
+#define ARM64_DBGBCR_SSC_SHIFT 14u
+#define ARM64_DBGBCR_SSC_MASK (ARM64_DBGBCR_SSC << ARM64_DBGBCR_SSC_SHIFT)
+#define ARM64_DBGBCR_SSC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_SSC_MASK, ARM64_DBGBCR_SSC_SHIFT)
+#define ARM64_DBGBCR_SSC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_SSC_MASK, \
+                                          ARM64_DBGBCR_SSC_SHIFT)
+
+// Linked Breakpoint Number. Zircon doesn't use this feature. Always zero.
+#define ARM64_DBGBCR_LBN 0b1111lu  // Bits 16-19.
+#define ARM64_DBGBCR_LBN_SHIFT 16u
+#define ARM64_DBGBCR_LBN_MASK (ARM64_DBGBCR_LBN << ARM64_DBGBCR_LBN_SHIFT)
+#define ARM64_DBGBCR_LBN_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_LBN_MASK, ARM64_DBGBCR_LBN_SHIFT)
+#define ARM64_DBGBCR_LBN_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_LBN_MASK, \
+                                          ARM64_DBGBCR_LBN_SHIFT)
+
+// Breakpoint Type. Zircon only uses unlinked address match (zero).
+#define ARM64_DBGBCR_BT 0b1111lu  // Bits 20-23.
+#define ARM64_DBGBCR_BT_SHIFT 20u
+#define ARM64_DBGBCR_BT_MASK (ARM64_DBGBCR_BT << ARM64_DBGBCR_BT_SHIFT)
+#define ARM64_DBGBCR_BT_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_BT_MASK, ARM64_DBGBCR_BT_SHIFT)
+#define ARM64_DBGBCR_BT_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_BT_MASK, \
+                                          ARM64_DBGBCR_BT_SHIFT)
+
+// Watchpoints ------------------------------------------------------------------------------------
+
+// Watchpoints permits to stop a thread when it read/writes to a particular address in memory.
+// This will work even if the address is read-only memory (for a read, of course).
+
+// ARMv8 assures at least 2 watchpoints.
+#define ARM64_MIN_HW_WATCHPOINTS 2
+#define ARM64_MAX_HW_WATCHPOINTS 16
+
+// DBGWCR<n>: Watchpoint Control Register.
+//
+// Control register for watchpoints. There is one for each watchpoint present within the system.
+// They go numbering by DBGWCR0, DBGWCR1, ... until the value defined ID_AAFR0_EL1.
+// For each control register, there is an equivalent DBGWCR<n> that holds the address the thread
+// will compare against. How this address is interpreted depends upon the configuration of the
+// associated control register.
+
+// The following fields are accepted by the user. All other fields are ignored (masked).
+//
+// - E
+// - BAS
+// - TODO(donosoc): Expose LSC.
+
+// This mask is applied when to DBGWCR. Any set values on those fields will be overwritten.
+//
+// - PAC = 0b10
+// - LSC = 0b10: Write watchpoint. TODO(donosoc): Expose to users so they can define it.
+// - HMC = 0
+// - SSC = 0b01
+// - LBN = 0
+// - WT  = 0
+
+// Enable/disable the watchpoint.
+#define ARM64_DBGWCR_E 1lu  // Bit 1.
+#define ARM64_DBGWCR_E_SHIFT 0u
+#define ARM64_DBGWCR_E_MASK (ARM64_DBGWCR_E << ARM64_DBGWCR_E_SHIFT)
+#define ARM64_DBGWCR_E_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_E_MASK, ARM64_DBGWCR_E_SHIFT)
+#define ARM64_DBGWCR_E_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_E_MASK, \
+                                          ARM64_DBGWCR_E_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_PAC 0b11lu  // Bits 1-2.
+#define ARM64_DBGWCR_PAC_SHIFT 1u
+#define ARM64_DBGWCR_PAC_MASK (ARM64_DBGWCR_PAC << ARM64_DBGWCR_PAC_SHIFT)
+#define ARM64_DBGWCR_PAC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_PAC_MASK, ARM64_DBGWCR_PAC_SHIFT)
+#define ARM64_DBGWCR_PAC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_PAC_MASK, \
+                                          ARM64_DBGWCR_PAC_SHIFT)
+
+// Load/Store Control.
+//
+// On what event the watchpoint trigger:
+// 01: Read from address.
+// 10: Write to address.
+// 11: Read/Write to address.
+#define ARM64_DBGWCR_LSC 0b11lu  // Bits 3-4.
+#define ARM64_DBGWCR_LSC_SHIFT 3u
+#define ARM64_DBGWCR_LSC_MASK (ARM64_DBGWCR_LSC << ARM64_DBGWCR_LSC_SHIFT)
+#define ARM64_DBGWCR_LSC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_LSC_MASK, ARM64_DBGWCR_LSC_SHIFT)
+#define ARM64_DBGWCR_LSC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_LSC_MASK, \
+                                          ARM64_DBGWCR_LSC_SHIFT)
+
+// Byte Address Select.
+//
+// Each bit defines what bytes to match onto:
+// 0bxxxx'xxx1: Match DBGWVR<n> + 0
+// 0bxxxx'xx1x: Match DBGWVR<n> + 1
+// 0bxxxx'x1xx: Match DBGWVR<n> + 2
+// 0bxxxx'1xxx: Match DBGWVR<n> + 3
+// 0bxxx1'xxxx: Match DBGWVR<n> + 4
+// 0bxx1x'xxxx: Match DBGWVR<n> + 5
+// 0bx1xx'xxxx: Match DBGWVR<n> + 6
+// 0b1xxx'xxxx: Match DBGWVR<n> + 7
+#define ARM64_DBGWCR_BAS 0b11111111lu  // Bits 5-12.
+#define ARM64_DBGWCR_BAS_SHIFT 5u
+#define ARM64_DBGWCR_BAS_MASK (ARM64_DBGWCR_BAS << ARM64_DBGWCR_BAS_SHIFT)
+#define ARM64_DBGWCR_BAS_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_BAS_MASK, ARM64_DBGWCR_BAS_SHIFT)
+#define ARM64_DBGWCR_BAS_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_BAS_MASK, \
+                                          ARM64_DBGWCR_BAS_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_HMC 1lu  // Bit 13.
+#define ARM64_DBGWCR_HMC_SHIFT 13u
+#define ARM64_DBGWCR_HMC_MASK (ARM64_DBGWCR_HMC << ARM64_DBGWCR_HMC_SHIFT)
+#define ARM64_DBGWCR_HMC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_HMC_MASK, ARM64_DBGWCR_HMC_SHIFT)
+#define ARM64_DBGWCR_HMC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_HMC_MASK, \
+                                          ARM64_DBGWCR_HMC_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_SSC 0b11lu  // Bits 14-15.
+#define ARM64_DBGWCR_SSC_SHIFT 14u
+#define ARM64_DBGWCR_SSC_MASK (ARM64_DBGWCR_SSC << ARM64_DBGWCR_SSC_SHIFT)
+#define ARM64_DBGWCR_SSC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_SSC_MASK, ARM64_DBGWCR_SSC_SHIFT)
+#define ARM64_DBGWCR_SSC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_SSC_MASK, \
+                                          ARM64_DBGWCR_SSC_SHIFT)
+
+// Linked Breakpoint Number. Zircon doesn't use this feature. Always zero.
+#define ARM64_DBGWCR_LBN 0b1111lu  // Bits 16-19.
+#define ARM64_DBGWCR_LBN_SHIFT 16u
+#define ARM64_DBGWCR_LBN_MASK (ARM64_DBGWCR_LBN << ARM64_DBGWCR_LBN_SHIFT)
+#define ARM64_DBGWCR_LBN_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_LBN_MASK, ARM64_DBGWCR_LBN_SHIFT)
+#define ARM64_DBGWCR_LBN_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_LBN_MASK, \
+                                          ARM64_DBGWCR_LBN_SHIFT)
+
+// Watchpoint Type. Zircon always use unlinked (0).
+#define ARM64_DBGWCR_WT 1lu  // Bit 20.
+#define ARM64_DBGWCR_WT_SHIFT 20u
+#define ARM64_DBGWCR_WT_MASK (ARM64_DBGWCR_WT << ARM64_DBGWCR_WT_SHIFT)
+#define ARM64_DBGWCR_WT_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_WT_MASK, ARM64_DBGWCR_WT_SHIFT)
+#define ARM64_DBGWCR_WT_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_WT_MASK, \
+                                          ARM64_DBGWCR_WT_SHIFT)
+
+// Mask. How many address bits to mask.
+// This permits the watchpoint to track up to 2G worth of addresses.
+// TODO(donosoc): Initially the debugger is going for parity with x64, which only permits 8 bytes.
+//                Eventually expose the ability to track bigger ranges.
+#define ARM64_DBGWCR_MSK 0b11111lu  // Bits 24-28.
+#define ARM64_DBGWCR_MSK_SHIFT 24u
+#define ARM64_DBGWCR_MSK_MASK (ARM64_DBGWCR_MSK << ARM64_DBGWCR_MSK_SHIFT)
+#define ARM64_DBGWCR_MSK_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_MSK_MASK, ARM64_DBGWCR_MSK_SHIFT)
+#define ARM64_DBGWCR_MSK_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_MSK_MASK, \
+                                          ARM64_DBGWCR_MSK_SHIFT)
+
+// Helper functions ================================================================================
+
+inline uint32_t __arm64_internal_hw_debug_get_reg_value(uint32_t reg, uint32_t mask,
+                                                        uint32_t shift) {
+  return (reg & mask) >> shift;
+}
+
+inline void __arm64_internal_hw_debug_set_reg_value(uint32_t* reg, uint32_t value, uint32_t mask,
+                                                    uint32_t shift) {
+  *reg &= ~mask;
+  *reg |= (value << shift) & mask;
+}
+
+#endif  // SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/debug/x86.h b/arch/arm64/sysroot/include/zircon/hw/debug/x86.h
new file mode 100644
index 0000000..413b63a
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/debug/x86.h
@@ -0,0 +1,421 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_HW_DEBUG_X86_H_
+#define SYSROOT_ZIRCON_HW_DEBUG_X86_H_
+
+#include <stdint.h>
+
+// x86/x64 Hardware Debug Resources
+// =================================================================================================
+
+// Hardware Breakpoints ----------------------------------------------------------------------------
+//
+// Hardware breakpoints permits to stop a thread when it executes an address setup in one of the
+// hw breakpoints registers. They will work independent whether the address in question is
+// read-only or not.
+
+// Access macros:
+// All the relevant register fields are exposed through macros.
+// For convenience of use, use the get/set macros:
+//
+// uint64_t X86_<REG>_<FIELD>_GET(uint64_t reg)
+// void X86_<REG>_<FIELD>_SET(uint64_t* reg, uint64_t value)
+//
+// Examples:
+// uint64_t rw0 = X86_DBG_CONTROL_RW0_GET(dr7);
+// X86_DBG_CONTROL_RW0_SET(&dr7, modified_rw0);
+
+// DR6: Debug Status Register.
+//
+// This register is updated when the CPU encounters a #DB harware exception. This registers permits
+// users to interpret the result of an exception, such as if it was a single-step, hardware
+// breakpoint, etc.
+//
+// No bit is writeable from userspace. All values will be ignored.
+
+// Whether the address-breakpoint register 0 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B0 1ul
+#define X86_DBG_STATUS_B0_SHIFT 0
+#define X86_DBG_STATUS_B0_MASK (X86_DBG_STATUS_B0 << X86_DBG_STATUS_B0_SHIFT)
+#define X86_DBG_STATUS_B0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B0_MASK, X86_DBG_STATUS_B0_SHIFT)
+#define X86_DBG_STATUS_B0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B0_MASK, \
+                                        X86_DBG_STATUS_B0_SHIFT)
+
+// Whether the address-breakpoint register 1 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B1 1ul
+#define X86_DBG_STATUS_B1_SHIFT 1
+#define X86_DBG_STATUS_B1_MASK (X86_DBG_STATUS_B1 << X86_DBG_STATUS_B1_SHIFT)
+#define X86_DBG_STATUS_B1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B1_MASK, X86_DBG_STATUS_B1_SHIFT)
+#define X86_DBG_STATUS_B1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B1_MASK, \
+                                        X86_DBG_STATUS_B1_SHIFT)
+
+// Whether the address-breakpoint register 2 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B2 1ul
+#define X86_DBG_STATUS_B2_SHIFT 2
+#define X86_DBG_STATUS_B2_MASK (X86_DBG_STATUS_B2 << X86_DBG_STATUS_B2_SHIFT)
+#define X86_DBG_STATUS_B2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B2_MASK, X86_DBG_STATUS_B2_SHIFT)
+#define X86_DBG_STATUS_B2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B2_MASK, \
+                                        X86_DBG_STATUS_B2_SHIFT)
+
+// Whether the address-breakpoint register 3 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B3 1ul
+#define X86_DBG_STATUS_B3_SHIFT 3
+#define X86_DBG_STATUS_B3_MASK (X86_DBG_STATUS_B3 << X86_DBG_STATUS_B3_SHIFT)
+#define X86_DBG_STATUS_B3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B3_MASK, X86_DBG_STATUS_B3_SHIFT)
+#define X86_DBG_STATUS_B3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B3_MASK, \
+                                        X86_DBG_STATUS_B3_SHIFT)
+
+// Whether there were any software accesses to any debug register (DR0, DR7) while the
+// general-detect condition was enabled in DR7.
+#define X86_DBG_STATUS_BD 1ul
+#define X86_DBG_STATUS_BD_SHIFT 13
+#define X86_DBG_STATUS_BD_MASK (X86_DBG_STATUS_BD << X86_DBG_STATUS_BD_SHIFT)
+#define X86_DBG_STATUS_BD_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BD_MASK, X86_DBG_STATUS_BD_SHIFT)
+#define X86_DBG_STATUS_BD_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BD_MASK, \
+                                        X86_DBG_STATUS_BD_SHIFT)
+
+// Set to 1 whether the #DB exception occurs as a result of a single-step exception. Single step
+// has the highest priority among debug exceptions. Other status bits can be set within the DR6
+// register among this bit, so callers should also check for those.
+#define X86_DBG_STATUS_BS 1ul
+#define X86_DBG_STATUS_BS_SHIFT 14
+#define X86_DBG_STATUS_BS_MASK (X86_DBG_STATUS_BS << X86_DBG_STATUS_BS_SHIFT)
+#define X86_DBG_STATUS_BS_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BS_MASK, X86_DBG_STATUS_BS_SHIFT)
+#define X86_DBG_STATUS_BS_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BS_MASK, \
+                                        X86_DBG_STATUS_BS_SHIFT)
+
+// Set to 1 when the exception occurred as a result of a intel task switch to another intel task
+// with a TSS T-bit set to 1. This is not used by zircon.
+#define X86_DBG_STATUS_BT 1ul
+#define X86_DBG_STATUS_BT_SHIFT 15
+#define X86_DBG_STATUS_BT_MASK (X86_DBG_STATUS_BT << X86_DBG_STATUS_BT_SHIFT)
+#define X86_DBG_STATUS_BT_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BT_MASK, X86_DBG_STATUS_BT_SHIFT)
+#define X86_DBG_STATUS_BT_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BT_MASK, \
+                                        X86_DBG_STATUS_BT_SHIFT)
+
+// DR7: Debug Control Register.
+//
+// This register is used to establish the breakpoint conditions for the address breakpoint registers
+// (DR0-DR3) and to enable debug exceptions for each of them individually. DR7 is also used to
+// enable general-detect breakpoint condition (not permitted by zircon).
+//
+// The following fields are accepted by the user. All other fields are ignored (masked):
+//
+// - L0, L1, L2, L3
+// - LEN0, LEN1, LEN2, LEN3
+// - RW0, RW1, RW2, RW3
+
+// Local Breakpoint Enable 0.
+// Enables debug exceptions to occur when the corresponding address register (DR0) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L0 1ul
+#define X86_DBG_CONTROL_L0_SHIFT 0
+#define X86_DBG_CONTROL_L0_MASK (X86_DBG_CONTROL_L0 << X86_DBG_CONTROL_L0_SHIFT)
+#define X86_DBG_CONTROL_L0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L0_MASK, X86_DBG_CONTROL_L0_SHIFT)
+#define X86_DBG_CONTROL_L0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L0_MASK, \
+                                        X86_DBG_CONTROL_L0_SHIFT)
+
+// Global Breakpoint Enable 0.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR0) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G0 1ul
+#define X86_DBG_CONTROL_G0_SHIFT 1
+#define X86_DBG_CONTROL_G0_MASK (X86_DBG_CONTROL_G0 << X86_DBG_CONTROL_G0_SHIFT)
+#define X86_DBG_CONTROL_G0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G0_MASK, X86_DBG_CONTROL_G0_SHIFT)
+#define X86_DBG_CONTROL_G0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G0_MASK, \
+                                        X86_DBG_CONTROL_G0_SHIFT)
+
+// Local Breakpoint Enable 1.
+// Enables debug exceptions to occur when the corresponding address register (DR1) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L1 1ul
+#define X86_DBG_CONTROL_L1_SHIFT 2
+#define X86_DBG_CONTROL_L1_MASK (X86_DBG_CONTROL_L1 << X86_DBG_CONTROL_L1_SHIFT)
+#define X86_DBG_CONTROL_L1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L1_MASK, X86_DBG_CONTROL_L1_SHIFT)
+#define X86_DBG_CONTROL_L1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L1_MASK, \
+                                        X86_DBG_CONTROL_L1_SHIFT)
+
+// Global Breakpoint Enable 1.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR1) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G1 1ul
+#define X86_DBG_CONTROL_G1_SHIFT 3
+#define X86_DBG_CONTROL_G1_MASK (X86_DBG_CONTROL_G1 << X86_DBG_CONTROL_G1_SHIFT)
+#define X86_DBG_CONTROL_G1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G1_MASK, X86_DBG_CONTROL_G1_SHIFT)
+#define X86_DBG_CONTROL_G1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G1_MASK, \
+                                        X86_DBG_CONTROL_G1_SHIFT)
+
+// Local Breakpoint Enable 2.
+// Enables debug exceptions to occur when the corresponding address register (DR2) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L2 1ul
+#define X86_DBG_CONTROL_L2_SHIFT 4
+#define X86_DBG_CONTROL_L2_MASK (X86_DBG_CONTROL_L2 << X86_DBG_CONTROL_L2_SHIFT)
+#define X86_DBG_CONTROL_L2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L2_MASK, X86_DBG_CONTROL_L2_SHIFT)
+#define X86_DBG_CONTROL_L2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L2_MASK, \
+                                        X86_DBG_CONTROL_L2_SHIFT)
+
+// Global Breakpoint Enable 2.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR2) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G2 1ul
+#define X86_DBG_CONTROL_G2_SHIFT 5
+#define X86_DBG_CONTROL_G2_MASK (X86_DBG_CONTROL_G2 << X86_DBG_CONTROL_G2_SHIFT)
+#define X86_DBG_CONTROL_G2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G2_MASK, X86_DBG_CONTROL_G2_SHIFT)
+#define X86_DBG_CONTROL_G2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G2_MASK, \
+                                        X86_DBG_CONTROL_G2_SHIFT)
+
+// Local Breakpoint Enable 3.
+// Enables debug exceptions to occur when the corresponding address register (DR3) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L3 1ul
+#define X86_DBG_CONTROL_L3_SHIFT 6
+#define X86_DBG_CONTROL_L3_MASK (X86_DBG_CONTROL_L3 << X86_DBG_CONTROL_L3_SHIFT)
+#define X86_DBG_CONTROL_L3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L3_MASK, X86_DBG_CONTROL_L3_SHIFT)
+#define X86_DBG_CONTROL_L3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L3_MASK, \
+                                        X86_DBG_CONTROL_L3_SHIFT)
+
+// Global Breakpoint Enable 3.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR3) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G3 1u
+#define X86_DBG_CONTROL_G3_SHIFT 7
+#define X86_DBG_CONTROL_G3_MASK (X86_DBG_CONTROL_G3 << X86_DBG_CONTROL_G3_SHIFT)
+#define X86_DBG_CONTROL_G3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G3_MASK, X86_DBG_CONTROL_G3_SHIFT)
+#define X86_DBG_CONTROL_G3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G3_MASK, \
+                                        X86_DBG_CONTROL_G3_SHIFT)
+
+// Local Enable [Legacy Implementations].
+// Enables exact breakpoints on the while executing the current intel task. This bit is ignored by
+// implementations of the AMD64 architecture.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_LE 1ul
+#define X86_DBG_CONTROL_LE_SHIFT 8
+#define X86_DBG_CONTROL_LE_MASK (X86_DBG_CONTROL_LE << X86_DBG_CONTROL_LE_SHIFT)
+#define X86_DBG_CONTROL_LE_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LE_MASK, X86_DBG_CONTROL_LE_SHIFT)
+#define X86_DBG_CONTROL_LE_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LE_MASK, \
+                                        X86_DBG_CONTROL_LE_SHIFT)
+
+// Global Enable [Legacy Implementations].
+// Enables exact breakpoints on the while executing *any* intel task. This bit is ignored by
+// implementations of the AMD64 architecture.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_GE 1ul
+#define X86_DBG_CONTROL_GE_SHIFT 9
+#define X86_DBG_CONTROL_GE_MASK (X86_DBG_CONTROL_GE << X86_DBG_CONTROL_GE_SHIFT)
+#define X86_DBG_CONTROL_GE_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_GE_MASK, X86_DBG_CONTROL_GE_SHIFT)
+#define X86_DBG_CONTROL_GE_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_GE_MASK, \
+                                        X86_DBG_CONTROL_GE_SHIFT)
+
+// General Detect Enable.
+// Whether an attempt to execute a "MOV DR<n>" instruction will trigger a debug exception. This bit
+// is cleared when a #DB handler is entered, so the handler can read/write to those registers.
+// This exception occurs before executing the instruction and DR6.DB is set the the processor.
+// Debuggers can use this bit to prevent the currently executing prgram from interfering with the
+// debug operations.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_GD 1ul
+#define X86_DBG_CONTROL_GD_SHIFT 13
+#define X86_DBG_CONTROL_GD_MASK (X86_DBG_CONTROL_GD << X86_DBG_CONTROL_GD_SHIFT)
+#define X86_DBG_CONTROL_GD_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_GD_MASK, X86_DBG_CONTROL_GD_SHIFT)
+#define X86_DBG_CONTROL_GD_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_GD_MASK, \
+                                        X86_DBG_CONTROL_GD_SHIFT)
+
+// Read/Write 0.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR0).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW0 3ul
+#define X86_DBG_CONTROL_RW0_SHIFT 16
+#define X86_DBG_CONTROL_RW0_MASK (X86_DBG_CONTROL_RW0 << X86_DBG_CONTROL_RW0_SHIFT)
+#define X86_DBG_CONTROL_RW0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW0_MASK, X86_DBG_CONTROL_RW0_SHIFT)
+#define X86_DBG_CONTROL_RW0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW0_MASK, \
+                                        X86_DBG_CONTROL_RW0_SHIFT)
+
+// Length 0.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR0). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN0 3ul
+#define X86_DBG_CONTROL_LEN0_SHIFT 18
+#define X86_DBG_CONTROL_LEN0_MASK (X86_DBG_CONTROL_LEN0 << X86_DBG_CONTROL_LEN0_SHIFT)
+#define X86_DBG_CONTROL_LEN0_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN0_MASK, \
+                                        X86_DBG_CONTROL_LEN0_SHIFT)
+#define X86_DBG_CONTROL_LEN0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN0_MASK, \
+                                        X86_DBG_CONTROL_LEN0_SHIFT)
+
+// Read/Write 1.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR1).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW1 3ul
+#define X86_DBG_CONTROL_RW1_SHIFT 20
+#define X86_DBG_CONTROL_RW1_MASK (X86_DBG_CONTROL_RW1 << X86_DBG_CONTROL_RW1_SHIFT)
+#define X86_DBG_CONTROL_RW1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW1_MASK, X86_DBG_CONTROL_RW1_SHIFT)
+#define X86_DBG_CONTROL_RW1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW1_MASK, \
+                                        X86_DBG_CONTROL_RW1_SHIFT)
+
+// Length 1.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR1). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN1 3ul
+#define X86_DBG_CONTROL_LEN1_SHIFT 22
+#define X86_DBG_CONTROL_LEN1_MASK (X86_DBG_CONTROL_LEN1 << X86_DBG_CONTROL_LEN1_SHIFT)
+#define X86_DBG_CONTROL_LEN1_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN1_MASK, \
+                                        X86_DBG_CONTROL_LEN1_SHIFT)
+#define X86_DBG_CONTROL_LEN1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN1_MASK, \
+                                        X86_DBG_CONTROL_LEN1_SHIFT)
+
+// Read/Write 2.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR2).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW2 3ul
+#define X86_DBG_CONTROL_RW2_SHIFT 24
+#define X86_DBG_CONTROL_RW2_MASK (X86_DBG_CONTROL_RW2 << X86_DBG_CONTROL_RW2_SHIFT)
+#define X86_DBG_CONTROL_RW2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW2_MASK, X86_DBG_CONTROL_RW2_SHIFT)
+#define X86_DBG_CONTROL_RW2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW2_MASK, \
+                                        X86_DBG_CONTROL_RW2_SHIFT)
+
+// Length 2.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR2). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN2 3ul
+#define X86_DBG_CONTROL_LEN2_SHIFT 26
+#define X86_DBG_CONTROL_LEN2_MASK (X86_DBG_CONTROL_LEN2 << X86_DBG_CONTROL_LEN2_SHIFT)
+#define X86_DBG_CONTROL_LEN2_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN2_MASK, \
+                                        X86_DBG_CONTROL_LEN2_SHIFT)
+#define X86_DBG_CONTROL_LEN2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN2_MASK, \
+                                        X86_DBG_CONTROL_LEN2_SHIFT)
+
+// Read/Write 3.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR3).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW3 3ul
+#define X86_DBG_CONTROL_RW3_SHIFT 28
+#define X86_DBG_CONTROL_RW3_MASK (X86_DBG_CONTROL_RW3 << X86_DBG_CONTROL_RW3_SHIFT)
+#define X86_DBG_CONTROL_RW3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW3_MASK, X86_DBG_CONTROL_RW3_SHIFT)
+#define X86_DBG_CONTROL_RW3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW3_MASK, \
+                                        X86_DBG_CONTROL_RW3_SHIFT)
+
+// Length 3.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR3). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN3 3ul
+#define X86_DBG_CONTROL_LEN3_SHIFT 30
+#define X86_DBG_CONTROL_LEN3_MASK (X86_DBG_CONTROL_LEN3 << X86_DBG_CONTROL_LEN3_SHIFT)
+#define X86_DBG_CONTROL_LEN3_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN3_MASK, \
+                                        X86_DBG_CONTROL_LEN3_SHIFT)
+#define X86_DBG_CONTROL_LEN3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN3_MASK, \
+                                        X86_DBG_CONTROL_LEN3_SHIFT)
+
+// Helper functions ================================================================================
+
+inline uint64_t __x86_internal_hw_debug_get_reg_value(uint64_t reg, uint64_t mask, uint64_t shift) {
+  return (reg & mask) >> shift;
+}
+
+inline void __x86_internal_hw_debug_set_reg_value(uint64_t* reg, uint64_t value, uint64_t mask,
+                                                  uint64_t shift) {
+  *reg &= ~mask;
+  *reg |= (value << shift) & mask;
+}
+
+#endif  // SYSROOT_ZIRCON_HW_DEBUG_X86_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/gpt.h b/arch/arm64/sysroot/include/zircon/hw/gpt.h
index c3112f5..d93a23c 100644
--- a/arch/arm64/sysroot/include/zircon/hw/gpt.h
+++ b/arch/arm64/sysroot/include/zircon/hw/gpt.h
@@ -2,59 +2,224 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_GPT_H_
+#define SYSROOT_ZIRCON_HW_GPT_H_
 
+#include <assert.h>
 #include <stdbool.h>
 #include <stdint.h>
-
 #include <zircon/compiler.h>
 
-#define GPT_MAGIC (0x5452415020494645ull) // 'EFI PART'
+#define GPT_MAGIC (0x5452415020494645ull)  // 'EFI PART'
 #define GPT_HEADER_SIZE 0x5c
-#define GPT_ENTRY_SIZE  0x80
+#define GPT_ENTRY_SIZE 0x80
 #define GPT_GUID_LEN 16
 #define GPT_GUID_STRLEN 37
 #define GPT_NAME_LEN 72
 
 typedef struct gpt_header {
-    uint64_t magic;
-    uint32_t revision;
-    uint32_t size;
-    uint32_t crc32;
-    uint32_t reserved0;
-    uint64_t current;
-    uint64_t backup;
-    uint64_t first;
-    uint64_t last;
-    uint8_t guid[GPT_GUID_LEN];
-    uint64_t entries;
-    uint32_t entries_count;
-    uint32_t entries_size;
-    uint32_t entries_crc;
+  uint64_t magic;              // Magic number.
+  uint32_t revision;           // Revision.
+  uint32_t size;               // Size of the header.
+  uint32_t crc32;              // Checksum of this header.
+  uint32_t reserved0;          // Reserved field.
+  uint64_t current;            // Block where this table is stored.
+  uint64_t backup;             // Block where other copy of partition table is stored.
+  uint64_t first;              // First usable block. Block after primary partition table ends.
+  uint64_t last;               // Last usable block. Block before backup partition table starts.
+  uint8_t guid[GPT_GUID_LEN];  // Disk GUID.
+  uint64_t entries;            // Starting block where entries for this partition tables are found.
+                               // Value equals 2 for primary copy.
+  uint32_t entries_count;      // Total number of entries.
+  uint32_t entries_size;       // Size of each entry.
+  uint32_t entries_crc;        // Checksum of the entire entries array.
 } __PACKED gpt_header_t;
 
-typedef struct gpt_entry {
-    uint8_t type[GPT_GUID_LEN];
-    uint8_t guid[GPT_GUID_LEN];
-    uint64_t first;
-    uint64_t last;
-    uint64_t flags;
-    uint8_t name[GPT_NAME_LEN];  // UTF-16 on disk
-} __PACKED gpt_entry_t;
+static_assert(GPT_HEADER_SIZE == sizeof(gpt_header_t), "Gpt header size invalid");
 
+typedef struct gpt_entry {
+  uint8_t type[GPT_GUID_LEN];
+  uint8_t guid[GPT_GUID_LEN];
+  uint64_t first;
+  uint64_t last;
+  uint64_t flags;
+  uint8_t name[GPT_NAME_LEN];  // UTF-16 on disk
+} gpt_entry_t;
+
+static_assert(GPT_ENTRY_SIZE == sizeof(gpt_entry_t), "Gpt entry size invalid");
+
+// GUIDs are specified in mixed-endian, to avoid manual errors use this macro.
+// Example usage: GPT_GUID(0x00112233, 0x4455, 0x6677, 0x8899, 0xAABBCCDDEEFF)
+// clang-format off
+#define GPT_GUID(group0, group1, group2, group3, group4) { \
+  /* group0: 4 bytes, little-endian. */                    \
+  (group0 >> 0) & 0xFF,                                    \
+  (group0 >> 8) & 0xFF,                                    \
+  (group0 >> 16) & 0xFF,                                   \
+  (group0 >> 24) & 0xFF,                                   \
+  /* group1: 2 bytes, little-endian. */                    \
+  (group1 >> 0) & 0xFF,                                    \
+  (group1 >> 8) & 0xFF,                                    \
+  /* group2: 2 bytes, little-endian. */                    \
+  (group2 >> 0) & 0xFF,                                    \
+  (group2 >> 8) & 0xFF,                                    \
+  /* group3: 2 bytes, big-endian. */                       \
+  (group3 >> 8) & 0xFF,                                    \
+  (group3 >> 0) & 0xFF,                                    \
+  /* group4: 6 bytes, big-endian. */                       \
+  (group4 >> 40) & 0xFF,                                   \
+  (group4 >> 32) & 0xFF,                                   \
+  (group4 >> 24) & 0xFF,                                   \
+  (group4 >> 16) & 0xFF,                                   \
+  (group4 >> 8) & 0xFF,                                    \
+  (group4 >> 0) & 0xFF                                     \
+}
+// clang-format on
+
+// == GPT partition definitions ==
+//
+// These are some common partition definitions used across various boards.
+// The general scheme is:
+//   |type|: identical for slotted partitions, e.g. zircon_{a,b,r} will all
+//           share the same type GUID
+//   |guid|: unspecified and generally expected to be random
+//   |name|: specific name for uniquely identifying partitions
+//
+// New boards should adopt this scheme when possible, but see below for a
+// slightly different legacy scheme used by existing boards.
+
+// clang-format off
+
+// bootloader_{a,b,r}
+//
+// These partitions are optional and may be used to hold bootloader and/or
+// other firmware images. The format is SoC-specific.
+#define GPT_BOOTLOADER_A_NAME         "bootloader_a"
+#define GPT_BOOTLOADER_B_NAME         "bootloader_b"
+#define GPT_BOOTLOADER_R_NAME         "bootloader_r"
+#define GPT_BOOTLOADER_ABR_TYPE_GUID  GPT_GUID(0xfe8a2634, 0x5e2e, 0x46ba, 0x99e3, 0x3a192091a350)
+
+// durable
+//
+// This partition holds mutable data that must remain intact across factory
+// reset. It differs from durable_boot only in that it is larger, ignored by
+// bootloaders, and is expected to have a filesystem.
+//
+// This partition is expected to be written to by Fuchsia during normal
+// operation. It is expected to be read by Fuchsia, but not by any bootloader
+// or firmware. It is expected to have a filesystem with encryption built in.
+// Use of this partition increases attack surface and should be minimized.
+#define GPT_DURABLE_NAME              "durable"
+#define GPT_DURABLE_TYPE_GUID         GPT_GUID(0xd9fd4535, 0x106c, 0x4cec, 0x8d37, 0xdfc020ca87cb)
+
+// durable_boot
+//
+// This partition holds A/B/R metadata and other very small mutable data that
+// must remain intact across factory reset. There is no filesystem and the
+// content layout is fixed.
+//
+// This partition is expected to be written to by Fuchsia and the main
+// bootloader during normal operation. It is expected to be read by bootloaders
+// very early in boot. It has no encryption or integrity check built in. Use of
+// this partition increases attack surface and should be minimized.
+#define GPT_DURABLE_BOOT_NAME         "durable_boot"
+#define GPT_DURABLE_BOOT_TYPE_GUID    GPT_GUID(0xa409e16b, 0x78aa, 0x4acc, 0x995c, 0x302352621a41)
+
+// factory
+//
+// This partition holds factory-provisioned data used by the Fuchsia-based
+// system and is read-only.
+//
+// It is expected that this partition is only written in the factory and has a
+// simple file system. It is not encrypted, but is checked for integrity by
+// Fuchsia. Bootloaders and firmware are expected to ignore this partition.
+#define GPT_FACTORY_NAME              "factory"
+#define GPT_FACTORY_TYPE_GUID         GPT_GUID(0xf95d940e, 0xcaba, 0x4578, 0x9b93, 0xbb6c90f29d3e)
+
+// factory_boot
+//
+// This partition holds factory-provisioned data used by the bootloader and is
+// read-only. It must be small enough to be loaded into memory and verified
+// during boot.
+//
+// It is expected that this partition is only written in the factory and has a
+// simple structured format, not a filesystem. It is not encrypted but is
+// checked for integrity by the verified boot process. It is expected to be read
+// only by the main bootloader, not by Fuchsia.
+#define GPT_FACTORY_BOOT_NAME         "factory_boot"
+#define GPT_FACTORY_BOOT_TYPE_GUID    GPT_GUID(0x10b8dbaa, 0xd2bf, 0x42a9, 0x98c6, 0xa7c5db3701e7)
+
+// fvm
+//
+// This partition is owned by the Fuchsia Volume Manager. It will be used for
+// both system and user data.
+#define GPT_FVM_NAME                  "fvm"
+#define GPT_FVM_TYPE_GUID             GPT_GUID(0x49fd7cb8, 0xdf15, 0x4e73, 0xb9d9, 0x992070127f0f)
+
+// vbmeta_{a,b,r}
+//
+// These partitions each hold verified boot metadata for a particular A/B/R
+// slot. The format is defined by libavb.
+//
+// These partitions are expected to be written in the factory and during an OTA
+// update. They are expected to be read by the main bootloader and possibly by
+// Fuchsia. They are not encrypted, but are checked for integrity as part of the
+// verified boot process.
+#define GPT_VBMETA_A_NAME             "vbmeta_a"
+#define GPT_VBMETA_B_NAME             "vbmeta_b"
+#define GPT_VBMETA_R_NAME             "vbmeta_r"
+#define GPT_VBMETA_ABR_TYPE_GUID      GPT_GUID(0x421a8bfc, 0x85d9, 0x4d85, 0xacda, 0xb64eec0133e9)
+
+// zircon_{a,b,r}
+//
+// These partitions each hold a complete Zircon boot image, including an
+// embedded bootfs image, for a particular A/B/R slot.
+//
+// These partitions are expected to be written in the factory and during an OTA
+// update. They are expected to be read only by the main bootloader. They are
+// not encrypted but are checked for integrity as part of the verified boot
+// process.
+#define GPT_ZIRCON_A_NAME             "zircon_a"
+#define GPT_ZIRCON_B_NAME             "zircon_b"
+#define GPT_ZIRCON_R_NAME             "zircon_r"
+#define GPT_ZIRCON_ABR_TYPE_GUID      GPT_GUID(0x9b37fff6, 0x2e58, 0x466a, 0x983a, 0xf7926d0b04e0)
+
+// Microsoft basic data partition
+//
+// These partitions usually contain FAT filesystems. They are mounted by the fat
+// implementation at //src/storage/fuchsia-fatfs.
+// These partitions do not have an expected label.
+#define GPT_MICROSOFT_BASIC_DATA_TYPE_GUID \
+    GPT_GUID(0xebd0a0a2, 0xb9e5, 0x4433, 0x87c0, 0x68b6b72699c7)
+
+// clang-format on
+
+// == Legacy GPT partition definitions ==
+//
+// These definitions instead use the following scheme:
+//   |type|: unique for each partition, e.g. zircon_{a,b,r} will each have their
+//           own type GUID
+//   |guid|: unspecified and generally expected to be random
+//   |name|: specific name, can use this or |type| find an individual partition
+
+// clang-format off
+#define GUID_EMPTY_STRING "00000000-0000-0000-0000-000000000000"
 #define GUID_EMPTY_VALUE {                         \
     0x00, 0x00, 0x00, 0x00,                        \
     0x00, 0x00,                                    \
     0x00, 0x00,                                    \
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
 }
+#define GUID_EMPTY_NAME "empty"
 
+#define GUID_EFI_STRING "C12A7328-F81F-11D2-BA4B-00A0C93EC93B"
 #define GUID_EFI_VALUE {                           \
     0x28, 0x73, 0x2a, 0xc1,                        \
     0x1f, 0xf8,                                    \
     0xd2, 0x11,                                    \
     0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b \
 }
+#define GUID_EFI_NAME "fuchsia-esp"
 
 // GUID for a system partition
 #define GUID_SYSTEM_STRING "606B000B-B7C7-4653-A7D5-B737332C899D"
@@ -64,6 +229,7 @@
     0x53, 0x46,                                    \
     0xa7, 0xd5, 0xb7, 0x37, 0x33, 0x2c, 0x89, 0x9d \
 }
+#define GUID_SYSTEM_NAME "fuchsia-system"
 
 // GUID for a data partition
 #define GUID_DATA_STRING "08185F0C-892D-428A-A789-DBEEC8F55E6A"
@@ -73,6 +239,7 @@
     0x8a, 0x42,                                    \
     0xa7, 0x89, 0xdb, 0xee, 0xc8, 0xf5, 0x5e, 0x6a \
 }
+#define GUID_DATA_NAME "fuchsia-data"
 
 // GUID for a installer partition
 #define GUID_INSTALL_STRING "48435546-4953-2041-494E-5354414C4C52"
@@ -82,6 +249,7 @@
     0x41, 0x20,                                    \
     0x49, 0x4E, 0x53, 0x54, 0x41, 0x4C, 0x4C, 0x52 \
 }
+#define GUID_INSTALL_NAME "fuchsia-install"
 
 #define GUID_BLOB_STRING "2967380E-134C-4CBB-B6DA-17E7CE1CA45D"
 #define GUID_BLOB_VALUE {                          \
@@ -90,6 +258,7 @@
     0xbb, 0x4c,                                    \
     0xb6, 0xda, 0x17, 0xe7, 0xce, 0x1c, 0xa4, 0x5d \
 }
+#define GUID_BLOB_NAME "fuchsia-blob"
 
 #define GUID_FVM_STRING "41D0E340-57E3-954E-8C1E-17ECAC44CFF5"
 #define GUID_FVM_VALUE {                           \
@@ -98,75 +267,188 @@
     0x4e, 0x95,                                    \
     0x8c, 0x1e, 0x17, 0xec, 0xac, 0x44, 0xcf, 0xf5 \
 }
+#define GUID_FVM_NAME "fuchsia-fvm"
 
 #define GUID_ZIRCON_A_STRING "DE30CC86-1F4A-4A31-93C4-66F147D33E05"
-#define GUID_ZIRCON_A_VALUE { \
-    0x86, 0xcc, 0x30, 0xde, \
-    0x4a, 0x1f, \
-    0x31, 0x4a, \
+#define GUID_ZIRCON_A_VALUE {                       \
+    0x86, 0xcc, 0x30, 0xde,                         \
+    0x4a, 0x1f,                                     \
+    0x31, 0x4a,                                     \
     0x93, 0xc4, 0x66, 0xf1, 0x47, 0xd3, 0x3e, 0x05, \
 }
+#define GUID_ZIRCON_A_NAME "zircon-a"
 
 #define GUID_ZIRCON_B_STRING "23CC04DF-C278-4CE7-8471-897D1A4BCDF7"
-#define GUID_ZIRCON_B_VALUE { \
-    0xdf, 0x04, 0xcc, 0x23, \
-    0x78, 0xc2, \
-    0xe7, 0x4c, \
+#define GUID_ZIRCON_B_VALUE {                      \
+    0xdf, 0x04, 0xcc, 0x23,                        \
+    0x78, 0xc2,                                    \
+    0xe7, 0x4c,                                    \
     0x84, 0x71, 0x89, 0x7d, 0x1a, 0x4b, 0xcd, 0xf7 \
 }
+#define GUID_ZIRCON_B_NAME "zircon-b"
 
 #define GUID_ZIRCON_R_STRING "A0E5CF57-2DEF-46BE-A80C-A2067C37CD49"
-#define GUID_ZIRCON_R_VALUE { \
-    0x57, 0xcf, 0xe5, 0xa0, \
-    0xef, 0x2d, \
-    0xbe, 0x46, \
+#define GUID_ZIRCON_R_VALUE {                      \
+    0x57, 0xcf, 0xe5, 0xa0,                        \
+    0xef, 0x2d,                                    \
+    0xbe, 0x46,                                    \
     0xa8, 0x0c, 0xa2, 0x06, 0x7c, 0x37, 0xcd, 0x49 \
 }
+#define GUID_ZIRCON_R_NAME "zircon-r"
 
 #define GUID_SYS_CONFIG_STRING "4E5E989E-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_SYS_CONFIG_VALUE { \
+#define GUID_SYS_CONFIG_VALUE {                    \
     0x9e, 0x98, 0x5e, 0x4e,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_SYS_CONFIG_NAME "sys-config"
 
 #define GUID_FACTORY_CONFIG_STRING "5A3A90BE-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_FACTORY_CONFIG_VALUE { \
+#define GUID_FACTORY_CONFIG_VALUE {                \
     0xbe, 0x90, 0x3a, 0x5a,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_FACTORY_CONFIG_NAME "factory-config"
 
 #define GUID_BOOTLOADER_STRING "5ECE94FE-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_BOOTLOADER_VALUE { \
+#define GUID_BOOTLOADER_VALUE {                    \
     0xfe, 0x94, 0xce, 0x5e,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_BOOTLOADER_NAME "bootloader"
 
 #define GUID_TEST_STRING "8B94D043-30BE-4871-9DFA-D69556E8C1F3"
-#define GUID_TEST_VALUE { \
+#define GUID_TEST_VALUE {                          \
     0x43, 0xD0, 0x94, 0x8b,                        \
     0xbe, 0x30,                                    \
-    0x71, 0x38,                                    \
+    0x71, 0x48,                                    \
     0x9d, 0xfa, 0xd6, 0x95, 0x56, 0xe8, 0xc1, 0xf3 \
 }
+#define GUID_TEST_NAME "guid-test"
 
 #define GUID_VBMETA_A_STRING "A13B4D9A-EC5F-11E8-97D8-6C3BE52705BF"
-#define GUID_VBMETA_A_VALUE { \
+#define GUID_VBMETA_A_VALUE {                      \
     0x9a, 0x4d, 0x3b, 0xa1,                        \
     0x5f, 0xec,                                    \
-    0xd8, 0x97,                                    \
-    0x6c, 0x3b, 0x6c, 0x3b, 0xe2, 0x27, 0x05, 0xbf \
+    0xe8, 0x11,                                    \
+    0x97, 0xd8, 0x6c, 0x3b, 0xe5, 0x27, 0x05, 0xbf \
 }
+#define GUID_VBMETA_A_NAME "vbmeta_a"
 
 #define GUID_VBMETA_B_STRING "A288ABF2-EC5F-11E8-97D8-6C3BE52705BF"
-#define GUID_VBMETA_B_VALUE { \
+#define GUID_VBMETA_B_VALUE {                      \
     0xf2, 0xab, 0x88, 0xa2,                        \
     0x5f, 0xec,                                    \
-    0xd8, 0x97,                                    \
-    0x6c, 0x3b, 0x6c, 0x3b, 0xe2, 0x27, 0x05, 0xbf \
+    0xe8, 0x11,                                    \
+    0x97, 0xd8, 0x6c, 0x3b, 0xe5, 0x27, 0x05, 0xbf \
 }
+#define GUID_VBMETA_B_NAME "vbmeta_b"
+
+#define GUID_VBMETA_R_STRING "6A2460C3-CD11-4E8B-80A8-12CCE268ED0A"
+#define GUID_VBMETA_R_VALUE {                      \
+    0xc3, 0x60, 0x24, 0x6a,                        \
+    0x11, 0xcd,                                    \
+    0x8b, 0x4e,                                    \
+    0x80, 0xa8, 0x12, 0xcc, 0xe2, 0x68, 0xed, 0x0a \
+}
+#define GUID_VBMETA_R_NAME "vbmeta_r"
+
+#define GUID_ABR_META_STRING "1D75395D-F2C6-476B-A8B7-45CC1C97B476"
+#define GUID_ABR_META_VALUE {                      \
+    0x5d, 0x39, 0x75, 0x1d,                        \
+    0xc6, 0xf2,                                    \
+    0x6b, 0x47,                                    \
+    0xa8, 0xb7, 0x45, 0xcc, 0x1c, 0x97, 0xb4, 0x76 \
+}
+#define GUID_ABR_META_NAME "misc"
+
+#define GUID_CROS_KERNEL_STRING "FE3A2A5D-4F32-41A7-B725-ACCC3285A309"
+#define GUID_CROS_KERNEL_VALUE {                   \
+    0x5d, 0x2a, 0x3a, 0xfe,                        \
+    0x32, 0x4f,                                    \
+    0xa7, 0x41,                                    \
+    0xb7, 0x25, 0xac, 0xcc, 0x32, 0x85, 0xa3, 0x09 \
+}
+#define GUID_CROS_KERNEL_NAME "cros-kernel"
+
+#define GUID_CROS_ROOTFS_STRING "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC"
+#define GUID_CROS_ROOTFS_VALUE {                   \
+    0x02, 0xe2, 0xb8, 0x3C,                        \
+    0x7e, 0x3b,                                    \
+    0xdd, 0x47,                                    \
+    0x8a, 0x3c, 0x7f, 0xf2, 0xa1, 0x3c, 0xfc, 0xec \
+}
+#define GUID_CROS_ROOTFS_NAME "cros-rootfs"
+
+#define GUID_CROS_RESERVED_STRING "2E0A753D-9E48-43B0-8337-B15192CB1B5E"
+#define GUID_CROS_RESERVED_VALUE {                 \
+    0x3d, 0x75, 0x0a, 0x2e,                        \
+    0x48, 0x9e,                                    \
+    0xb0, 0x43,                                    \
+    0x83, 0x37, 0xb1, 0x51, 0x92, 0xcb, 0x1b, 0x5e \
+}
+#define GUID_CROS_RESERVED_NAME "cros-reserved"
+
+#define GUID_CROS_FIRMWARE_STRING "CAB6E88E-ABF3-4102-A07A-D4BB9BE3C1D3"
+#define GUID_CROS_FIRMWARE_VALUE {                 \
+    0x8e, 0xe8, 0xb6, 0xca,                        \
+    0xf3, 0xab,                                    \
+    0x02, 0x41,                                    \
+    0xa0, 0x7a, 0xd4, 0xbb, 0x9b, 0xe3, 0xc1, 0xd3 \
+}
+#define GUID_CROS_FIRMWARE_NAME "cros-firmware"
+
+#define GUID_CROS_DATA_STRING "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
+#define GUID_CROS_DATA_VALUE {                     \
+    0xa2, 0xa0, 0xd0, 0xeb,                        \
+    0xe5, 0xb9,                                    \
+    0x33, 0x44,                                    \
+    0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 \
+}
+#define GUID_CROS_DATA_NAME "cros-data"
+
+#define GUID_BIOS_STRING "21686148-6449-6E6F-744E-656564454649"
+#define GUID_BIOS_VALUE {                          \
+    0x48, 0x61, 0x68, 0x21,                        \
+    0x49, 0x64,                                    \
+    0x6f, 0x6e,                                    \
+    0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 \
+}
+#define GUID_BIOS_NAME "bios"
+
+#define GUID_EMMC_BOOT1_STRING "900B0FC5-90CD-4D4F-84F9-9F8ED579DB88"
+#define GUID_EMMC_BOOT1_VALUE {                    \
+    0xc5, 0x0f, 0x0b, 0x90,                        \
+    0xcd, 0x90,                                    \
+    0x4f, 0x4d,                                    \
+    0x84, 0xf9, 0x9f, 0x8e, 0xd5, 0x79, 0xdb, 0x88 \
+}
+#define GUID_EMMC_BOOT1_NAME "emmc-boot1"
+
+#define GUID_EMMC_BOOT2_STRING "B2B2E8D1-7C10-4EBC-A2D0-4614568260AD"
+#define GUID_EMMC_BOOT2_VALUE {                    \
+    0xd1, 0xe8, 0xb2, 0xb2,                        \
+    0x10, 0x7c,                                    \
+    0xbc, 0x4e,                                    \
+    0xa2, 0xd0, 0x46, 0x14, 0x56, 0x82, 0x60, 0xad \
+}
+#define GUID_EMMC_BOOT2_NAME "emmc-boot2"
+
+#define GUID_LINUX_FILESYSTEM_DATA_STRING "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
+#define GUID_LINUX_FILESYSTEM_DATA_VALUE {         \
+    0xaf, 0x3d, 0xc6, 0x0f,                        \
+    0x83, 0x84,                                    \
+    0x72, 0x47,                                    \
+    0x8e, 0x79, 0x3d, 0x69, 0xd8, 0x47, 0x7d, 0xe4 \
+}
+#define GUID_LINUX_FILESYSTEM_DATA_NAME "linux-filesystem"
+
+// clang-format on
+
+#endif  // SYSROOT_ZIRCON_HW_GPT_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/i2c.h b/arch/arm64/sysroot/include/zircon/hw/i2c.h
index a8f0f4b..e35b6f1 100644
--- a/arch/arm64/sysroot/include/zircon/hw/i2c.h
+++ b/arch/arm64/sysroot/include/zircon/hw/i2c.h
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_I2C_H_
+#define SYSROOT_ZIRCON_HW_I2C_H_
 
 #define I2C_CLASS_HID 1
+
+#endif  // SYSROOT_ZIRCON_HW_I2C_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/pci.h b/arch/arm64/sysroot/include/zircon/hw/pci.h
index 06c7023..7de1bca 100644
--- a/arch/arm64/sysroot/include/zircon/hw/pci.h
+++ b/arch/arm64/sysroot/include/zircon/hw/pci.h
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_HW_PCI_H_
-#define ZIRCON_HW_PCI_H_
+#ifndef SYSROOT_ZIRCON_HW_PCI_H_
+#define SYSROOT_ZIRCON_HW_PCI_H_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // Structure for passing around PCI address information
 typedef struct pci_bdf {
-    uint8_t bus_id;
-    uint8_t device_id;
-    uint8_t function_id;
+  uint8_t bus_id;
+  uint8_t device_id;
+  uint8_t function_id;
 } pci_bdf_t;
 
 // TODO(cja): This header is used for the transition of these defines from
@@ -43,8 +43,8 @@
 
 #define PCI_INVALID_VENDOR_ID (0xFFFF)
 
-#endif // WITH_KERNEL_PCIE
+#endif  // WITH_KERNEL_PCIE
 
-__END_CDECLS;
+__END_CDECLS
 
-#endif // ZIRCON_HW_PCI_H_
+#endif  // SYSROOT_ZIRCON_HW_PCI_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-audio.h b/arch/arm64/sysroot/include/zircon/hw/usb-audio.h
deleted file mode 100644
index 7af2994..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-audio.h
+++ /dev/null
@@ -1,524 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS;
-
-////////////////////////////////////////////////////
-//
-// General Audio interface constants
-//
-////////////////////////////////////////////////////
-
-// audio interface subclasses
-#define USB_SUBCLASS_AUDIO_CONTROL              0x01
-#define USB_SUBCLASS_AUDIO_STREAMING            0x02
-#define USB_SUBCLASS_MIDI_STREAMING             0x03
-
-// audio class specific descriptor types
-#define USB_AUDIO_CS_DEVICE                     0x21
-#define USB_AUDIO_CS_CONFIGURATION              0x22
-#define USB_AUDIO_CS_STRING                     0x23
-#define USB_AUDIO_CS_INTERFACE                  0x24
-#define USB_AUDIO_CS_ENDPOINT                   0x25
-
-////////////////////////////////////////////////////
-//
-// Audio Control interface constants
-//
-////////////////////////////////////////////////////
-
-// audio class specific AC interface descriptor subtypes
-#define USB_AUDIO_AC_HEADER                     0x01
-#define USB_AUDIO_AC_INPUT_TERMINAL             0x02
-#define USB_AUDIO_AC_OUTPUT_TERMINAL            0x03
-#define USB_AUDIO_AC_MIXER_UNIT                 0x04
-#define USB_AUDIO_AC_SELECTOR_UNIT              0x05
-#define USB_AUDIO_AC_FEATURE_UNIT               0x06
-#define USB_AUDIO_AC_PROCESSING_UNIT            0x07
-#define USB_AUDIO_AC_EXTENSION_UNIT             0x08
-
-// processing unit process types
-#define USB_AUDIO_UP_DOWN_MIX_PROCESS           0x01
-#define USB_AUDIO_DOLBY_PROLOGIC_PROCESS        0x02
-#define USB_AUDIO_3D_STEREO_EXTENDER_PROCESS    0x03
-#define USB_AUDIO_REVERBERATION_PROCESS         0x04
-#define USB_AUDIO_CHORUS_PROCESS                0x05
-#define USB_AUDIO_DYN_RANGE_COMP_PROCESS        0x06
-
-// audio class specific endpoint descriptor subtypes
-#define USB_AUDIO_EP_GENERAL                    0x01
-
-// audio class specific request codes
-#define USB_AUDIO_SET_CUR                       0x01
-#define USB_AUDIO_GET_CUR                       0x81
-#define USB_AUDIO_SET_MIN                       0x02
-#define USB_AUDIO_GET_MIN                       0x82
-#define USB_AUDIO_SET_MAX                       0x03
-#define USB_AUDIO_GET_MAX                       0x83
-#define USB_AUDIO_SET_RES                       0x04
-#define USB_AUDIO_GET_RES                       0x84
-#define USB_AUDIO_SET_MEM                       0x05
-#define USB_AUDIO_GET_MEM                       0x85
-#define USB_AUDIO_GET_STAT                      0xFF
-
-// terminal control selectors
-#define USB_AUDIO_COPY_PROTECT_CONTROL          0x01
-
-// feature unit control selectors
-#define USB_AUDIO_MUTE_CONTROL                  0x01
-#define USB_AUDIO_VOLUME_CONTROL                0x02
-#define USB_AUDIO_BASS_CONTROL                  0x03
-#define USB_AUDIO_MID_CONTROL                   0x04
-#define USB_AUDIO_TREBLE_CONTROL                0x05
-#define USB_AUDIO_GRAPHIC_EQUALIZER_CONTROL     0x06
-#define USB_AUDIO_AUTOMATIC_GAIN_CONTROL        0x07
-#define USB_AUDIO_DELAY_CONTROL                 0x08
-#define USB_AUDIO_BASS_BOOST_CONTROL            0x09
-#define USB_AUDIO_LOUDNESS_CONTROL              0x0A
-
-// feature unit control support bitmasks
-#define USB_AUDIO_FU_BMA_MUTE                   (1u << 0u)
-#define USB_AUDIO_FU_BMA_VOLUME                 (1u << 1u)
-#define USB_AUDIO_FU_BMA_BASS                   (1u << 2u)
-#define USB_AUDIO_FU_BMA_MID                    (1u << 3u)
-#define USB_AUDIO_FU_BMA_TREBLE                 (1u << 4u)
-#define USB_AUDIO_FU_BMA_GRAPHIC_EQUALIZER      (1u << 5u)
-#define USB_AUDIO_FU_BMA_AUTOMATIC_GAIN         (1u << 6u)
-#define USB_AUDIO_FU_BMA_DELAY                  (1u << 7u)
-#define USB_AUDIO_FU_BMA_BASS_BOOST             (1u << 8u)
-#define USB_AUDIO_FU_BMA_LOUDNESS               (1u << 9u)
-
-// up/down mix processing unit control selectors
-#define USB_AUDIO_UD_ENABLE_CONTROL             0x01
-#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
-#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
-
-// Dolby Prologic processing unit control selectors
-#define USB_AUDIO_DP_ENABLE_CONTROL             0x01
-#define USB_AUDIO_DP_MODE_SELECT_CONTROL        0x02
-
-// 3D stereo extender processing unit control selectors
-#define USB_AUDIO_3D_ENABLE_CONTROL             0x01
-#define USB_AUDIO_SPACIOUSNESS_CONTROL          0x03
-
-// reverberation processing unit control selectors
-#define USB_AUDIO_RV_ENABLE_CONTROL             0x01
-#define USB_AUDIO_REVERB_LEVEL_CONTROL          0x02
-#define USB_AUDIO_REVERB_TIME_CONTROL           0x03
-#define USB_AUDIO_REVERB_FEEDBACK_CONTROL       0x04
-
-// chorus processing unit control selectors
-#define USB_AUDIO_CH_ENABLE_CONTROL             0x01
-#define USB_AUDIO_CHORUS_LEVEL_CONTROL          0x02
-#define USB_AUDIO_CHORUS_RATE_CONTROL           0x03
-#define USB_AUDIO_CHORUS_DEPTH_CONTROL          0x04
-
-// dynamic range compressor processing unit control selectors
-#define USB_AUDIO_DR_ENABLE_CONTROL             0x01
-#define USB_AUDIO_COMPRESSION_RATE_CONTROL      0x02
-#define USB_AUDIO_MAXAMPL_CONTROL               0x03
-#define USB_AUDIO_THRESHOLD_CONTROL             0x04
-#define USB_AUDIO_ATTACK_TIME                   0x05
-#define USB_AUDIO_RELEASE_TIME                  0x06
-
-// extension unit control selectors
-#define USB_AUDIO_XU_ENABLE_CONTROL             0x01
-
-// endpoint control selectors
-#define USB_AUDIO_SAMPLING_FREQ_CONTROL         0x01
-#define USB_AUDIO_PITCH_CONTROL                 0x02
-
-// USB audio terminal types
-#define USB_AUDIO_TERMINAL_USB_UNDEFINED                0x0100
-#define USB_AUDIO_TERMINAL_USB_STREAMING                0x0101
-#define USB_AUDIO_TERMINAL_USB_VENDOR                   0x01FF
-#define USB_AUDIO_TERMINAL_INPUT_UNDEFINED              0x0200
-#define USB_AUDIO_TERMINAL_MICROPHONE                   0x0201
-#define USB_AUDIO_TERMINAL_DESKTOP_MICROPHONE           0x0202
-#define USB_AUDIO_TERMINAL_PERSONAL_MICROPHONE          0x0203
-#define USB_AUDIO_TERMINAL_OMNI_DIRECTIONAL_MICROPHONE  0x0204
-#define USB_AUDIO_TERMINAL_MICROPHONE_ARRAY             0x0205
-#define USB_AUDIO_TERMINAL_PROCESSING_MICROPHONE_ARRAY  0x0206
-#define USB_AUDIO_TERMINAL_OUTPUT_UNDEFINED             0x0300
-#define USB_AUDIO_TERMINAL_SPEAKER                      0x0301
-#define USB_AUDIO_TERMINAL_HEADPHONES                   0x0302
-#define USB_AUDIO_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO   0x0303
-#define USB_AUDIO_TERMINAL_DESKTOP_SPEAKER              0x0304
-#define USB_AUDIO_TERMINAL_ROOM_SPEAKER                 0x0305
-#define USB_AUDIO_TERMINAL_COMMUNICATION_SPEAKER        0x0306
-#define USB_AUDIO_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER     0x0307
-#define USB_AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED      0x0400
-#define USB_AUDIO_TERMINAL_HANDSET                      0x0401
-#define USB_AUDIO_TERMINAL_HEADSET                      0x0402
-#define USB_AUDIO_TERMINAL_SPEAKERPHONE                 0x0403
-#define USB_AUDIO_TERMINAL_ECHO_SUPPRESSING_SPEAKERPHONE 0x0404
-#define USB_AUDIO_TERMINAL_ECHO_CANCELING_SPEAKERPHONE  0x0405
-#define USB_AUDIO_TERMINAL_TELEPHONY_UNDEFINED          0x0500
-#define USB_AUDIO_TERMINAL_PHONE_LINE                   0x0501
-#define USB_AUDIO_TERMINAL_TELEPHONE                    0x0502
-#define USB_AUDIO_TERMINAL_DOWN_LINE_PHONE              0x0503
-#define USB_AUDIO_TERMINAL_EXTERNAL_UNDEFINED           0x0600
-#define USB_AUDIO_TERMINAL_ANALOG_CONNECTOR             0x0601
-#define USB_AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE      0x0602
-#define USB_AUDIO_TERMINAL_LINE_CONNECTOR               0x0603
-#define USB_AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR       0x0604
-#define USB_AUDIO_TERMINAL_SPDIF_INTERFACE              0x0605
-#define USB_AUDIO_TERMINAL_1394_DA_STREAM               0x0606
-#define USB_AUDIO_TERMINAL_1394_DV_STREAM_SOUNDTRACK    0x0607
-#define USB_AUDIO_TERMINAL_EMBEDDED_UNDEFINED           0x0700
-#define USB_AUDIO_TERMINAL_LEVEL_CALIBRATION_NOISE_SOURCE 0x0701
-#define USB_AUDIO_TERMINAL_EQUALIZATION_NOISE           0x0702
-#define USB_AUDIO_TERMINAL_CD_PLAYER                    0x0703
-#define USB_AUDIO_TERMINAL_DAT                          0x0704
-#define USB_AUDIO_TERMINAL_DCC                          0x0705
-#define USB_AUDIO_TERMINAL_MINI_DISK                    0x0706
-#define USB_AUDIO_TERMINAL_ANALOG_TAPE                  0x0707
-#define USB_AUDIO_TERMINAL_PHONOGRAPH                   0x0708
-#define USB_AUDIO_TERMINAL_VCR_AUDIO                    0x0709
-#define USB_AUDIO_TERMINAL_VIDEO_DISK_AUDIO             0x070A
-#define USB_AUDIO_TERMINAL_DVD_AUDIO                    0x070B
-#define USB_AUDIO_TERMINAL_TV_TUNER_AUDIO               0x070C
-#define USB_AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO     0x070D
-#define USB_AUDIO_TERMINAL_CABLE_TUNER_AUDIO            0x070E
-#define USB_AUDIO_TERMINAL_DSS_AUDIO                    0x070F
-#define USB_AUDIO_TERMINAL_RADIO_RECEIVER               0x0710
-#define USB_AUDIO_TERMINAL_RADIO_TRANSMITTER            0x0711
-#define USB_AUDIO_TERMINAL_MULTI_TRACK_RECORDER         0x0712
-#define USB_AUDIO_TERMINAL_SYNTHESIZER                  0x0713
-
-////////////////////////////////////////////////////
-//
-// Audio streaming interface constants
-//
-////////////////////////////////////////////////////
-
-// Audio stream class-specific AS interface descriptor subtypes
-#define USB_AUDIO_AS_GENERAL                    0x01
-#define USB_AUDIO_AS_FORMAT_TYPE                0x02
-#define USB_AUDIO_AS_FORMAT_SPECIFIC            0x03
-
-// wFormatTag values present in the class specific AS header
-// Defined in Section A.1 of USB Device Class Definition for Audio Data Formats
-#define USB_AUDIO_AS_FT_TYPE_I_UNDEFINED        0x0000
-#define USB_AUDIO_AS_FT_PCM                     0x0001
-#define USB_AUDIO_AS_FT_PCM8                    0x0002
-#define USB_AUDIO_AS_FT_IEEE_FLOAT              0x0003
-#define USB_AUDIO_AS_FT_ALAW                    0x0004
-#define USB_AUDIO_AS_FT_MULAW                   0x0005
-#define USB_AUDIO_AS_FT_TYPE_II_UNDEFINED       0x1000
-#define USB_AUDIO_AS_FT_MPEG                    0x1001
-#define USB_AUDIO_AS_FT_AC3                     0x1002
-#define USB_AUDIO_AS_FT_TYPE_III_UNDEFINED      0x2000
-#define USB_AUDIO_AS_FT_IEC1937_AC3             0x2001
-#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L1        0x2002
-#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L23       0x2003
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_EXT       0x2004
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L1_LS     0x2005
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L23_LS    0x2006
-
-// Audio stream class-specific format-specific types
-#define USB_AUDIO_FORMAT_TYPE_UNDEFINED         0x00
-#define USB_AUDIO_FORMAT_TYPE_I                 0x01
-#define USB_AUDIO_FORMAT_TYPE_II                0x02
-#define USB_AUDIO_FORMAT_TYPE_III               0x03
-
-////////////////////////////////////////////////////
-//
-// MIDI streaming interface constants
-//
-////////////////////////////////////////////////////
-
-// MIDI class specific MS interface descriptor subtypes
-#define USB_MIDI_MS_HEADER                      0x01
-#define USB_MIDI_IN_JACK                        0x02
-#define USB_MIDI_OUT_JACK                       0x03
-#define USB_MIDI_ELEMENT                        0x04
-
-// MIDI class specific MS endpoint descriptor subtypes
-#define USB_MIDI_MS_GENERAL                     0x01
-
-// MIDI IN and OUT jack types
-#define USB_MIDI_JACK_EMBEDDED                  0x01
-#define USB_MIDI_JACK_INTERNAL                  0x02
-
-// MIDI endpoint control selectors
-#define USB_MIDI_ASSOCIATION_CONTROL            0x01
-
-
-// Top level header structure shared by all USB audio descriptors.
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;
-} __PACKED usb_audio_desc_header;
-
-// Audio Control Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_HEADER
-    uint16_t bcdADC;
-    uint16_t wTotalLength;
-    uint8_t bInCollection;
-    uint8_t baInterfaceNr[];
-} __PACKED usb_audio_ac_header_desc;
-
-// Common header structure shared by all unit and terminal descriptors found in
-// an Audio Control interface descriptor.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_.*_(TERMINAL|UNIT)
-    uint8_t bID;
-} __PACKED usb_audio_ac_ut_desc;
-
-// Common header structure shared by all terminal descriptors found in an Audio
-// Control interface descriptor.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_(INPUT|OUTPUT)_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-} __PACKED usb_audio_ac_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_INPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t iTerminal;
-} __PACKED usb_audio_ac_input_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_OUTPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bSourceID;
-    uint8_t iTerminal;
-} __PACKED usb_audio_ac_output_terminal_desc;
-
-// Note: Mixer unit descriptors contain two inlined variable length arrays, each
-// with descriptor data following them.  They are therefor described using 3
-// structure definitions which are logically concatenated, but separated by the
-// inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_MIXER_UNIT
-    uint8_t bUnitID;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_mixer_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_mixer_unit_desc_1;
-
-typedef struct {
-    uint8_t iMixer;
-} __PACKED usb_audio_ac_mixer_unit_desc_2;
-
-// Note: Selector unit descriptors contain an inlined variable length array with
-// descriptor data following it.  They are therefor described using 2 structure
-// definitions which are logically concatenated, but separated by the inline
-// array.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_SELECTOR_UNIT
-    uint8_t bUnitID;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_selector_unit_desc_0;
-
-typedef struct {
-    uint8_t iSelector;
-} __PACKED usb_audio_ac_selector_unit_desc_1;
-
-// Note: Feature unit descriptors contain an inlined variable length array with
-// descriptor data following it.  They are therefor described using 2 structure
-// definitions which are logically concatenated, but separated by the inline
-// array.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_FEATURE_UNIT
-    uint8_t bUnitID;
-    uint8_t bSourceID;
-    uint8_t bControlSize;
-    uint8_t bmaControls[];
-} __PACKED usb_audio_ac_feature_unit_desc_0;
-
-typedef struct {
-    uint8_t iFeature;
-} __PACKED usb_audio_ac_feature_unit_desc_1;
-
-// Note: Processing unit descriptors contain two inlined variable length arrays,
-// each with descriptor data following them.  They are therefor described using
-// 3 structure definitions which are logically concatinated, but separated by
-// the inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_PROCESSING_UNIT
-    uint8_t bUnitID;
-    uint16_t wProcessType;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_processing_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bControlSize;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_processing_unit_desc_1;
-
-typedef struct {
-    uint8_t iProcessing;
-    // Note: The Process-specific control structure follows this with the
-    // structure type determined by wProcessType
-    // TODO(johngro) : Define the process specific control structures.  As of
-    // the 1.0 revision of the USB audio spec, the types to be defined are...
-    //
-    // ** Up/Down-mix
-    // ** Dolby Prologic
-    // ** 3D-Stereo Extender
-    // ** Reverberation
-    // ** Chorus
-    // ** Dynamic Range Compressor
-} __PACKED usb_audio_ac_processing_unit_desc_2;
-
-// Note: Extension unit descriptors contain two inlined variable length arrays,
-// each with descriptor data following them.  They are therefor described using
-// 3 structure definitions which are logically concatenated, but separated by
-// the inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_EXTENSION_UNIT
-    uint8_t bUnitID;
-    uint16_t wExtensionCode;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_extension_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bControlSize;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_extension_unit_desc_1;
-
-typedef struct {
-    uint8_t iExtension;
-} __PACKED usb_audio_ac_extension_unit_desc_2;
-
-// Audio Streaming Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_GENERAL
-    uint8_t bTerminalLink;
-    uint8_t bDelay;
-    uint16_t wFormatTag;
-} __PACKED usb_audio_as_header_desc;
-
-typedef struct {
-    uint8_t freq[3];            // 24 bit unsigned integer, little-endian
-} __PACKED usb_audio_as_samp_freq;
-
-// Common header used by all format type descriptors
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
-    uint8_t bFormatType;
-} __PACKED usb_audio_as_format_type_hdr;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
-    uint8_t bFormatType;            // USB_AUDIO_FORMAT_TYPE_I
-    uint8_t bNrChannels;
-    uint8_t bSubFrameSize;
-    uint8_t bBitResolution;
-    uint8_t bSamFreqType;           // number of sampling frequencies
-    usb_audio_as_samp_freq tSamFreq[]; // list of sampling frequencies (3 bytes each)
-} __PACKED usb_audio_as_format_type_i_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_EP_GENERAL
-    uint8_t bmAttributes;
-    uint8_t bLockDelayUnits;
-    uint16_t wLockDelay;
-} __PACKED usb_audio_as_isoch_ep_desc;
-
-// MIDI Streaming Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_HEADER
-    uint16_t bcdMSC;
-    uint16_t wTotalLength;
-} __PACKED usb_midi_ms_header_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_IN_JACK
-    uint8_t bJackType;
-    uint8_t bJackID;
-    uint8_t iJack;
-} __PACKED usb_midi_ms_in_jack_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_OUT_JACK
-    uint8_t bJackType;
-    uint8_t bJackID;
-    uint8_t bNrInputPins;
-    uint8_t baSourceID;
-    uint8_t baSourcePin;
-} __PACKED usb_midi_ms_out_jack_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_GENERAL
-    uint8_t bNumEmbMIDIJack;
-    uint8_t baAssocJackID[];
-} __PACKED usb_midi_ms_endpoint_desc;
-
-__END_CDECLS;
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-cdc.h b/arch/arm64/sysroot/include/zircon/hw/usb-cdc.h
deleted file mode 100644
index f64a422..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-cdc.h
+++ /dev/null
@@ -1,138 +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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-
-/* CDC Subclasses for the Communications Interface Class */
-#define USB_CDC_SUBCLASS_DIRECT_LINE       0x01
-#define USB_CDC_SUBCLASS_ABSTRACT          0x02
-#define USB_CDC_SUBCLASS_TELEPHONE         0x03
-#define USB_CDC_SUBCLASS_MULTI_CHANNEL     0x04
-#define USB_CDC_SUBCLASS_CAPI              0x05
-#define USB_CDC_SUBCLASS_ETHERNET          0x06
-#define USB_CDC_SUBCLASS_ATM               0x07
-#define USB_CDC_SUBCLASS_WIRELESS_HANDSET  0x08
-#define USB_CDC_SUBCLASS_DEVICE_MGMT       0x09
-#define USB_CDC_SUBCLASS_MOBILE_DIRECT     0x0A
-#define USB_CDC_SUBCLASS_OBEX              0x0B
-#define USB_CDC_SUBCLASS_ETHERNET_EMU      0x0C
-#define USB_CDC_SUBCLASS_NETWORK_CTRL      0x0D
-
-/* CDC Descriptor SubTypes */
-#define USB_CDC_DST_HEADER                    0x00
-#define USB_CDC_DST_CALL_MGMT                 0x01
-#define USB_CDC_DST_ABSTRACT_CTRL_MGMT        0x02
-#define USB_CDC_DST_DIRECT_LINE_MGMT          0x03
-#define USB_CDC_DST_TELEPHONE_RINGER          0x04
-#define USB_CDC_DST_TELEPHONE_CALL_REPORTING  0x05
-#define USB_CDC_DST_UNION                     0x06
-#define USB_CDC_DST_COUNTRY_SELECTION         0x07
-#define USB_CDC_DST_TELEPHONE_OP_MODES        0x08
-#define USB_CDC_DST_USB_TERMINAL              0x09
-#define USB_CDC_DST_NETWORK_CHANNEL           0x0A
-#define USB_CDC_DST_PROTOCOL_UNIT             0x0B
-#define USB_CDC_DST_EXTENSION_UNIT            0x0C
-#define USB_CDC_DST_MULTI_CHANNEL_MGMT        0x0D
-#define USB_CDC_DST_CAPI_CTRL_MGMT            0x0E
-#define USB_CDC_DST_ETHERNET                  0x0F
-#define USB_CDC_DST_ATM_NETWORKING            0x10
-#define USB_CDC_DST_WIRELESS_HANDSET_CTRL     0x11
-#define USB_CDC_DST_MOBILE_DIRECT_LINE        0x12
-#define USB_CDC_DST_MDLM_DETAIL               0x13
-#define USB_CDC_DST_DEVICE_MGMT               0x14
-#define USB_CDC_DST_OBEX                      0x15
-#define USB_CDC_DST_COMMAND_SET               0x16
-#define USB_CDC_DST_COMMAND_SET_DETAIL        0x17
-#define USB_CDC_DST_TELEPHONE_CTRL            0x18
-#define USB_CDC_DST_OBEX_SERVICE_ID           0x19
-#define USB_CDC_DST_NCM                       0x1A
-
-/* CDC Class-Specific Notification Codes */
-#define USB_CDC_NC_NETWORK_CONNECTION       0x00
-#define USB_CDC_NC_RESPONSE_AVAILABLE       0x01
-#define USB_CDC_NC_SERIAL_STATE             0x20
-#define USB_CDC_NC_CONNECTION_SPEED_CHANGE  0x2A
-
-/* CDC Ethernet Class-Specific Request Codes */
-#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
-#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
-#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
-#define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
-#define USB_CDC_GET_ETHERNET_STATISTIC          0x44
-
-/* CDC Class-Specific Requests */
-#define USB_CDC_SEND_ENCAPSULATED_COMMAND   0x00
-#define USB_CDC_GET_ENCAPSULATED_RESPONSE   0x01
-
-__BEGIN_CDECLS;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_HEADER
-    uint16_t bcdCDC;
-} __attribute__ ((packed)) usb_cs_header_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_CALL_MGMT
-    uint8_t bmCapabilities;
-    uint8_t bDataInterface;
-} __attribute__ ((packed)) usb_cs_call_mgmt_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_ABSTRACT_CTRL_MGMT
-    uint8_t bmCapabilities;
-} __attribute__ ((packed)) usb_cs_abstract_ctrl_mgmt_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
-    uint8_t bControlInterface;
-    uint8_t bSubordinateInterface[];
-} __attribute__ ((packed)) usb_cs_union_interface_descriptor_t;
-
-// fixed size version of usb_cs_union_interface_descriptor_t
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
-    uint8_t bControlInterface;
-    uint8_t bSubordinateInterface;
-} __attribute__ ((packed)) usb_cs_union_interface_descriptor_1_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_ETHERNET
-    uint8_t iMACAddress;
-    uint32_t bmEthernetStatistics;
-    uint16_t wMaxSegmentSize;
-    uint16_t wNumberMCFilters;
-    uint8_t bNumberPowerFilters;
-} __attribute__ ((packed)) usb_cs_ethernet_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bmRequestType;
-    uint8_t bNotification;
-    uint16_t wValue;
-    uint16_t wIndex;
-    uint16_t wLength;
-} __attribute__ ((packed)) usb_cdc_notification_t;
-
-typedef struct {
-    usb_cdc_notification_t notification;
-    uint32_t downlink_br;
-    uint32_t uplink_br;
- } __attribute__ ((packed)) usb_cdc_speed_change_notification_t;
-
-__END_CDECLS;
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-hid.h b/arch/arm64/sysroot/include/zircon/hw/usb-hid.h
deleted file mode 100644
index d8be878..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-hid.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-__BEGIN_CDECLS;
-
-/* HID Request Values */
-#define USB_HID_GET_REPORT                  0x01
-#define USB_HID_GET_IDLE                    0x02
-#define USB_HID_GET_PROTOCOL                0x03
-#define USB_HID_SET_REPORT                  0x09
-#define USB_HID_SET_IDLE                    0x0A
-#define USB_HID_SET_PROTOCOL                0x0B
-
-typedef struct {
-    uint8_t bDescriptorType;
-    uint16_t wDescriptorLength;
-} __attribute__((packed)) usb_hid_descriptor_entry_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;
-    uint16_t bcdHID;
-    uint8_t bCountryCode;
-    uint8_t bNumDescriptors;
-    usb_hid_descriptor_entry_t descriptors[];
-} __attribute__((packed)) usb_hid_descriptor_t;
-
-__END_CDECLS;
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-hub.h b/arch/arm64/sysroot/include/zircon/hw/usb-hub.h
deleted file mode 100644
index 2a8b395..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-hub.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-__BEGIN_CDECLS;
-
-// Hub request types
-#define USB_RECIP_HUB   (USB_TYPE_CLASS | USB_RECIP_DEVICE)
-#define USB_RECIP_PORT  (USB_TYPE_CLASS | USB_RECIP_OTHER)
-
-// Hub requests
-#define USB_HUB_SET_DEPTH       12
-
-// Hub descriptor types
-#define USB_HUB_DESC_TYPE       0x29
-#define USB_HUB_DESC_TYPE_SS    0x2A    // for superspeed hubs
-
-// Hub Class Feature Selectors (USB 2.0 spec Table 11.17)
-#define USB_FEATURE_C_HUB_LOCAL_POWER   0
-#define USB_FEATURE_C_HUB_OVER_CURRENT  1
-#define USB_FEATURE_PORT_CONNECTION     0
-#define USB_FEATURE_PORT_ENABLE         1
-#define USB_FEATURE_PORT_SUSPEND        2
-#define USB_FEATURE_PORT_OVER_CURRENT   3
-#define USB_FEATURE_PORT_RESET          4
-#define USB_FEATURE_PORT_LINK_STATE     5
-#define USB_FEATURE_PORT_POWER          8
-#define USB_FEATURE_PORT_LOW_SPEED      9
-#define USB_FEATURE_C_PORT_CONNECTION   16
-#define USB_FEATURE_C_PORT_ENABLE       17
-#define USB_FEATURE_C_PORT_SUSPEND      18
-#define USB_FEATURE_C_PORT_OVER_CURRENT 19
-#define USB_FEATURE_C_PORT_RESET        20
-#define USB_FEATURE_PORT_TEST           21
-#define USB_FEATURE_PORT_INDICATOR      22
-#define USB_FEATURE_PORT_INDICATOR      22
-#define USB_FEATURE_PORT_U1_TIMEOUT     23
-#define USB_FEATURE_PORT_U2_TIMEOUT     24
-#define USB_FEATURE_C_PORT_LINK_STATE   25
-#define USB_FEATURE_C_PORT_CONFIG_ERROR 26
-#define USB_FEATURE_PORT_REMOTE_WAKE_MASK 27
-#define USB_FEATURE_BH_PORT_RESET       28
-#define USB_FEATURE_C_BH_PORT_RESET     29
-#define USB_FEATURE_FORCE_LINKPM_ACCEPT 30
-
-typedef struct {
-    uint8_t bDescLength;
-    uint8_t bDescriptorType;
-    uint8_t bNbrPorts;
-    uint16_t wHubCharacteristics;
-    uint8_t bPowerOn2PwrGood;
-    uint8_t bHubContrCurrent;
-    union {
-        // USB 2.0
-        struct {
-            // variable length depending on number of ports
-            uint8_t  DeviceRemovable[4];
-            uint8_t  PortPwrCtrlMask[4];
-        }  __attribute__ ((packed)) hs;
-        // USB 3.0
-        struct {
-            uint8_t bHubHdrDecLat;
-            uint16_t wHubDelay;
-            uint16_t DeviceRemovable;
-        } __attribute__ ((packed)) ss;
-    } __attribute__ ((packed));
-} __attribute__ ((packed)) usb_hub_descriptor_t;
-
-typedef struct {
-    uint16_t wHubStatus;
-    uint16_t wHubChange;
-} __attribute__ ((packed)) usb_hub_status_t;
-
-// wHubStatus bits
-#define USB_HUB_LOCAL_POWER         (1 << 0)
-#define USB_HUB_OVER_CURRENT        (1 << 1)
-
-typedef struct {
-    uint16_t wPortStatus;
-    uint16_t wPortChange;
-} __attribute__ ((packed)) usb_port_status_t;
-
-// Port Status bits
-#define USB_PORT_CONNECTION         (1 << 0)
-#define USB_PORT_ENABLE             (1 << 1)
-#define USB_PORT_SUSPEND            (1 << 2)    // USB 2.0 only
-#define USB_PORT_OVER_CURRENT       (1 << 3)
-#define USB_PORT_RESET              (1 << 4)
-#define USB_PORT_POWER              (1 << 8)    // USB 2.0 only
-#define USB_PORT_LOW_SPEED          (1 << 9)    // USB 2.0 only
-#define USB_PORT_HIGH_SPEED         (1 << 10)   // USB 2.0 only
-#define USB_PORT_TEST_MODE          (1 << 11)   // USB 2.0 only
-#define USB_PORT_INDICATOR_CONTROL  (1 << 12)   // USB 2.0 only
-
-// Port Status Changed bits
-#define USB_C_PORT_CONNECTION       (1 << 0)
-#define USB_C_PORT_ENABLE           (1 << 1)    // USB 2.0 only
-#define USB_C_PORT_SUSPEND          (1 << 2)    // USB 2.0 only
-#define USB_C_PORT_OVER_CURRENT     (1 << 3)
-#define USB_C_PORT_RESET            (1 << 4)
-#define USB_C_BH_PORT_RESET         (1 << 5)    // USB 3.0 only
-#define USB_C_PORT_LINK_STATE       (1 << 6)    // USB 3.0 only
-#define USB_C_PORT_CONFIG_ERROR     (1 << 7)    // USB 3.0 only
-#define USB_C_PORT_POWER            (1 << 8)    // USB 2.0 only
-#define USB_C_PORT_LOW_SPEED        (1 << 9)    // USB 2.0 only
-#define USB_C_PORT_HIGH_SPEED       (1 << 10)   // USB 2.0 only
-#define USB_C_PORT_TEST_MODE        (1 << 11)   // USB 2.0 only
-#define USB_C_PORT_INDICATOR_CONTROL (1 << 12)   // USB 2.0 only
-
-__END_CDECLS;
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-mass-storage.h b/arch/arm64/sysroot/include/zircon/hw/usb-mass-storage.h
deleted file mode 100644
index f2d1d80..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-mass-storage.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-// SCSI commands
-#define UMS_TEST_UNIT_READY          0x00
-#define UMS_REQUEST_SENSE            0x03
-#define UMS_INQUIRY                  0x12
-#define UMS_MODE_SELECT6             0x15
-#define UMS_MODE_SENSE6              0x1A
-#define UMS_START_STOP_UNIT          0x1B
-#define UMS_TOGGLE_REMOVABLE         0x1E
-#define UMS_READ_FORMAT_CAPACITIES   0x23
-#define UMS_READ_CAPACITY10          0x25
-#define UMS_READ10                   0x28
-#define UMS_WRITE10                  0x2A
-#define UMS_SYNCHRONIZE_CACHE        0x35
-#define UMS_MODE_SELECT10            0x55
-#define UMS_MODE_SENSE10             0x5A
-#define UMS_READ16                   0x88
-#define UMS_WRITE16                  0x8A
-#define UMS_READ_CAPACITY16          0x9E
-#define UMS_READ12                   0xA8
-#define UMS_WRITE12                  0xAA
-
-// control request values
-#define USB_REQ_RESET               0xFF
-#define USB_REQ_GET_MAX_LUN         0xFE
-
-// error codes for CSW processing
-typedef uint32_t csw_status_t;
-#define CSW_SUCCESS      ((csw_status_t)0)
-#define CSW_FAILED       ((csw_status_t)1)
-#define CSW_PHASE_ERROR  ((csw_status_t)2)
-#define CSW_INVALID      ((csw_status_t)3)
-#define CSW_TAG_MISMATCH ((csw_status_t)4)
-
-// signatures in header and status
-#define CBW_SIGNATURE               0x43425355
-#define CSW_SIGNATURE               0x53425355
-
-// transfer lengths
-#define UMS_INQUIRY_TRANSFER_LENGTH                0x24
-#define UMS_REQUEST_SENSE_TRANSFER_LENGTH          0x12
-#define UMS_READ_FORMAT_CAPACITIES_TRANSFER_LENGTH 0xFC
-
-// 6 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint16_t    lba;    // logical block address
-    uint8_t     length;
-    uint8_t     control;
-} __PACKED scsi_command6_t;
-static_assert(sizeof(scsi_command6_t) == 6, "");
-
-// 10 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint32_t    lba;    // logical block address
-    uint8_t     misc2;
-    uint8_t     length_hi; // break length into two pieces to avoid odd alignment
-    uint8_t     length_lo;
-    uint8_t     control;
-} __PACKED scsi_command10_t;
-static_assert(sizeof(scsi_command10_t) == 10, "");
-
-// 12 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint32_t    lba;    // logical block address
-    uint32_t    length;
-    uint8_t     misc2;
-    uint8_t     control;
-} __PACKED scsi_command12_t;
-static_assert(sizeof(scsi_command12_t) == 12, "");
-
-// 16 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint64_t    lba;    // logical block address
-    uint32_t    length;
-    uint8_t     misc2;
-    uint8_t     control;
-} __PACKED scsi_command16_t;
-static_assert(sizeof(scsi_command16_t) == 16, "");
-
-// SCSI Read Capacity 10 payload
-// This is big endian
-typedef struct {
-    uint32_t    lba;
-    uint32_t    block_length;
-} __PACKED scsi_read_capacity_10_t;
-static_assert(sizeof(scsi_read_capacity_10_t) == 8, "");
-
-// SCSI Read Capacity 16 payload
-// This is big endian
-typedef struct {
-    uint64_t    lba;
-    uint32_t    block_length;
-    uint8_t     ptype_prot_en;  // bit 0: PROT_EN, bits 1-3: P_TYPE
-    uint8_t     resesrved[19];
-} __PACKED scsi_read_capacity_16_t;
-static_assert(sizeof(scsi_read_capacity_16_t) == 32, "");
-
-// SCSI Mode Sense 6 command
-typedef struct {
-    uint8_t     opcode; // UMS_MODE_SENSE6
-    uint8_t     disable_block_desc;
-    uint8_t     page;
-    uint8_t     subpage;
-    uint8_t     allocation_length;
-    uint8_t     control;
-} __PACKED scsi_mode_sense_6_command_t;
-static_assert(sizeof(scsi_mode_sense_6_command_t) == 6, "");
-
-// SCSI Mode Sense 6 data response
-typedef struct {
-    uint8_t     mode_data_length;
-    uint8_t     medium_type;
-    uint8_t     device_specific_param;
-    uint8_t     block_desc_length;
-} __PACKED scsi_mode_sense_6_data_t;
-#define MODE_SENSE_DSP_RO   0x80    //  bit 7 of device_specific_param: read-only
-
-// Command Block Wrapper
-typedef struct {
-    uint32_t    dCBWSignature;      // CBW_SIGNATURE
-    uint32_t    dCBWTag;
-    uint32_t    dCBWDataTransferLength;
-    uint8_t     bmCBWFlags;
-    uint8_t     bCBWLUN;
-    uint8_t     bCBWCBLength;
-    uint8_t     CBWCB[16];
-} __PACKED ums_cbw_t;
-static_assert(sizeof(ums_cbw_t) == 31, "");
-
-// Command Status Wrapper
-typedef struct {
-    uint32_t    dCSWSignature;      // CSW_SIGNATURE
-    uint32_t    dCSWTag;
-    uint32_t    dCSWDataResidue;
-    uint8_t     bmCSWStatus;
-} __PACKED ums_csw_t;
-static_assert(sizeof(ums_csw_t) == 13, "");
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb-video.h b/arch/arm64/sysroot/include/zircon/hw/usb-video.h
deleted file mode 100644
index 1ff6e22..0000000
--- a/arch/arm64/sysroot/include/zircon/hw/usb-video.h
+++ /dev/null
@@ -1,304 +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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-
-__BEGIN_CDECLS;
-
-// video interface subclasses
-#define USB_SUBCLASS_VIDEO_CONTROL                 0x01
-#define USB_SUBCLASS_VIDEO_STREAMING               0x02
-#define USB_SUBCLASS_VIDEO_INTERFACE_COLLECTION    0x03
-
-// video class specific descriptor types
-#define USB_VIDEO_CS_DEVICE                        0x21
-#define USB_VIDEO_CS_CONFIGURATION                 0x22
-#define USB_VIDEO_CS_STRING                        0x23
-#define USB_VIDEO_CS_INTERFACE                     0x24
-#define USB_VIDEO_CS_ENDPOINT                      0x25
-
-// video class specific VC interface descriptor subtypes
-#define USB_VIDEO_VC_HEADER                        0x01
-#define USB_VIDEO_VC_INPUT_TERMINAL                0x02
-#define USB_VIDEO_VC_OUTPUT_TERMINAL               0x03
-#define USB_VIDEO_VC_SELECTOR_UNIT                 0x04
-#define USB_VIDEO_VC_PROCESSING_UNIT               0x05
-#define USB_VIDEO_VC_EXTENSION_UNIT                0x06
-#define USB_VIDEO_VC_ENCODING_UNIT                 0x07
-
-// video class specific VS interface descriptor subtypes
-#define USB_VIDEO_VS_INPUT_HEADER                  0x01
-#define USB_VIDEO_VS_OUTPUT_HEADER                 0x02
-#define USB_VIDEO_VS_STILL_IMAGE_FRAME             0x03
-#define USB_VIDEO_VS_FORMAT_UNCOMPRESSED           0x04
-#define USB_VIDEO_VS_FRAME_UNCOMPRESSED            0x05
-#define USB_VIDEO_VS_FORMAT_MJPEG                  0x06
-#define USB_VIDEO_VS_FRAME_MJPEG                   0x07
-#define USB_VIDEO_VS_FORMAT_MPEG2TS                0x0A
-#define USB_VIDEO_VS_FORMAT_DV                     0x0C
-#define USB_VIDEO_VS_COLORFORMAT                   0x0D
-#define USB_VIDEO_VS_FORMAT_FRAME_BASED            0x10
-#define USB_VIDEO_VS_FRAME_FRAME_BASED             0x11
-#define USB_VIDEO_VS_FORMAT_STREAM_BASED           0x12
-#define USB_VIDEO_VS_FORMAT_H264                   0x13
-#define USB_VIDEO_VS_FRAME_H264                    0x14
-#define USB_VIDEO_VS_FORMAT_H264_SIMULCAST         0x15
-#define USB_VIDEO_VS_FORMAT_VP8                    0x16
-#define USB_VIDEO_VS_FRAME_VP8                     0x17
-#define USB_VIDEO_VS_FORMAT_VP8_SIMULCAST          0x18
-
-// video class specific endpoint descriptor subtypes
-#define USB_VIDEO_EP_GENERAL                       0x01
-#define USB_VIDEO_EP_ENDPOINT                      0x02
-#define USB_VIDEO_EP_INTERRUPT                     0x03
-
-// video class specific request codes
-#define USB_VIDEO_SET_CUR                          0x01
-#define USB_VIDEO_SET_CUR_ALL                      0x11
-#define USB_VIDEO_GET_CUR                          0x81
-#define USB_VIDEO_GET_MIN                          0x82
-#define USB_VIDEO_GET_MAX                          0x83
-#define USB_VIDEO_GET_RES                          0x84
-#define USB_VIDEO_GET_LEN                          0x85
-#define USB_VIDEO_GET_INFO                         0x86
-#define USB_VIDEO_GET_DEF                          0x87
-#define USB_VIDEO_GET_CUR_ALL                      0x91
-#define USB_VIDEO_GET_MIN_ALL                      0x92
-#define USB_VIDEO_GET_MAX_ALL                      0x93
-#define USB_VIDEO_GET_RES_ALL                      0x94
-#define USB_VIDEO_GET_DEF_ALL                      0x97
-
-// video streaming interface control selectors
-#define USB_VIDEO_VS_PROBE_CONTROL                 0x01
-#define USB_VIDEO_VS_COMMIT_CONTROL                0x02
-#define USB_VIDEO_VS_STILL_PROBE_CONTROL           0x03
-#define USB_VIDEO_VS_STILL_COMMIT_CONTROL          0x04
-#define USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL   0x05
-#define USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL     0x06
-#define USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL    0x07
-#define USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL  0x08
-#define USB_VIDEO_VS_SYNCH_DELAY_CONTROL           0x09
-
-// header for usb_video_vc_* below
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;
-} __PACKED usb_video_vc_desc_header;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_HEADER
-    uint16_t bcdUVC;
-    uint16_t wTotalLength;
-    uint32_t dwClockFrequency;
-    uint8_t bInCollection;
-    uint8_t baInterfaceNr[];
-} __PACKED usb_video_vc_header_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_INPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t iTerminal;
-} __PACKED usb_video_vc_input_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_OUTPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bSourceID;
-    uint8_t iTerminal;
-} __PACKED usb_video_vc_output_terminal_desc;
-
-// class specific VC interrupt endpoint descriptor
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_ENDPOINT_INTERRUPT
-    uint16_t wMaxTransferSize;
-} __PACKED usb_video_vc_interrupt_endpoint_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VS_HEADER
-    uint8_t bNumFormats;
-    uint16_t wTotalLength;
-    uint8_t bEndpointAddress;
-    uint8_t bmInfo;
-    uint8_t bTerminalLink;
-    uint8_t bStillCaptureMethod;
-    uint8_t bTriggerSupport;
-    uint8_t bTriggerUsage;
-    uint8_t bControlSize;
-    uint8_t bmaControls[];
-} __PACKED usb_video_vs_input_header_desc;
-
-#define GUID_LENGTH 16
-
-// A GUID consists of a:
-//  - four-byte integer
-//  - two-byte integer
-//  - two-byte integer
-//  - eight-byte array
-//
-// The string representation uses big endian format, so to convert it
-// to a byte array we need to reverse the byte order of the three integers.
-//
-// See USB Video Class revision 1.5, FAQ section 2.9
-// for GUID Data Structure Layout.
-
-#define USB_VIDEO_GUID_YUY2_STRING "32595559-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_YUY2_VALUE { \
-    0x59, 0x55, 0x59, 0x32, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_NV12_STRING "3231564E-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_NV12_VALUE { \
-    0x4e, 0x56, 0x31, 0x32, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_M420_STRING "3032344D-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_M420_VALUE { \
-    0x4d, 0x34, 0x32, 0x30, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_I420_STRING "30323449-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_I420_VALUE { \
-    0x49, 0x34, 0x32, 0x30, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-// USB Video Payload Uncompressed
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_UNCOMPRESSED
-    uint8_t bFormatIndex;
-    uint8_t bNumFrameDescriptors;
-    uint8_t guidFormat[GUID_LENGTH];
-    uint8_t bBitsPerPixel;
-    uint8_t bDefaultFrameIndex;
-    uint8_t bAspectRatioX;
-    uint8_t bAspectRatioY;
-    uint8_t bmInterfaceFlags;
-    uint8_t bCopyProtect;
-} __PACKED usb_video_vs_uncompressed_format_desc;
-
-// USB Video Payload MJPEG
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_MJPEG
-    uint8_t bFormatIndex;
-    uint8_t bNumFrameDescriptors;
-    uint8_t bmFlags;
-    uint8_t bDefaultFrameIndex;
-    uint8_t bAspectRatioX;
-    uint8_t bAspectRatioY;
-    uint8_t bmInterfaceFlags;
-    uint8_t bCopyProtect;
-} __PACKED usb_video_vs_mjpeg_format_desc;
-
-// Uncompressed and MJPEG formats have the same frame descriptor structure.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FRAME_UNCOMPRESSED / USB_VIDEO_VS_FRAME_MJPEG
-    uint8_t bFrameIndex;
-    uint8_t bmCapabilities;
-    uint16_t wWidth;
-    uint16_t wHeight;
-    uint32_t dwMinBitRate;
-    uint32_t dwMaxBitRate;
-    uint32_t dwMaxVideoFrameBufferSize;
-    uint32_t dwDefaultFrameInterval;
-    uint8_t bFrameIntervalType;
-    uint32_t dwFrameInterval[];
-} __PACKED usb_video_vs_frame_desc;
-
-// Stream negotiation
-#define USB_VIDEO_BM_HINT_FRAME_INTERVAL        (1 << 0)
-#define USB_VIDEO_BM_HINT_KEY_FRAME_RATE        (1 << 1)
-#define USB_VIDEO_BM_HINT_P_FRAME_RATE          (1 << 2)
-#define USB_VIDEO_BM_HINT_COMP_QUALITY          (1 << 3)
-#define USB_VIDEO_BM_HINT_COMP_WINDOW_SIZE      (1 << 4)
-
-typedef struct {
-   uint16_t bmHint;
-   uint8_t bFormatIndex;
-   uint8_t bFrameIndex;
-   uint32_t dwFrameInterval;
-   uint16_t wKeyFrameRate;
-   uint16_t wPFrameRate;
-   uint16_t wCompQuality;
-   uint16_t wCompWindowSize;
-   uint16_t wDelay;
-   uint32_t dwMaxVideoFrameSize;
-   uint32_t dwMaxPayloadTransferSize;
-   // The following fields are optional.
-   uint32_t dwClockFrequency;
-   uint8_t bmFramingInfo;
-   uint8_t bPreferedVersion;
-   uint8_t bMinVersion;
-   uint8_t bMaxVersion;
-   uint8_t bUsage;
-   uint8_t bBitDepthLuma;
-   uint8_t bmSettings;
-   uint8_t bMaxNumberOfRefFramesPlus1;
-   uint16_t bmRateControlModes;
-   uint32_t bmLayoutPerStream;
-} __PACKED usb_video_vc_probe_and_commit_controls;
-
-// For accessing payload bmHeaderInfo bitmap
-#define USB_VIDEO_VS_PAYLOAD_HEADER_FID         (1 << 0)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_EOF         (1 << 1)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_PTS         (1 << 2)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_SCR         (1 << 3)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_RES         (1 << 4)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_STI         (1 << 5)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_ERR         (1 << 6)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_EOH         (1 << 7)
-
-// Common header for all payloads.
-typedef struct {
-    uint8_t bHeaderLength;
-    uint8_t bmHeaderInfo;
-
-} __PACKED usb_video_vs_payload_header;
-
-typedef struct {
-    uint8_t bHeaderLength;
-    uint8_t bmHeaderInfo;
-    uint32_t dwPresentationTime;
-    uint32_t scrSourceTimeClock;
-    // Frame number when the source clock was sampled.
-    uint16_t scrSourceClockSOFCounter;
-} __PACKED usb_video_vs_uncompressed_payload_header;
-
-__END_CDECLS;
-
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb.h b/arch/arm64/sysroot/include/zircon/hw/usb.h
index 697f7f0..c62e948 100644
--- a/arch/arm64/sysroot/include/zircon/hw/usb.h
+++ b/arch/arm64/sysroot/include/zircon/hw/usb.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_USB_H_
+#define SYSROOT_ZIRCON_HW_USB_H_
 
 // clang-format off
 
@@ -10,7 +11,7 @@
 #include <stdint.h>
 #include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // maximum number of endpoints per device
 #define USB_MAX_EPS                     32
@@ -59,11 +60,28 @@
 #define USB_CLASS_DIAGNOSTIC                0xdc
 #define USB_CLASS_WIRELESS                  0xe0
 #define USB_CLASS_MISC                      0xef
+#define USB_CLASS_APPLICATION_SPECIFIC      0xfe
 #define USB_CLASS_VENDOR                    0xFf
 
+#define USB_SUBCLASS_COMM_ACM               0x02
+
+#define USB_SUBCLASS_WIRELESS_MISC          0x01
+#define USB_PROTOCOL_WIRELESS_MISC_RNDIS    0x03
+
+#define USB_SUBCLASS_MSC_RNDIS              0x04
+#define USB_PROTOCOL_MSC_RNDIS_ETHERNET     0x01
+
 #define USB_SUBCLASS_MSC_SCSI               0x06
 #define USB_PROTOCOL_MSC_BULK_ONLY          0x50
 
+#define USB_SUBCLASS_DFU                    0x01
+#define USB_PROTOCOL_DFU                    0x02
+
+#define USB_SUBCLASS_VENDOR                 0xFF
+#define USB_PROTOCOL_TEST_FTDI              0x01
+#define USB_PROTOCOL_TEST_HID_ONE_ENDPOINT  0x02
+#define USB_PROTOCOL_TEST_HID_TWO_ENDPOINT  0x03
+
 /* Descriptor Types */
 #define USB_DT_DEVICE                      0x01
 #define USB_DT_CONFIG                      0x02
@@ -196,6 +214,9 @@
     uint16_t wMaxPacketSize;
     uint8_t bInterval;
 } __attribute__ ((packed)) usb_endpoint_descriptor_t;
+#define usb_ep_num(ep)          ((ep)->bEndpointAddress & USB_ENDPOINT_NUM_MASK)
+// usb_ep_num2() useful with you have bEndpointAddress outside of a descriptor.
+#define usb_ep_num2(addr)       ((addr) & USB_ENDPOINT_NUM_MASK)
 #define usb_ep_direction(ep)    ((ep)->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
 #define usb_ep_type(ep)         ((ep)->bmAttributes & USB_ENDPOINT_TYPE_MASK)
 #define usb_ep_sync_type(ep)    ((ep)->bmAttributes & USB_ENDPOINT_SYNCHRONIZATION_MASK)
@@ -207,6 +228,18 @@
 
 typedef struct {
     uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_DEVICE_QUALIFIER
+    uint16_t bcdUSB;
+    uint8_t bDeviceClass;
+    uint8_t bDeviceSubClass;
+    uint8_t bDeviceProtocol;
+    uint8_t bMaxPacketSize0;
+    uint8_t bNumConfigurations;
+    uint8_t bReserved;
+} __attribute__ ((packed)) usb_device_qualifier_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
     uint8_t bDescriptorType;    // USB_DT_SS_EP_COMPANION
     uint8_t bMaxBurst;
     uint8_t bmAttributes;
@@ -239,4 +272,18 @@
     uint8_t bDescriptorSubType;
 } __attribute__ ((packed)) usb_cs_interface_descriptor_t;
 
-__END_CDECLS;
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_STRING
+    uint16_t wLangIds[127];
+} __attribute__ ((packed)) usb_langid_desc_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_STRING
+    uint16_t code_points[127];
+} __attribute__ ((packed)) usb_string_desc_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/audio.h b/arch/arm64/sysroot/include/zircon/hw/usb/audio.h
new file mode 100644
index 0000000..4e68f87
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/audio.h
@@ -0,0 +1,527 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_AUDIO_H_
+#define SYSROOT_ZIRCON_HW_USB_AUDIO_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+////////////////////////////////////////////////////
+//
+// General Audio interface constants
+//
+////////////////////////////////////////////////////
+
+// audio interface subclasses
+#define USB_SUBCLASS_AUDIO_CONTROL              0x01
+#define USB_SUBCLASS_AUDIO_STREAMING            0x02
+#define USB_SUBCLASS_MIDI_STREAMING             0x03
+
+// audio class specific descriptor types
+#define USB_AUDIO_CS_DEVICE                     0x21
+#define USB_AUDIO_CS_CONFIGURATION              0x22
+#define USB_AUDIO_CS_STRING                     0x23
+#define USB_AUDIO_CS_INTERFACE                  0x24
+#define USB_AUDIO_CS_ENDPOINT                   0x25
+
+////////////////////////////////////////////////////
+//
+// Audio Control interface constants
+//
+////////////////////////////////////////////////////
+
+// audio class specific AC interface descriptor subtypes
+#define USB_AUDIO_AC_HEADER                     0x01
+#define USB_AUDIO_AC_INPUT_TERMINAL             0x02
+#define USB_AUDIO_AC_OUTPUT_TERMINAL            0x03
+#define USB_AUDIO_AC_MIXER_UNIT                 0x04
+#define USB_AUDIO_AC_SELECTOR_UNIT              0x05
+#define USB_AUDIO_AC_FEATURE_UNIT               0x06
+#define USB_AUDIO_AC_PROCESSING_UNIT            0x07
+#define USB_AUDIO_AC_EXTENSION_UNIT             0x08
+
+// processing unit process types
+#define USB_AUDIO_UP_DOWN_MIX_PROCESS           0x01
+#define USB_AUDIO_DOLBY_PROLOGIC_PROCESS        0x02
+#define USB_AUDIO_3D_STEREO_EXTENDER_PROCESS    0x03
+#define USB_AUDIO_REVERBERATION_PROCESS         0x04
+#define USB_AUDIO_CHORUS_PROCESS                0x05
+#define USB_AUDIO_DYN_RANGE_COMP_PROCESS        0x06
+
+// audio class specific endpoint descriptor subtypes
+#define USB_AUDIO_EP_GENERAL                    0x01
+
+// audio class specific request codes
+#define USB_AUDIO_SET_CUR                       0x01
+#define USB_AUDIO_GET_CUR                       0x81
+#define USB_AUDIO_SET_MIN                       0x02
+#define USB_AUDIO_GET_MIN                       0x82
+#define USB_AUDIO_SET_MAX                       0x03
+#define USB_AUDIO_GET_MAX                       0x83
+#define USB_AUDIO_SET_RES                       0x04
+#define USB_AUDIO_GET_RES                       0x84
+#define USB_AUDIO_SET_MEM                       0x05
+#define USB_AUDIO_GET_MEM                       0x85
+#define USB_AUDIO_GET_STAT                      0xFF
+
+// terminal control selectors
+#define USB_AUDIO_COPY_PROTECT_CONTROL          0x01
+
+// feature unit control selectors
+#define USB_AUDIO_MUTE_CONTROL                  0x01
+#define USB_AUDIO_VOLUME_CONTROL                0x02
+#define USB_AUDIO_BASS_CONTROL                  0x03
+#define USB_AUDIO_MID_CONTROL                   0x04
+#define USB_AUDIO_TREBLE_CONTROL                0x05
+#define USB_AUDIO_GRAPHIC_EQUALIZER_CONTROL     0x06
+#define USB_AUDIO_AUTOMATIC_GAIN_CONTROL        0x07
+#define USB_AUDIO_DELAY_CONTROL                 0x08
+#define USB_AUDIO_BASS_BOOST_CONTROL            0x09
+#define USB_AUDIO_LOUDNESS_CONTROL              0x0A
+
+// feature unit control support bitmasks
+#define USB_AUDIO_FU_BMA_MUTE                   (1u << 0u)
+#define USB_AUDIO_FU_BMA_VOLUME                 (1u << 1u)
+#define USB_AUDIO_FU_BMA_BASS                   (1u << 2u)
+#define USB_AUDIO_FU_BMA_MID                    (1u << 3u)
+#define USB_AUDIO_FU_BMA_TREBLE                 (1u << 4u)
+#define USB_AUDIO_FU_BMA_GRAPHIC_EQUALIZER      (1u << 5u)
+#define USB_AUDIO_FU_BMA_AUTOMATIC_GAIN         (1u << 6u)
+#define USB_AUDIO_FU_BMA_DELAY                  (1u << 7u)
+#define USB_AUDIO_FU_BMA_BASS_BOOST             (1u << 8u)
+#define USB_AUDIO_FU_BMA_LOUDNESS               (1u << 9u)
+
+// up/down mix processing unit control selectors
+#define USB_AUDIO_UD_ENABLE_CONTROL             0x01
+#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
+#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
+
+// Dolby Prologic processing unit control selectors
+#define USB_AUDIO_DP_ENABLE_CONTROL             0x01
+#define USB_AUDIO_DP_MODE_SELECT_CONTROL        0x02
+
+// 3D stereo extender processing unit control selectors
+#define USB_AUDIO_3D_ENABLE_CONTROL             0x01
+#define USB_AUDIO_SPACIOUSNESS_CONTROL          0x03
+
+// reverberation processing unit control selectors
+#define USB_AUDIO_RV_ENABLE_CONTROL             0x01
+#define USB_AUDIO_REVERB_LEVEL_CONTROL          0x02
+#define USB_AUDIO_REVERB_TIME_CONTROL           0x03
+#define USB_AUDIO_REVERB_FEEDBACK_CONTROL       0x04
+
+// chorus processing unit control selectors
+#define USB_AUDIO_CH_ENABLE_CONTROL             0x01
+#define USB_AUDIO_CHORUS_LEVEL_CONTROL          0x02
+#define USB_AUDIO_CHORUS_RATE_CONTROL           0x03
+#define USB_AUDIO_CHORUS_DEPTH_CONTROL          0x04
+
+// dynamic range compressor processing unit control selectors
+#define USB_AUDIO_DR_ENABLE_CONTROL             0x01
+#define USB_AUDIO_COMPRESSION_RATE_CONTROL      0x02
+#define USB_AUDIO_MAXAMPL_CONTROL               0x03
+#define USB_AUDIO_THRESHOLD_CONTROL             0x04
+#define USB_AUDIO_ATTACK_TIME                   0x05
+#define USB_AUDIO_RELEASE_TIME                  0x06
+
+// extension unit control selectors
+#define USB_AUDIO_XU_ENABLE_CONTROL             0x01
+
+// endpoint control selectors
+#define USB_AUDIO_SAMPLING_FREQ_CONTROL         0x01
+#define USB_AUDIO_PITCH_CONTROL                 0x02
+
+// USB audio terminal types
+#define USB_AUDIO_TERMINAL_USB_UNDEFINED                0x0100
+#define USB_AUDIO_TERMINAL_USB_STREAMING                0x0101
+#define USB_AUDIO_TERMINAL_USB_VENDOR                   0x01FF
+#define USB_AUDIO_TERMINAL_INPUT_UNDEFINED              0x0200
+#define USB_AUDIO_TERMINAL_MICROPHONE                   0x0201
+#define USB_AUDIO_TERMINAL_DESKTOP_MICROPHONE           0x0202
+#define USB_AUDIO_TERMINAL_PERSONAL_MICROPHONE          0x0203
+#define USB_AUDIO_TERMINAL_OMNI_DIRECTIONAL_MICROPHONE  0x0204
+#define USB_AUDIO_TERMINAL_MICROPHONE_ARRAY             0x0205
+#define USB_AUDIO_TERMINAL_PROCESSING_MICROPHONE_ARRAY  0x0206
+#define USB_AUDIO_TERMINAL_OUTPUT_UNDEFINED             0x0300
+#define USB_AUDIO_TERMINAL_SPEAKER                      0x0301
+#define USB_AUDIO_TERMINAL_HEADPHONES                   0x0302
+#define USB_AUDIO_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO   0x0303
+#define USB_AUDIO_TERMINAL_DESKTOP_SPEAKER              0x0304
+#define USB_AUDIO_TERMINAL_ROOM_SPEAKER                 0x0305
+#define USB_AUDIO_TERMINAL_COMMUNICATION_SPEAKER        0x0306
+#define USB_AUDIO_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER     0x0307
+#define USB_AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED      0x0400
+#define USB_AUDIO_TERMINAL_HANDSET                      0x0401
+#define USB_AUDIO_TERMINAL_HEADSET                      0x0402
+#define USB_AUDIO_TERMINAL_SPEAKERPHONE                 0x0403
+#define USB_AUDIO_TERMINAL_ECHO_SUPPRESSING_SPEAKERPHONE 0x0404
+#define USB_AUDIO_TERMINAL_ECHO_CANCELING_SPEAKERPHONE  0x0405
+#define USB_AUDIO_TERMINAL_TELEPHONY_UNDEFINED          0x0500
+#define USB_AUDIO_TERMINAL_PHONE_LINE                   0x0501
+#define USB_AUDIO_TERMINAL_TELEPHONE                    0x0502
+#define USB_AUDIO_TERMINAL_DOWN_LINE_PHONE              0x0503
+#define USB_AUDIO_TERMINAL_EXTERNAL_UNDEFINED           0x0600
+#define USB_AUDIO_TERMINAL_ANALOG_CONNECTOR             0x0601
+#define USB_AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE      0x0602
+#define USB_AUDIO_TERMINAL_LINE_CONNECTOR               0x0603
+#define USB_AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR       0x0604
+#define USB_AUDIO_TERMINAL_SPDIF_INTERFACE              0x0605
+#define USB_AUDIO_TERMINAL_1394_DA_STREAM               0x0606
+#define USB_AUDIO_TERMINAL_1394_DV_STREAM_SOUNDTRACK    0x0607
+#define USB_AUDIO_TERMINAL_EMBEDDED_UNDEFINED           0x0700
+#define USB_AUDIO_TERMINAL_LEVEL_CALIBRATION_NOISE_SOURCE 0x0701
+#define USB_AUDIO_TERMINAL_EQUALIZATION_NOISE           0x0702
+#define USB_AUDIO_TERMINAL_CD_PLAYER                    0x0703
+#define USB_AUDIO_TERMINAL_DAT                          0x0704
+#define USB_AUDIO_TERMINAL_DCC                          0x0705
+#define USB_AUDIO_TERMINAL_MINI_DISK                    0x0706
+#define USB_AUDIO_TERMINAL_ANALOG_TAPE                  0x0707
+#define USB_AUDIO_TERMINAL_PHONOGRAPH                   0x0708
+#define USB_AUDIO_TERMINAL_VCR_AUDIO                    0x0709
+#define USB_AUDIO_TERMINAL_VIDEO_DISK_AUDIO             0x070A
+#define USB_AUDIO_TERMINAL_DVD_AUDIO                    0x070B
+#define USB_AUDIO_TERMINAL_TV_TUNER_AUDIO               0x070C
+#define USB_AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO     0x070D
+#define USB_AUDIO_TERMINAL_CABLE_TUNER_AUDIO            0x070E
+#define USB_AUDIO_TERMINAL_DSS_AUDIO                    0x070F
+#define USB_AUDIO_TERMINAL_RADIO_RECEIVER               0x0710
+#define USB_AUDIO_TERMINAL_RADIO_TRANSMITTER            0x0711
+#define USB_AUDIO_TERMINAL_MULTI_TRACK_RECORDER         0x0712
+#define USB_AUDIO_TERMINAL_SYNTHESIZER                  0x0713
+
+////////////////////////////////////////////////////
+//
+// Audio streaming interface constants
+//
+////////////////////////////////////////////////////
+
+// Audio stream class-specific AS interface descriptor subtypes
+#define USB_AUDIO_AS_GENERAL                    0x01
+#define USB_AUDIO_AS_FORMAT_TYPE                0x02
+#define USB_AUDIO_AS_FORMAT_SPECIFIC            0x03
+
+// wFormatTag values present in the class specific AS header
+// Defined in Section A.1 of USB Device Class Definition for Audio Data Formats
+#define USB_AUDIO_AS_FT_TYPE_I_UNDEFINED        0x0000
+#define USB_AUDIO_AS_FT_PCM                     0x0001
+#define USB_AUDIO_AS_FT_PCM8                    0x0002
+#define USB_AUDIO_AS_FT_IEEE_FLOAT              0x0003
+#define USB_AUDIO_AS_FT_ALAW                    0x0004
+#define USB_AUDIO_AS_FT_MULAW                   0x0005
+#define USB_AUDIO_AS_FT_TYPE_II_UNDEFINED       0x1000
+#define USB_AUDIO_AS_FT_MPEG                    0x1001
+#define USB_AUDIO_AS_FT_AC3                     0x1002
+#define USB_AUDIO_AS_FT_TYPE_III_UNDEFINED      0x2000
+#define USB_AUDIO_AS_FT_IEC1937_AC3             0x2001
+#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L1        0x2002
+#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L23       0x2003
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_EXT       0x2004
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L1_LS     0x2005
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L23_LS    0x2006
+
+// Audio stream class-specific format-specific types
+#define USB_AUDIO_FORMAT_TYPE_UNDEFINED         0x00
+#define USB_AUDIO_FORMAT_TYPE_I                 0x01
+#define USB_AUDIO_FORMAT_TYPE_II                0x02
+#define USB_AUDIO_FORMAT_TYPE_III               0x03
+
+////////////////////////////////////////////////////
+//
+// MIDI streaming interface constants
+//
+////////////////////////////////////////////////////
+
+// MIDI class specific MS interface descriptor subtypes
+#define USB_MIDI_MS_HEADER                      0x01
+#define USB_MIDI_IN_JACK                        0x02
+#define USB_MIDI_OUT_JACK                       0x03
+#define USB_MIDI_ELEMENT                        0x04
+
+// MIDI class specific MS endpoint descriptor subtypes
+#define USB_MIDI_MS_GENERAL                     0x01
+
+// MIDI IN and OUT jack types
+#define USB_MIDI_JACK_EMBEDDED                  0x01
+#define USB_MIDI_JACK_INTERNAL                  0x02
+
+// MIDI endpoint control selectors
+#define USB_MIDI_ASSOCIATION_CONTROL            0x01
+
+
+// Top level header structure shared by all USB audio descriptors.
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;
+} __PACKED usb_audio_desc_header;
+
+// Audio Control Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_HEADER
+    uint16_t bcdADC;
+    uint16_t wTotalLength;
+    uint8_t bInCollection;
+    uint8_t baInterfaceNr[];
+} __PACKED usb_audio_ac_header_desc;
+
+// Common header structure shared by all unit and terminal descriptors found in
+// an Audio Control interface descriptor.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_.*_(TERMINAL|UNIT)
+    uint8_t bID;
+} __PACKED usb_audio_ac_ut_desc;
+
+// Common header structure shared by all terminal descriptors found in an Audio
+// Control interface descriptor.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_(INPUT|OUTPUT)_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+} __PACKED usb_audio_ac_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_INPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t iTerminal;
+} __PACKED usb_audio_ac_input_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_OUTPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bSourceID;
+    uint8_t iTerminal;
+} __PACKED usb_audio_ac_output_terminal_desc;
+
+// Note: Mixer unit descriptors contain two inlined variable length arrays, each
+// with descriptor data following them.  They are therefor described using 3
+// structure definitions which are logically concatenated, but separated by the
+// inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_MIXER_UNIT
+    uint8_t bUnitID;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_mixer_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_mixer_unit_desc_1;
+
+typedef struct {
+    uint8_t iMixer;
+} __PACKED usb_audio_ac_mixer_unit_desc_2;
+
+// Note: Selector unit descriptors contain an inlined variable length array with
+// descriptor data following it.  They are therefor described using 2 structure
+// definitions which are logically concatenated, but separated by the inline
+// array.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_SELECTOR_UNIT
+    uint8_t bUnitID;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_selector_unit_desc_0;
+
+typedef struct {
+    uint8_t iSelector;
+} __PACKED usb_audio_ac_selector_unit_desc_1;
+
+// Note: Feature unit descriptors contain an inlined variable length array with
+// descriptor data following it.  They are therefor described using 2 structure
+// definitions which are logically concatenated, but separated by the inline
+// array.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_FEATURE_UNIT
+    uint8_t bUnitID;
+    uint8_t bSourceID;
+    uint8_t bControlSize;
+    uint8_t bmaControls[];
+} __PACKED usb_audio_ac_feature_unit_desc_0;
+
+typedef struct {
+    uint8_t iFeature;
+} __PACKED usb_audio_ac_feature_unit_desc_1;
+
+// Note: Processing unit descriptors contain two inlined variable length arrays,
+// each with descriptor data following them.  They are therefor described using
+// 3 structure definitions which are logically concatenated, but separated by
+// the inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_PROCESSING_UNIT
+    uint8_t bUnitID;
+    uint16_t wProcessType;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_processing_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bControlSize;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_processing_unit_desc_1;
+
+typedef struct {
+    uint8_t iProcessing;
+    // Note: The Process-specific control structure follows this with the
+    // structure type determined by wProcessType
+    // TODO(johngro) : Define the process specific control structures.  As of
+    // the 1.0 revision of the USB audio spec, the types to be defined are...
+    //
+    // ** Up/Down-mix
+    // ** Dolby Prologic
+    // ** 3D-Stereo Extender
+    // ** Reverberation
+    // ** Chorus
+    // ** Dynamic Range Compressor
+} __PACKED usb_audio_ac_processing_unit_desc_2;
+
+// Note: Extension unit descriptors contain two inlined variable length arrays,
+// each with descriptor data following them.  They are therefor described using
+// 3 structure definitions which are logically concatenated, but separated by
+// the inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_EXTENSION_UNIT
+    uint8_t bUnitID;
+    uint16_t wExtensionCode;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_extension_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bControlSize;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_extension_unit_desc_1;
+
+typedef struct {
+    uint8_t iExtension;
+} __PACKED usb_audio_ac_extension_unit_desc_2;
+
+// Audio Streaming Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_GENERAL
+    uint8_t bTerminalLink;
+    uint8_t bDelay;
+    uint16_t wFormatTag;
+} __PACKED usb_audio_as_header_desc;
+
+typedef struct {
+    uint8_t freq[3];            // 24 bit unsigned integer, little-endian
+} __PACKED usb_audio_as_samp_freq;
+
+// Common header used by all format type descriptors
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
+    uint8_t bFormatType;
+} __PACKED usb_audio_as_format_type_hdr;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
+    uint8_t bFormatType;            // USB_AUDIO_FORMAT_TYPE_I
+    uint8_t bNrChannels;
+    uint8_t bSubFrameSize;
+    uint8_t bBitResolution;
+    uint8_t bSamFreqType;           // number of sampling frequencies
+    usb_audio_as_samp_freq tSamFreq[]; // list of sampling frequencies (3 bytes each)
+} __PACKED usb_audio_as_format_type_i_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_EP_GENERAL
+    uint8_t bmAttributes;
+    uint8_t bLockDelayUnits;
+    uint16_t wLockDelay;
+} __PACKED usb_audio_as_isoch_ep_desc;
+
+// MIDI Streaming Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_HEADER
+    uint16_t bcdMSC;
+    uint16_t wTotalLength;
+} __PACKED usb_midi_ms_header_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_IN_JACK
+    uint8_t bJackType;
+    uint8_t bJackID;
+    uint8_t iJack;
+} __PACKED usb_midi_ms_in_jack_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_OUT_JACK
+    uint8_t bJackType;
+    uint8_t bJackID;
+    uint8_t bNrInputPins;
+    uint8_t baSourceID;
+    uint8_t baSourcePin;
+} __PACKED usb_midi_ms_out_jack_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_GENERAL
+    uint8_t bNumEmbMIDIJack;
+    uint8_t baAssocJackID[];
+} __PACKED usb_midi_ms_endpoint_desc;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_AUDIO_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/cdc.h b/arch/arm64/sysroot/include/zircon/hw/usb/cdc.h
new file mode 100644
index 0000000..67ac8c7
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/cdc.h
@@ -0,0 +1,150 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_CDC_H_
+#define SYSROOT_ZIRCON_HW_USB_CDC_H_
+
+#include <stdint.h>
+
+// clang-format off
+
+#include <zircon/compiler.h>
+
+/* CDC Subclasses for the Communications Interface Class */
+#define USB_CDC_SUBCLASS_DIRECT_LINE       0x01
+#define USB_CDC_SUBCLASS_ABSTRACT          0x02
+#define USB_CDC_SUBCLASS_TELEPHONE         0x03
+#define USB_CDC_SUBCLASS_MULTI_CHANNEL     0x04
+#define USB_CDC_SUBCLASS_CAPI              0x05
+#define USB_CDC_SUBCLASS_ETHERNET          0x06
+#define USB_CDC_SUBCLASS_ATM               0x07
+#define USB_CDC_SUBCLASS_WIRELESS_HANDSET  0x08
+#define USB_CDC_SUBCLASS_DEVICE_MGMT       0x09
+#define USB_CDC_SUBCLASS_MOBILE_DIRECT     0x0A
+#define USB_CDC_SUBCLASS_OBEX              0x0B
+#define USB_CDC_SUBCLASS_ETHERNET_EMU      0x0C
+#define USB_CDC_SUBCLASS_NETWORK_CTRL      0x0D
+
+/* CDC Descriptor SubTypes */
+#define USB_CDC_DST_HEADER                    0x00
+#define USB_CDC_DST_CALL_MGMT                 0x01
+#define USB_CDC_DST_ABSTRACT_CTRL_MGMT        0x02
+#define USB_CDC_DST_DIRECT_LINE_MGMT          0x03
+#define USB_CDC_DST_TELEPHONE_RINGER          0x04
+#define USB_CDC_DST_TELEPHONE_CALL_REPORTING  0x05
+#define USB_CDC_DST_UNION                     0x06
+#define USB_CDC_DST_COUNTRY_SELECTION         0x07
+#define USB_CDC_DST_TELEPHONE_OP_MODES        0x08
+#define USB_CDC_DST_USB_TERMINAL              0x09
+#define USB_CDC_DST_NETWORK_CHANNEL           0x0A
+#define USB_CDC_DST_PROTOCOL_UNIT             0x0B
+#define USB_CDC_DST_EXTENSION_UNIT            0x0C
+#define USB_CDC_DST_MULTI_CHANNEL_MGMT        0x0D
+#define USB_CDC_DST_CAPI_CTRL_MGMT            0x0E
+#define USB_CDC_DST_ETHERNET                  0x0F
+#define USB_CDC_DST_ATM_NETWORKING            0x10
+#define USB_CDC_DST_WIRELESS_HANDSET_CTRL     0x11
+#define USB_CDC_DST_MOBILE_DIRECT_LINE        0x12
+#define USB_CDC_DST_MDLM_DETAIL               0x13
+#define USB_CDC_DST_DEVICE_MGMT               0x14
+#define USB_CDC_DST_OBEX                      0x15
+#define USB_CDC_DST_COMMAND_SET               0x16
+#define USB_CDC_DST_COMMAND_SET_DETAIL        0x17
+#define USB_CDC_DST_TELEPHONE_CTRL            0x18
+#define USB_CDC_DST_OBEX_SERVICE_ID           0x19
+#define USB_CDC_DST_NCM                       0x1A
+
+/* CDC Class-Specific Notification Codes */
+#define USB_CDC_NC_NETWORK_CONNECTION       0x00
+#define USB_CDC_NC_RESPONSE_AVAILABLE       0x01
+#define USB_CDC_NC_SERIAL_STATE             0x20
+#define USB_CDC_NC_CONNECTION_SPEED_CHANGE  0x2A
+
+/* CDC Ethernet Class-Specific Request Codes */
+#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
+#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
+#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
+#define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
+#define USB_CDC_GET_ETHERNET_STATISTIC          0x44
+
+/* CDC Ethernet Packet Filter Modes Bits */
+#define USB_CDC_PACKET_TYPE_PROMISCUOUS   (1 << 0)
+#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1)
+#define USB_CDC_PACKET_TYPE_DIRECTED      (1 << 2)
+#define USB_CDC_PACKET_TYPE_BROADCAST     (1 << 3)
+#define USB_CDC_PACKET_TYPE_MULTICAST     (1 << 4)
+
+/* CDC Class-Specific Requests */
+#define USB_CDC_SEND_ENCAPSULATED_COMMAND   0x00
+#define USB_CDC_GET_ENCAPSULATED_RESPONSE   0x01
+
+__BEGIN_CDECLS
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_HEADER
+    uint16_t bcdCDC;
+} __attribute__ ((packed)) usb_cs_header_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_CALL_MGMT
+    uint8_t bmCapabilities;
+    uint8_t bDataInterface;
+} __attribute__ ((packed)) usb_cs_call_mgmt_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_ABSTRACT_CTRL_MGMT
+    uint8_t bmCapabilities;
+} __attribute__ ((packed)) usb_cs_abstract_ctrl_mgmt_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
+    uint8_t bControlInterface;
+    uint8_t bSubordinateInterface[];
+} __attribute__ ((packed)) usb_cs_union_interface_descriptor_t;
+
+// fixed size version of usb_cs_union_interface_descriptor_t
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
+    uint8_t bControlInterface;
+    uint8_t bSubordinateInterface;
+} __attribute__ ((packed)) usb_cs_union_interface_descriptor_1_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_ETHERNET
+    uint8_t iMACAddress;
+    uint32_t bmEthernetStatistics;
+    uint16_t wMaxSegmentSize;
+    uint16_t wNumberMCFilters;
+    uint8_t bNumberPowerFilters;
+} __attribute__ ((packed)) usb_cs_ethernet_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bmRequestType;
+    uint8_t bNotification;
+    uint16_t wValue;
+    uint16_t wIndex;
+    uint16_t wLength;
+} __attribute__ ((packed)) usb_cdc_notification_t;
+
+typedef struct {
+    usb_cdc_notification_t notification;
+    uint32_t downlink_br;
+    uint32_t uplink_br;
+ } __attribute__ ((packed)) usb_cdc_speed_change_notification_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_CDC_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/dfu.h b/arch/arm64/sysroot/include/zircon/hw/usb/dfu.h
new file mode 100644
index 0000000..7ca40f0
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/dfu.h
@@ -0,0 +1,82 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_DFU_H_
+#define SYSROOT_ZIRCON_HW_USB_DFU_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// USB DFU Spec, Rev 1.1
+
+// DFU Class-Specific Request Values
+// Table 3.2
+#define USB_DFU_DETACH     0x00
+#define USB_DFU_DNLOAD     0x01
+#define USB_DFU_UPLOAD     0x02
+#define USB_DFU_GET_STATUS 0x03
+#define USB_DFU_CLR_STATUS 0x04
+#define USB_DFU_GET_STATE  0x05
+#define USB_DFU_ABORT      0x06
+
+// DFU Class-Specific Descriptor Types
+// Table 4.1.3
+#define USB_DFU_CS_FUNCTIONAL 0x21
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;  // USB_DFU_CS_FUNCTIONAL
+    uint8_t bmAttributes;
+    uint16_t wDetachTimeOut;
+    uint16_t wTransferSize;
+    uint16_t bcdDFUVersion;
+} __PACKED usb_dfu_func_desc_t;
+
+// DFU_GET_STATUS Response
+// Section 6.1.2
+typedef struct {
+    uint8_t bStatus;
+    uint8_t bwPollTimeout[3];  // 24 bit unsigned integer
+    uint8_t bState;
+    uint8_t bString;
+} __PACKED usb_dfu_get_status_data_t;
+
+// DFU Device Status Values
+#define USB_DFU_STATUS_OK                     0x00
+#define USB_DFU_STATUS_ERR_TARGET             0x01
+#define USB_DFU_STATUS_ERR_FILE               0x02
+#define USB_DFU_STATUS_ERR_WRITE              0x03
+#define USB_DFU_STATUS_ERR_ERASE              0x04
+#define USB_DFU_STATUS_ERR_CHECK_ERASED       0x05
+#define USB_DFU_STATUS_ERR_PROG               0x06
+#define USB_DFU_STATUS_ERR_VERIFY             0x07
+#define USB_DFU_STATUS_ERR_ADDRESS            0x08
+#define USB_DFU_STATUS_ERR_NOT_DONE           0x09
+#define USB_DFU_STATUS_ERR_FIRMWARE           0x0A
+#define USB_DFU_STATUS_ERR_VENDOR             0x0B
+#define USB_DFU_STATUS_ERR_USER               0x0C
+#define USB_DFU_STATUS_ERR_POR                0x0D
+#define USB_DFU_STATUS_ERR_UNKNOWN            0x0E
+#define USB_DFU_STATUS_ERR_STALLED_PKT        0x0F
+
+// DFU Device State Values
+#define USB_DFU_STATE_APP_IDLE                0x00
+#define USB_DFU_STATE_APP_DETACH              0x01
+#define USB_DFU_STATE_DFU_IDLE                0x02
+#define USB_DFU_STATE_DFU_DNLOAD_SYNC         0x03
+#define USB_DFU_STATE_DFU_DNBUSY              0x04
+#define USB_DFU_STATE_DFU_DNLOAD_IDLE         0x05
+#define USB_DFU_STATE_DFU_MANIFEST_SYNC       0x06
+#define USB_DFU_STATE_DFU_MANIFEST            0x07
+#define USB_DFU_STATE_DFU_MANIFEST_WAIT_RESET 0x08
+#define USB_DFU_STATE_DFU_UPLOAD_IDLE         0x09
+#define USB_DFU_STATE_DFU_ERROR               0x0A
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_DFU_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/hid.h b/arch/arm64/sysroot/include/zircon/hw/usb/hid.h
new file mode 100644
index 0000000..97dea4e
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/hid.h
@@ -0,0 +1,46 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_HID_H_
+#define SYSROOT_ZIRCON_HW_USB_HID_H_
+
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+__BEGIN_CDECLS
+
+// clang-format off
+
+// HID Request Values.
+#define USB_HID_GET_REPORT                  0x01
+#define USB_HID_GET_IDLE                    0x02
+#define USB_HID_GET_PROTOCOL                0x03
+#define USB_HID_SET_REPORT                  0x09
+#define USB_HID_SET_IDLE                    0x0A
+#define USB_HID_SET_PROTOCOL                0x0B
+
+// HID USB protocols
+#define USB_HID_PROTOCOL_KBD 0x01
+#define USB_HID_PROTOCOL_MOUSE 0x02
+#define USB_HID_SUBCLASS_BOOT 0x01
+
+// clang-format on
+
+typedef struct {
+  uint8_t bDescriptorType;
+  uint16_t wDescriptorLength;
+} __attribute__((packed)) usb_hid_descriptor_entry_t;
+
+typedef struct {
+  uint8_t bLength;
+  uint8_t bDescriptorType;
+  uint16_t bcdHID;
+  uint8_t bCountryCode;
+  uint8_t bNumDescriptors;
+  usb_hid_descriptor_entry_t descriptors[];
+} __attribute__((packed)) usb_hid_descriptor_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_HID_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/hub.h b/arch/arm64/sysroot/include/zircon/hw/usb/hub.h
new file mode 100644
index 0000000..10ed110
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/hub.h
@@ -0,0 +1,120 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_HUB_H_
+#define SYSROOT_ZIRCON_HW_USB_HUB_H_
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+// clang-format off
+
+__BEGIN_CDECLS
+
+// Hub request types
+#define USB_RECIP_HUB   (USB_TYPE_CLASS | USB_RECIP_DEVICE)
+#define USB_RECIP_PORT  (USB_TYPE_CLASS | USB_RECIP_OTHER)
+
+// Hub requests
+#define USB_HUB_SET_DEPTH       12
+
+// Hub descriptor types
+#define USB_HUB_DESC_TYPE       0x29
+#define USB_HUB_DESC_TYPE_SS    0x2A    // for superspeed hubs
+
+// Hub Class Feature Selectors (USB 2.0 spec Table 11.17)
+#define USB_FEATURE_C_HUB_LOCAL_POWER   0
+#define USB_FEATURE_C_HUB_OVER_CURRENT  1
+#define USB_FEATURE_PORT_CONNECTION     0
+#define USB_FEATURE_PORT_ENABLE         1
+#define USB_FEATURE_PORT_SUSPEND        2
+#define USB_FEATURE_PORT_OVER_CURRENT   3
+#define USB_FEATURE_PORT_RESET          4
+#define USB_FEATURE_PORT_LINK_STATE     5
+#define USB_FEATURE_PORT_POWER          8
+#define USB_FEATURE_PORT_LOW_SPEED      9
+#define USB_FEATURE_C_PORT_CONNECTION   16
+#define USB_FEATURE_C_PORT_ENABLE       17
+#define USB_FEATURE_C_PORT_SUSPEND      18
+#define USB_FEATURE_C_PORT_OVER_CURRENT 19
+#define USB_FEATURE_C_PORT_RESET        20
+#define USB_FEATURE_PORT_TEST           21
+#define USB_FEATURE_PORT_INDICATOR      22
+#define USB_FEATURE_PORT_INDICATOR      22
+#define USB_FEATURE_PORT_U1_TIMEOUT     23
+#define USB_FEATURE_PORT_U2_TIMEOUT     24
+#define USB_FEATURE_C_PORT_LINK_STATE   25
+#define USB_FEATURE_C_PORT_CONFIG_ERROR 26
+#define USB_FEATURE_PORT_REMOTE_WAKE_MASK 27
+#define USB_FEATURE_BH_PORT_RESET       28
+#define USB_FEATURE_C_BH_PORT_RESET     29
+#define USB_FEATURE_FORCE_LINKPM_ACCEPT 30
+
+typedef struct {
+    uint8_t bDescLength;
+    uint8_t bDescriptorType;
+    uint8_t bNbrPorts;
+    uint16_t wHubCharacteristics;
+    uint8_t bPowerOn2PwrGood;
+    uint8_t bHubContrCurrent;
+    union {
+        // USB 2.0
+        struct {
+            // variable length depending on number of ports
+            uint8_t  DeviceRemovable[4];
+            uint8_t  PortPwrCtrlMask[4];
+        }  __attribute__ ((packed)) hs;
+        // USB 3.0
+        struct {
+            uint8_t bHubHdrDecLat;
+            uint16_t wHubDelay;
+            uint16_t DeviceRemovable;
+        } __attribute__ ((packed)) ss;
+    } __attribute__ ((packed));
+} __attribute__ ((packed)) usb_hub_descriptor_t;
+
+typedef struct {
+    uint16_t wHubStatus;
+    uint16_t wHubChange;
+} __attribute__ ((packed)) usb_hub_status_t;
+
+// wHubStatus bits
+#define USB_HUB_LOCAL_POWER         (1 << 0)
+#define USB_HUB_OVER_CURRENT        (1 << 1)
+
+typedef struct {
+    uint16_t wPortStatus;
+    uint16_t wPortChange;
+} __attribute__ ((packed)) usb_port_status_t;
+
+// Port Status bits
+#define USB_PORT_CONNECTION         (1 << 0)
+#define USB_PORT_ENABLE             (1 << 1)
+#define USB_PORT_SUSPEND            (1 << 2)    // USB 2.0 only
+#define USB_PORT_OVER_CURRENT       (1 << 3)
+#define USB_PORT_RESET              (1 << 4)
+#define USB_PORT_POWER              (1 << 8)    // USB 2.0 only
+#define USB_PORT_LOW_SPEED          (1 << 9)    // USB 2.0 only
+#define USB_PORT_HIGH_SPEED         (1 << 10)   // USB 2.0 only
+#define USB_PORT_TEST_MODE          (1 << 11)   // USB 2.0 only
+#define USB_PORT_INDICATOR_CONTROL  (1 << 12)   // USB 2.0 only
+
+// Port Status Changed bits
+#define USB_C_PORT_CONNECTION       (1 << 0)
+#define USB_C_PORT_ENABLE           (1 << 1)    // USB 2.0 only
+#define USB_C_PORT_SUSPEND          (1 << 2)    // USB 2.0 only
+#define USB_C_PORT_OVER_CURRENT     (1 << 3)
+#define USB_C_PORT_RESET            (1 << 4)
+#define USB_C_BH_PORT_RESET         (1 << 5)    // USB 3.0 only
+#define USB_C_PORT_LINK_STATE       (1 << 6)    // USB 3.0 only
+#define USB_C_PORT_CONFIG_ERROR     (1 << 7)    // USB 3.0 only
+#define USB_C_PORT_POWER            (1 << 8)    // USB 2.0 only
+#define USB_C_PORT_LOW_SPEED        (1 << 9)    // USB 2.0 only
+#define USB_C_PORT_HIGH_SPEED       (1 << 10)   // USB 2.0 only
+#define USB_C_PORT_TEST_MODE        (1 << 11)   // USB 2.0 only
+#define USB_C_PORT_INDICATOR_CONTROL (1 << 12)   // USB 2.0 only
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_HUB_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/ums.h b/arch/arm64/sysroot/include/zircon/hw/usb/ums.h
new file mode 100644
index 0000000..6640803
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/ums.h
@@ -0,0 +1,159 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_UMS_H_
+#define SYSROOT_ZIRCON_HW_USB_UMS_H_
+
+// clang-format off
+
+// SCSI commands
+#define UMS_TEST_UNIT_READY          0x00
+#define UMS_REQUEST_SENSE            0x03
+#define UMS_INQUIRY                  0x12
+#define UMS_MODE_SELECT6             0x15
+#define UMS_MODE_SENSE6              0x1A
+#define UMS_START_STOP_UNIT          0x1B
+#define UMS_TOGGLE_REMOVABLE         0x1E
+#define UMS_READ_FORMAT_CAPACITIES   0x23
+#define UMS_READ_CAPACITY10          0x25
+#define UMS_READ10                   0x28
+#define UMS_WRITE10                  0x2A
+#define UMS_SYNCHRONIZE_CACHE        0x35
+#define UMS_MODE_SELECT10            0x55
+#define UMS_MODE_SENSE10             0x5A
+#define UMS_READ16                   0x88
+#define UMS_WRITE16                  0x8A
+#define UMS_READ_CAPACITY16          0x9E
+#define UMS_READ12                   0xA8
+#define UMS_WRITE12                  0xAA
+
+// control request values
+#define USB_REQ_RESET               0xFF
+#define USB_REQ_GET_MAX_LUN         0xFE
+
+// error codes for CSW processing
+typedef uint32_t csw_status_t;
+#define CSW_SUCCESS      ((csw_status_t)0)
+#define CSW_FAILED       ((csw_status_t)1)
+#define CSW_PHASE_ERROR  ((csw_status_t)2)
+#define CSW_INVALID      ((csw_status_t)3)
+#define CSW_TAG_MISMATCH ((csw_status_t)4)
+
+// signatures in header and status
+#define CBW_SIGNATURE               0x43425355
+#define CSW_SIGNATURE               0x53425355
+
+// transfer lengths
+#define UMS_INQUIRY_TRANSFER_LENGTH                0x24
+#define UMS_REQUEST_SENSE_TRANSFER_LENGTH          0x12
+#define UMS_READ_FORMAT_CAPACITIES_TRANSFER_LENGTH 0xFC
+
+// 6 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint16_t    lba;    // logical block address
+    uint8_t     length;
+    uint8_t     control;
+} __PACKED scsi_command6_t;
+static_assert(sizeof(scsi_command6_t) == 6, "");
+
+// 10 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint32_t    lba;    // logical block address
+    uint8_t     misc2;
+    uint8_t     length_hi; // break length into two pieces to avoid odd alignment
+    uint8_t     length_lo;
+    uint8_t     control;
+} __PACKED scsi_command10_t;
+static_assert(sizeof(scsi_command10_t) == 10, "");
+
+// 12 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint32_t    lba;    // logical block address
+    uint32_t    length;
+    uint8_t     misc2;
+    uint8_t     control;
+} __PACKED scsi_command12_t;
+static_assert(sizeof(scsi_command12_t) == 12, "");
+
+// 16 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint64_t    lba;    // logical block address
+    uint32_t    length;
+    uint8_t     misc2;
+    uint8_t     control;
+} __PACKED scsi_command16_t;
+static_assert(sizeof(scsi_command16_t) == 16, "");
+
+// SCSI Read Capacity 10 payload
+// This is big endian
+typedef struct {
+    uint32_t    lba;
+    uint32_t    block_length;
+} __PACKED scsi_read_capacity_10_t;
+static_assert(sizeof(scsi_read_capacity_10_t) == 8, "");
+
+// SCSI Read Capacity 16 payload
+// This is big endian
+typedef struct {
+    uint64_t    lba;
+    uint32_t    block_length;
+    uint8_t     ptype_prot_en;  // bit 0: PROT_EN, bits 1-3: P_TYPE
+    uint8_t     resesrved[19];
+} __PACKED scsi_read_capacity_16_t;
+static_assert(sizeof(scsi_read_capacity_16_t) == 32, "");
+
+// SCSI Mode Sense 6 command
+typedef struct {
+    uint8_t     opcode; // UMS_MODE_SENSE6
+    uint8_t     disable_block_desc;
+    uint8_t     page;
+    uint8_t     subpage;
+    uint8_t     allocation_length;
+    uint8_t     control;
+} __PACKED scsi_mode_sense_6_command_t;
+static_assert(sizeof(scsi_mode_sense_6_command_t) == 6, "");
+
+// SCSI Mode Sense 6 data response
+typedef struct {
+    uint8_t     mode_data_length;
+    uint8_t     medium_type;
+    uint8_t     device_specific_param;
+    uint8_t     block_desc_length;
+} __PACKED scsi_mode_sense_6_data_t;
+#define MODE_SENSE_DSP_RO   0x80    //  bit 7 of device_specific_param: read-only
+
+// Command Block Wrapper
+typedef struct {
+    uint32_t    dCBWSignature;      // CBW_SIGNATURE
+    uint32_t    dCBWTag;
+    uint32_t    dCBWDataTransferLength;
+    uint8_t     bmCBWFlags;
+    uint8_t     bCBWLUN;
+    uint8_t     bCBWCBLength;
+    uint8_t     CBWCB[16];
+} __PACKED ums_cbw_t;
+static_assert(sizeof(ums_cbw_t) == 31, "");
+
+// Command Status Wrapper
+typedef struct {
+    uint32_t    dCSWSignature;      // CSW_SIGNATURE
+    uint32_t    dCSWTag;
+    uint32_t    dCSWDataResidue;
+    uint8_t     bmCSWStatus;
+} __PACKED ums_csw_t;
+static_assert(sizeof(ums_csw_t) == 13, "");
+
+#endif  // SYSROOT_ZIRCON_HW_USB_UMS_H_
diff --git a/arch/arm64/sysroot/include/zircon/hw/usb/video.h b/arch/arm64/sysroot/include/zircon/hw/usb/video.h
new file mode 100644
index 0000000..925b5b6
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/hw/usb/video.h
@@ -0,0 +1,308 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_VIDEO_H_
+#define SYSROOT_ZIRCON_HW_USB_VIDEO_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <stdint.h>
+
+__BEGIN_CDECLS;
+
+// video interface subclasses
+#define USB_SUBCLASS_VIDEO_CONTROL                 0x01
+#define USB_SUBCLASS_VIDEO_STREAMING               0x02
+#define USB_SUBCLASS_VIDEO_INTERFACE_COLLECTION    0x03
+
+// video class specific descriptor types
+#define USB_VIDEO_CS_DEVICE                        0x21
+#define USB_VIDEO_CS_CONFIGURATION                 0x22
+#define USB_VIDEO_CS_STRING                        0x23
+#define USB_VIDEO_CS_INTERFACE                     0x24
+#define USB_VIDEO_CS_ENDPOINT                      0x25
+
+// video class specific VC interface descriptor subtypes
+#define USB_VIDEO_VC_HEADER                        0x01
+#define USB_VIDEO_VC_INPUT_TERMINAL                0x02
+#define USB_VIDEO_VC_OUTPUT_TERMINAL               0x03
+#define USB_VIDEO_VC_SELECTOR_UNIT                 0x04
+#define USB_VIDEO_VC_PROCESSING_UNIT               0x05
+#define USB_VIDEO_VC_EXTENSION_UNIT                0x06
+#define USB_VIDEO_VC_ENCODING_UNIT                 0x07
+
+// video class specific VS interface descriptor subtypes
+#define USB_VIDEO_VS_INPUT_HEADER                  0x01
+#define USB_VIDEO_VS_OUTPUT_HEADER                 0x02
+#define USB_VIDEO_VS_STILL_IMAGE_FRAME             0x03
+#define USB_VIDEO_VS_FORMAT_UNCOMPRESSED           0x04
+#define USB_VIDEO_VS_FRAME_UNCOMPRESSED            0x05
+#define USB_VIDEO_VS_FORMAT_MJPEG                  0x06
+#define USB_VIDEO_VS_FRAME_MJPEG                   0x07
+#define USB_VIDEO_VS_FORMAT_MPEG2TS                0x0A
+#define USB_VIDEO_VS_FORMAT_DV                     0x0C
+#define USB_VIDEO_VS_COLORFORMAT                   0x0D
+#define USB_VIDEO_VS_FORMAT_FRAME_BASED            0x10
+#define USB_VIDEO_VS_FRAME_FRAME_BASED             0x11
+#define USB_VIDEO_VS_FORMAT_STREAM_BASED           0x12
+#define USB_VIDEO_VS_FORMAT_H264                   0x13
+#define USB_VIDEO_VS_FRAME_H264                    0x14
+#define USB_VIDEO_VS_FORMAT_H264_SIMULCAST         0x15
+#define USB_VIDEO_VS_FORMAT_VP8                    0x16
+#define USB_VIDEO_VS_FRAME_VP8                     0x17
+#define USB_VIDEO_VS_FORMAT_VP8_SIMULCAST          0x18
+
+// video class specific endpoint descriptor subtypes
+#define USB_VIDEO_EP_GENERAL                       0x01
+#define USB_VIDEO_EP_ENDPOINT                      0x02
+#define USB_VIDEO_EP_INTERRUPT                     0x03
+
+// video class specific request codes
+#define USB_VIDEO_SET_CUR                          0x01
+#define USB_VIDEO_SET_CUR_ALL                      0x11
+#define USB_VIDEO_GET_CUR                          0x81
+#define USB_VIDEO_GET_MIN                          0x82
+#define USB_VIDEO_GET_MAX                          0x83
+#define USB_VIDEO_GET_RES                          0x84
+#define USB_VIDEO_GET_LEN                          0x85
+#define USB_VIDEO_GET_INFO                         0x86
+#define USB_VIDEO_GET_DEF                          0x87
+#define USB_VIDEO_GET_CUR_ALL                      0x91
+#define USB_VIDEO_GET_MIN_ALL                      0x92
+#define USB_VIDEO_GET_MAX_ALL                      0x93
+#define USB_VIDEO_GET_RES_ALL                      0x94
+#define USB_VIDEO_GET_DEF_ALL                      0x97
+
+// video streaming interface control selectors
+#define USB_VIDEO_VS_PROBE_CONTROL                 0x01
+#define USB_VIDEO_VS_COMMIT_CONTROL                0x02
+#define USB_VIDEO_VS_STILL_PROBE_CONTROL           0x03
+#define USB_VIDEO_VS_STILL_COMMIT_CONTROL          0x04
+#define USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL   0x05
+#define USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL     0x06
+#define USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL    0x07
+#define USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL  0x08
+#define USB_VIDEO_VS_SYNCH_DELAY_CONTROL           0x09
+
+// header for usb_video_vc_* below
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;
+} __PACKED usb_video_vc_desc_header;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_HEADER
+    uint16_t bcdUVC;
+    uint16_t wTotalLength;
+    uint32_t dwClockFrequency;
+    uint8_t bInCollection;
+    uint8_t baInterfaceNr[];
+} __PACKED usb_video_vc_header_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_INPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t iTerminal;
+} __PACKED usb_video_vc_input_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_OUTPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bSourceID;
+    uint8_t iTerminal;
+} __PACKED usb_video_vc_output_terminal_desc;
+
+// class specific VC interrupt endpoint descriptor
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_ENDPOINT_INTERRUPT
+    uint16_t wMaxTransferSize;
+} __PACKED usb_video_vc_interrupt_endpoint_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VS_HEADER
+    uint8_t bNumFormats;
+    uint16_t wTotalLength;
+    uint8_t bEndpointAddress;
+    uint8_t bmInfo;
+    uint8_t bTerminalLink;
+    uint8_t bStillCaptureMethod;
+    uint8_t bTriggerSupport;
+    uint8_t bTriggerUsage;
+    uint8_t bControlSize;
+    uint8_t bmaControls[];
+} __PACKED usb_video_vs_input_header_desc;
+
+#define GUID_LENGTH 16
+
+// A GUID consists of a:
+//  - four-byte integer
+//  - two-byte integer
+//  - two-byte integer
+//  - eight-byte array
+//
+// The string representation uses big endian format, so to convert it
+// to a byte array we need to reverse the byte order of the three integers.
+//
+// See USB Video Class revision 1.5, FAQ section 2.9
+// for GUID Data Structure Layout.
+
+#define USB_VIDEO_GUID_YUY2_STRING "32595559-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_YUY2_VALUE { \
+    0x59, 0x55, 0x59, 0x32, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_NV12_STRING "3231564E-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_NV12_VALUE { \
+    0x4e, 0x56, 0x31, 0x32, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_M420_STRING "3032344D-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_M420_VALUE { \
+    0x4d, 0x34, 0x32, 0x30, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_I420_STRING "30323449-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_I420_VALUE { \
+    0x49, 0x34, 0x32, 0x30, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+// USB Video Payload Uncompressed
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_UNCOMPRESSED
+    uint8_t bFormatIndex;
+    uint8_t bNumFrameDescriptors;
+    uint8_t guidFormat[GUID_LENGTH];
+    uint8_t bBitsPerPixel;
+    uint8_t bDefaultFrameIndex;
+    uint8_t bAspectRatioX;
+    uint8_t bAspectRatioY;
+    uint8_t bmInterfaceFlags;
+    uint8_t bCopyProtect;
+} __PACKED usb_video_vs_uncompressed_format_desc;
+
+// USB Video Payload MJPEG
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_MJPEG
+    uint8_t bFormatIndex;
+    uint8_t bNumFrameDescriptors;
+    uint8_t bmFlags;
+    uint8_t bDefaultFrameIndex;
+    uint8_t bAspectRatioX;
+    uint8_t bAspectRatioY;
+    uint8_t bmInterfaceFlags;
+    uint8_t bCopyProtect;
+} __PACKED usb_video_vs_mjpeg_format_desc;
+
+// Uncompressed and MJPEG formats have the same frame descriptor structure.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FRAME_UNCOMPRESSED / USB_VIDEO_VS_FRAME_MJPEG
+    uint8_t bFrameIndex;
+    uint8_t bmCapabilities;
+    uint16_t wWidth;
+    uint16_t wHeight;
+    uint32_t dwMinBitRate;
+    uint32_t dwMaxBitRate;
+    uint32_t dwMaxVideoFrameBufferSize;
+    uint32_t dwDefaultFrameInterval;
+    uint8_t bFrameIntervalType;
+    uint32_t dwFrameInterval[];
+} __PACKED usb_video_vs_frame_desc;
+
+// Stream negotiation
+#define USB_VIDEO_BM_HINT_FRAME_INTERVAL        (1 << 0)
+#define USB_VIDEO_BM_HINT_KEY_FRAME_RATE        (1 << 1)
+#define USB_VIDEO_BM_HINT_P_FRAME_RATE          (1 << 2)
+#define USB_VIDEO_BM_HINT_COMP_QUALITY          (1 << 3)
+#define USB_VIDEO_BM_HINT_COMP_WINDOW_SIZE      (1 << 4)
+
+typedef struct {
+   uint16_t bmHint;
+   uint8_t bFormatIndex;
+   uint8_t bFrameIndex;
+   uint32_t dwFrameInterval;
+   uint16_t wKeyFrameRate;
+   uint16_t wPFrameRate;
+   uint16_t wCompQuality;
+   uint16_t wCompWindowSize;
+   uint16_t wDelay;
+   uint32_t dwMaxVideoFrameSize;
+   uint32_t dwMaxPayloadTransferSize;
+   // The following fields are optional.
+   uint32_t dwClockFrequency;
+   uint8_t bmFramingInfo;
+   uint8_t bPreferedVersion;
+   uint8_t bMinVersion;
+   uint8_t bMaxVersion;
+   uint8_t bUsage;
+   uint8_t bBitDepthLuma;
+   uint8_t bmSettings;
+   uint8_t bMaxNumberOfRefFramesPlus1;
+   uint16_t bmRateControlModes;
+   uint32_t bmLayoutPerStream;
+} __PACKED usb_video_vc_probe_and_commit_controls;
+
+// For accessing payload bmHeaderInfo bitmap
+#define USB_VIDEO_VS_PAYLOAD_HEADER_FID         (1 << 0)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_EOF         (1 << 1)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_PTS         (1 << 2)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_SCR         (1 << 3)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_RES         (1 << 4)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_STI         (1 << 5)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_ERR         (1 << 6)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_EOH         (1 << 7)
+
+// Common header for all payloads.
+typedef struct {
+    uint8_t bHeaderLength;
+    uint8_t bmHeaderInfo;
+
+} __PACKED usb_video_vs_payload_header;
+
+typedef struct {
+    uint8_t bHeaderLength;
+    uint8_t bmHeaderInfo;
+    uint32_t dwPresentationTime;
+    uint32_t scrSourceTimeClock;
+    // Frame number when the source clock was sampled.
+    uint16_t scrSourceClockSOFCounter;
+} __PACKED usb_video_vs_uncompressed_payload_header;
+
+__END_CDECLS;
+
+
+#endif  // SYSROOT_ZIRCON_HW_USB_VIDEO_H_
diff --git a/arch/arm64/sysroot/include/zircon/limits.h b/arch/arm64/sysroot/include/zircon/limits.h
index 4c691a3..f062d5e 100644
--- a/arch/arm64/sysroot/include/zircon/limits.h
+++ b/arch/arm64/sysroot/include/zircon/limits.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_LIMITS_H_
-#define ZIRCON_LIMITS_H_
+#ifndef SYSROOT_ZIRCON_LIMITS_H_
+#define SYSROOT_ZIRCON_LIMITS_H_
 
 #include <stdint.h>
 
 #define ZX_PAGE_SHIFT ((uint32_t)12u)
-#define ZX_PAGE_SIZE ((uint32_t)(1u << ZX_PAGE_SHIFT))
+#define ZX_PAGE_SIZE ((uintptr_t)(1u << ZX_PAGE_SHIFT))
 #define ZX_PAGE_MASK (ZX_PAGE_SIZE - 1u)
 
-#endif // ZIRCON_LIMITS_H_
+#endif  // SYSROOT_ZIRCON_LIMITS_H_
diff --git a/arch/arm64/sysroot/include/zircon/listnode.h b/arch/arm64/sysroot/include/zircon/listnode.h
index b987bdf..fb64acf 100644
--- a/arch/arm64/sysroot/include/zircon/listnode.h
+++ b/arch/arm64/sysroot/include/zircon/listnode.h
@@ -2,303 +2,299 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_LISTNODE_H_
+#define SYSROOT_ZIRCON_LISTNODE_H_
 
-#include <zircon/compiler.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 #define containerof(ptr, type, member) ((type*)((uintptr_t)(ptr)-offsetof(type, member)))
 
 typedef struct list_node list_node_t;
 
 struct list_node {
-    list_node_t* prev;
-    list_node_t* next;
+  list_node_t* prev;
+  list_node_t* next;
 };
 
 #define LIST_INITIAL_VALUE(list) \
-    { &(list), &(list) }
+  { &(list), &(list) }
 #define LIST_INITIAL_CLEARED_VALUE \
-    { NULL, NULL }
+  { NULL, NULL }
 
-static inline void list_initialize(list_node_t* list) {
-    list->prev = list->next = list;
-}
+static inline void list_initialize(list_node_t* list) { list->prev = list->next = list; }
 
-static inline void list_clear_node(list_node_t* item) {
-    item->prev = item->next = 0;
-}
+static inline void list_clear_node(list_node_t* item) { item->prev = item->next = 0; }
 
 static inline bool list_in_list(const list_node_t* item) {
-    if (item->prev == 0 && item->next == 0)
-        return false;
-    else
-        return true;
+  if (item->prev == 0 && item->next == 0)
+    return false;
+  else
+    return true;
 }
 
 static inline void list_add_head(list_node_t* list, list_node_t* item) {
-    item->next = list->next;
-    item->prev = list;
-    list->next->prev = item;
-    list->next = item;
+  item->next = list->next;
+  item->prev = list;
+  list->next->prev = item;
+  list->next = item;
 }
 
 #define list_add_after(entry, new_entry) list_add_head(entry, new_entry)
 
 static inline void list_add_tail(list_node_t* list, list_node_t* item) {
-    item->prev = list->prev;
-    item->next = list;
-    list->prev->next = item;
-    list->prev = item;
+  item->prev = list->prev;
+  item->next = list;
+  list->prev->next = item;
+  list->prev = item;
 }
 
 #define list_add_before(entry, new_entry) list_add_tail(entry, new_entry)
 
 static inline void list_delete(list_node_t* item) {
-    item->next->prev = item->prev;
-    item->prev->next = item->next;
-    item->prev = item->next = 0;
+  item->next->prev = item->prev;
+  item->prev->next = item->next;
+  item->prev = item->next = 0;
 }
 
 static inline void list_replace_node(list_node_t* old_node, list_node_t* new_node) {
-    // replace a spot in a list with a new node
-    // assumes old_node is part of a list and new_node is not
-    new_node->next = old_node->next;
-    new_node->prev = old_node->prev;
-    old_node->prev = old_node->next = 0;
+  // replace a spot in a list with a new node
+  // assumes old_node is part of a list and new_node is not
+  new_node->next = old_node->next;
+  new_node->prev = old_node->prev;
+  old_node->prev = old_node->next = 0;
 
-    new_node->next->prev = new_node;
-    new_node->prev->next = new_node;
+  new_node->next->prev = new_node;
+  new_node->prev->next = new_node;
 }
 
 static inline list_node_t* list_remove_head(list_node_t* list) {
-    if (list->next != list) {
-        list_node_t* item = list->next;
-        list_delete(item);
-        return item;
-    } else {
-        return NULL;
-    }
+  if (list->next != list) {
+    list_node_t* item = list->next;
+    list_delete(item);
+    return item;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_remove_head_type(list, type, element)   \
-    ({                                               \
-        list_node_t* __nod = list_remove_head(list); \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_remove_head_type(list, type, element) \
+  ({                                               \
+    list_node_t* __nod = list_remove_head(list);   \
+    type* __t;                                     \
+    if (__nod)                                     \
+      __t = containerof(__nod, type, element);     \
+    else                                           \
+      __t = (type*)0;                              \
+    __t;                                           \
+  })
 
 static inline list_node_t* list_remove_tail(list_node_t* list) {
-    if (list->prev != list) {
-        list_node_t* item = list->prev;
-        list_delete(item);
-        return item;
-    } else {
-        return NULL;
-    }
+  if (list->prev != list) {
+    list_node_t* item = list->prev;
+    list_delete(item);
+    return item;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_remove_tail_type(list, type, element)   \
-    ({                                               \
-        list_node_t* __nod = list_remove_tail(list); \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_remove_tail_type(list, type, element) \
+  ({                                               \
+    list_node_t* __nod = list_remove_tail(list);   \
+    type* __t;                                     \
+    if (__nod)                                     \
+      __t = containerof(__nod, type, element);     \
+    else                                           \
+      __t = (type*)0;                              \
+    __t;                                           \
+  })
 
-static inline list_node_t* list_peek_head(list_node_t* list) {
-    if (list->next != list) {
-        return list->next;
-    } else {
-        return NULL;
-    }
+static inline list_node_t* list_peek_head(const list_node_t* list) {
+  if (list->next != list) {
+    return list->next;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_peek_head_type(list, type, element)     \
-    ({                                               \
-        list_node_t* __nod = list_peek_head(list);   \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_peek_head_type(list, type, element) \
+  ({                                             \
+    list_node_t* __nod = list_peek_head(list);   \
+    type* __t;                                   \
+    if (__nod)                                   \
+      __t = containerof(__nod, type, element);   \
+    else                                         \
+      __t = (type*)0;                            \
+    __t;                                         \
+  })
 
-static inline list_node_t* list_peek_tail(list_node_t* list) {
-    if (list->prev != list) {
-        return list->prev;
-    } else {
-        return NULL;
-    }
+static inline list_node_t* list_peek_tail(const list_node_t* list) {
+  if (list->prev != list) {
+    return list->prev;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_peek_tail_type(list, type, element)     \
-    ({                                               \
-        list_node_t* __nod = list_peek_tail(list);   \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_peek_tail_type(list, type, element) \
+  ({                                             \
+    list_node_t* __nod = list_peek_tail(list);   \
+    type* __t;                                   \
+    if (__nod)                                   \
+      __t = containerof(__nod, type, element);   \
+    else                                         \
+      __t = (type*)0;                            \
+    __t;                                         \
+  })
 
 static inline list_node_t* list_prev(list_node_t* list, list_node_t* item) {
-    if (item->prev != list)
-        return item->prev;
-    else
-        return NULL;
+  if (item->prev != list)
+    return item->prev;
+  else
+    return NULL;
 }
 
-#define list_prev_type(list, item, type, element)    \
-    ({                                               \
-        list_node_t* __nod = list_prev(list, item);  \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_prev_type(list, item, type, element) \
+  ({                                              \
+    list_node_t* __nod = list_prev(list, item);   \
+    type* __t;                                    \
+    if (__nod)                                    \
+      __t = containerof(__nod, type, element);    \
+    else                                          \
+      __t = (type*)0;                             \
+    __t;                                          \
+  })
 
 static inline list_node_t* list_prev_wrap(list_node_t* list, list_node_t* item) {
-    if (item->prev != list)
-        return item->prev;
-    else if (item->prev->prev != list)
-        return item->prev->prev;
-    else
-        return NULL;
+  if (item->prev != list)
+    return item->prev;
+  else if (item->prev->prev != list)
+    return item->prev->prev;
+  else
+    return NULL;
 }
 
-#define list_prev_wrap_type(list, item, type, element)   \
-    ({                                                   \
-        list_node_t* __nod = list_prev_wrap(list, item); \
-        type* __t;                                       \
-        if (__nod)                                       \
-            __t = containerof(__nod, type, element);     \
-        else                                             \
-            __t = (type*)0;                              \
-        __t;                                             \
-    })
+#define list_prev_wrap_type(list, item, type, element) \
+  ({                                                   \
+    list_node_t* __nod = list_prev_wrap(list, item);   \
+    type* __t;                                         \
+    if (__nod)                                         \
+      __t = containerof(__nod, type, element);         \
+    else                                               \
+      __t = (type*)0;                                  \
+    __t;                                               \
+  })
 
 static inline list_node_t* list_next(list_node_t* list, list_node_t* item) {
-    if (item->next != list)
-        return item->next;
-    else
-        return NULL;
+  if (item->next != list)
+    return item->next;
+  else
+    return NULL;
 }
 
-#define list_next_type(list, item, type, element)    \
-    ({                                               \
-        list_node_t* __nod = list_next(list, item);  \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_next_type(list, item, type, element) \
+  ({                                              \
+    list_node_t* __nod = list_next(list, item);   \
+    type* __t;                                    \
+    if (__nod)                                    \
+      __t = containerof(__nod, type, element);    \
+    else                                          \
+      __t = (type*)0;                             \
+    __t;                                          \
+  })
 
 static inline list_node_t* list_next_wrap(list_node_t* list, list_node_t* item) {
-    if (item->next != list)
-        return item->next;
-    else if (item->next->next != list)
-        return item->next->next;
-    else
-        return NULL;
+  if (item->next != list)
+    return item->next;
+  else if (item->next->next != list)
+    return item->next->next;
+  else
+    return NULL;
 }
 
-#define list_next_wrap_type(list, item, type, element)   \
-    ({                                                   \
-        list_node_t* __nod = list_next_wrap(list, item); \
-        type* __t;                                       \
-        if (__nod)                                       \
-            __t = containerof(__nod, type, element);     \
-        else                                             \
-            __t = (type*)0;                              \
-        __t;                                             \
-    })
+#define list_next_wrap_type(list, item, type, element) \
+  ({                                                   \
+    list_node_t* __nod = list_next_wrap(list, item);   \
+    type* __t;                                         \
+    if (__nod)                                         \
+      __t = containerof(__nod, type, element);         \
+    else                                               \
+      __t = (type*)0;                                  \
+    __t;                                               \
+  })
 
 // iterates over the list, node should be list_node_t*
 #define list_for_every(list, node) for (node = (list)->next; node != (list); node = node->next)
 
 // iterates over the list in a safe way for deletion of current node
 // node and temp_node should be list_node_t*
-#define list_for_every_safe(list, node, temp_node)                      \
-    for (node = (list)->next, temp_node = (node)->next; node != (list); \
-         node = temp_node, temp_node = (node)->next)
+#define list_for_every_safe(list, node, temp_node)                    \
+  for (node = (list)->next, temp_node = (node)->next; node != (list); \
+       node = temp_node, temp_node = (node)->next)
 
 // iterates over the list, entry should be the container structure type *
-#define list_for_every_entry(list, entry, type, member)                                 \
-    for ((entry) = containerof((list)->next, type, member); &(entry)->member != (list); \
-         (entry) = containerof((entry)->member.next, type, member))
+#define list_for_every_entry(list, entry, type, member)                               \
+  for ((entry) = containerof((list)->next, type, member); &(entry)->member != (list); \
+       (entry) = containerof((entry)->member.next, type, member))
 
 // iterates over the list in a safe way for deletion of current node
 // entry and temp_entry should be the container structure type *
 #define list_for_every_entry_safe(list, entry, temp_entry, type, member) \
-    for (entry = containerof((list)->next, type, member),                \
-        temp_entry = containerof((entry)->member.next, type, member);    \
-         &(entry)->member != (list);                                     \
-         entry = temp_entry, temp_entry = containerof((temp_entry)->member.next, type, member))
+  for (entry = containerof((list)->next, type, member),                  \
+      temp_entry = containerof((entry)->member.next, type, member);      \
+       &(entry)->member != (list);                                       \
+       entry = temp_entry, temp_entry = containerof((temp_entry)->member.next, type, member))
 
 static inline bool list_is_empty(const list_node_t* list) {
-    return (list->next == list) ? true : false;
+  return (list->next == list) ? true : false;
 }
 
 static inline size_t list_length(const list_node_t* list) {
-    size_t cnt = 0;
-    const list_node_t* node = list;
-    list_for_every(list, node) {
-        cnt++;
-    }
+  size_t cnt = 0;
+  const list_node_t* node = list;
+  list_for_every(list, node) { cnt++; }
 
-    return cnt;
+  return cnt;
 }
 
 // Splice the contents of splice_from into the list immediately following pos.
 static inline void list_splice_after(list_node_t* splice_from, list_node_t* pos) {
-    if (list_is_empty(splice_from)) {
-        return;
-    }
-    splice_from->next->prev = pos;
-    splice_from->prev->next = pos->next;
-    pos->next->prev = splice_from->prev;
-    pos->next = splice_from->next;
-    list_initialize(splice_from);
+  if (list_is_empty(splice_from)) {
+    return;
+  }
+  splice_from->next->prev = pos;
+  splice_from->prev->next = pos->next;
+  pos->next->prev = splice_from->prev;
+  pos->next = splice_from->next;
+  list_initialize(splice_from);
 }
 
 // Split the contents of list after (but not including) pos, into split_to
 // (which should be empty).
-static inline void list_split_after(list_node_t* list, list_node_t* pos,
-                                    list_node_t* split_to) {
-    if (pos->next == list) {
-        list_initialize(split_to);
-        return;
-    }
-    split_to->prev = list->prev;
-    split_to->prev->next = split_to;
-    split_to->next = pos->next;
-    split_to->next->prev = split_to;
-    pos->next = list;
-    list->prev = pos;
+static inline void list_split_after(list_node_t* list, list_node_t* pos, list_node_t* split_to) {
+  if (pos->next == list) {
+    list_initialize(split_to);
+    return;
+  }
+  split_to->prev = list->prev;
+  split_to->prev->next = split_to;
+  split_to->next = pos->next;
+  split_to->next->prev = split_to;
+  pos->next = list;
+  list->prev = pos;
 }
 
 // Moves all the contents of old_list (which may or may not be empty)
 // to new_list (which should be empty).
 static inline void list_move(list_node_t* old_list, list_node_t* new_list) {
-    list_initialize(new_list);
-    list_splice_after(old_list, new_list);
+  list_initialize(new_list);
+  list_splice_after(old_list, new_list);
 }
 
-__END_CDECLS;
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_LISTNODE_H_
diff --git a/arch/arm64/sysroot/include/zircon/lookup.h b/arch/arm64/sysroot/include/zircon/lookup.h
new file mode 100644
index 0000000..fffa781
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/lookup.h
@@ -0,0 +1,34 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_LOOKUP_H_
+#define SYSROOT_ZIRCON_LOOKUP_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+__BEGIN_CDECLS
+
+struct address {
+  int family;
+  unsigned scopeid;
+  uint8_t addr[16];
+  int sortkey;
+};
+
+/* The limit of 48 results is a non-sharp bound on the number of addresses
+ * that can fit in one 512-byte DNS packet full of v4 results and a second
+ * packet full of v6 results. Due to headers, the actual limit is lower. */
+#define MAXADDRS 48
+
+// This function is used by musl to perform an actual DNS lookup - it takes
+// a name and address family, sends a DNS query, and fills out the addresses
+// and canonical name with the response.
+int _getaddrinfo_from_dns(struct address buf[MAXADDRS], char canon[256], const char* name,
+                          int family);
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_LOOKUP_H_
diff --git a/arch/arm64/sysroot/include/zircon/pixelformat.h b/arch/arm64/sysroot/include/zircon/pixelformat.h
index 8d15c0c..f28f35f 100644
--- a/arch/arm64/sysroot/include/zircon/pixelformat.h
+++ b/arch/arm64/sysroot/include/zircon/pixelformat.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PIXELFORMAT_H_
-#define ZIRCON_PIXELFORMAT_H_
+#ifndef SYSROOT_ZIRCON_PIXELFORMAT_H_
+#define SYSROOT_ZIRCON_PIXELFORMAT_H_
 
 #include <stdint.h>
 
@@ -20,7 +20,9 @@
 #define ZX_PIXEL_FORMAT_MONO_8     ((zx_pixel_format_t)0x00010007)
 #define ZX_PIXEL_FORMAT_GRAY_8     ((zx_pixel_format_t)0x00010007)
 #define ZX_PIXEL_FORMAT_NV12       ((zx_pixel_format_t)0x00010008)
-
+#define ZX_PIXEL_FORMAT_RGB_888    ((zx_pixel_format_t)0x00030009)
+#define ZX_PIXEL_FORMAT_ABGR_8888  ((zx_pixel_format_t)0x0004000a)
+#define ZX_PIXEL_FORMAT_BGR_888x   ((zx_pixel_format_t)0x0004000b)
 #define ZX_PIXEL_FORMAT_BYTES(pf)  (((pf) >> 16) & 7)
 
-#endif // ZIRCON_PIXELFORMAT_H_
+#endif // SYSROOT_ZIRCON_PIXELFORMAT_H_
diff --git a/arch/arm64/sysroot/include/zircon/process.h b/arch/arm64/sysroot/include/zircon/process.h
index bec8a79..ef2bcb1 100644
--- a/arch/arm64/sysroot/include/zircon/process.h
+++ b/arch/arm64/sysroot/include/zircon/process.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PROCESS_H_
-#define ZIRCON_PROCESS_H_
+#ifndef SYSROOT_ZIRCON_PROCESS_H_
+#define SYSROOT_ZIRCON_PROCESS_H_
 
-#include <zircon/types.h>
 #include <stdint.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
@@ -32,4 +32,4 @@
 
 __END_CDECLS
 
-#endif // ZIRCON_PROCESS_H_
+#endif  // SYSROOT_ZIRCON_PROCESS_H_
diff --git a/arch/arm64/sysroot/include/zircon/processargs.h b/arch/arm64/sysroot/include/zircon/processargs.h
index dfc771f..ee99985 100644
--- a/arch/arm64/sysroot/include/zircon/processargs.h
+++ b/arch/arm64/sysroot/include/zircon/processargs.h
@@ -2,95 +2,95 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PROCESSARGS_H_
-#define ZIRCON_PROCESSARGS_H_
+#ifndef SYSROOT_ZIRCON_PROCESSARGS_H_
+#define SYSROOT_ZIRCON_PROCESSARGS_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
 #include <zircon/types.h>
-#include <stdint.h>
 
 __BEGIN_CDECLS
 
 // This is a protocol for passing state to a new process
 // via a message in a channel.
 
-#define ZX_PROCARGS_PROTOCOL ((uint32_t)0x4150585du) // MXPA
+#define ZX_PROCARGS_PROTOCOL ((uint32_t)0x4150585du)  // MXPA
 #define ZX_PROCARGS_VERSION ((uint32_t)0x0001000u)
 
 typedef struct zx_proc_args zx_proc_args_t;
 
 struct zx_proc_args {
-    // Protocol and version identifiers to allow for
-    // different process start message protocols and
-    // versioning of the same.
-    uint32_t protocol;
-    uint32_t version;
+  // Protocol and version identifiers to allow for
+  // different process start message protocols and
+  // versioning of the same.
+  uint32_t protocol;
+  uint32_t version;
 
-    // Offset from start of message to handle info
-    // array, which contains one uint32_t per handle
-    // passed along with the message.
-    uint32_t handle_info_off;
+  // Offset from start of message to handle info
+  // array, which contains one uint32_t per handle
+  // passed along with the message.
+  uint32_t handle_info_off;
 
-    // Offset from start of message to arguments and
-    // count of arguments.  Arguments are provided as
-    // a set of null-terminated utf-8 strings, one
-    // after the other.
-    uint32_t args_off;
-    uint32_t args_num;
+  // Offset from start of message to arguments and
+  // count of arguments.  Arguments are provided as
+  // a set of null-terminated utf-8 strings, one
+  // after the other.
+  uint32_t args_off;
+  uint32_t args_num;
 
-    // Offset from start of message to environment strings and count of
-    // them.  Environment entries are provided as a set of null-terminated
-    // UTF-8 strings, one after the other.  Canonically each string has
-    // the form "NAME=VALUE", but nothing enforces this.
-    uint32_t environ_off;
-    uint32_t environ_num;
+  // Offset from start of message to environment strings and count of
+  // them.  Environment entries are provided as a set of null-terminated
+  // UTF-8 strings, one after the other.  Canonically each string has
+  // the form "NAME=VALUE", but nothing enforces this.
+  uint32_t environ_off;
+  uint32_t environ_num;
 
-    // Offset from start of message to name strings and count of them.
-    // These strings are packed similar to the argument strings,
-    // but are referenced by PA_NS_* handle table entries and used
-    // to set up namespaces.
-    //
-    // Specifically: In a handle table entry with PA_HND_TYPE(info)
-    // of PA_NS_*, PA_HND_ARG(info) is an index into this name table.
-    uint32_t names_off;
-    uint32_t names_num;
+  // Offset from start of message to name strings and count of them.
+  // These strings are packed similar to the argument strings,
+  // but are referenced by PA_NS_* handle table entries and used
+  // to set up namespaces.
+  //
+  // Specifically: In a handle table entry with PA_HND_TYPE(info)
+  // of PA_NS_*, PA_HND_ARG(info) is an index into this name table.
+  uint32_t names_off;
+  uint32_t names_num;
 };
 
 // Handle Info entries associate a type and optional
 // argument with each handle included in the process
 // arguments message.
-#define PA_HND(type, arg)          (((type)&0xFF)| (((arg)&0xFFFF)<<16))
-#define PA_HND_TYPE(n)             ((n) & 0xFF)
-#define PA_HND_SUBTYPE(n)          (((n) >> 8) & 0xFF)
-#define PA_HND_ARG(n)              (((n) >> 16) & 0xFFFF)
+#define PA_HND(type, arg) (((type)&0xFF) | (((arg)&0xFFFF) << 16))
+#define PA_HND_TYPE(n) ((n)&0xFF)
+#define PA_HND_ARG(n) (((n) >> 16) & 0xFFFF)
 
 // --- Core Runtime Handles ---
 // Used by libc init (or equivalent) and dynamic loader
 
 // Handle to our own process.
-#define PA_PROC_SELF             0x01u
+#define PA_PROC_SELF 0x01u
 
 // Handle to the initial thread of our own process.
-#define PA_THREAD_SELF           0x02u
+#define PA_THREAD_SELF 0x02u
 
-// Handle to a Job object which can be used to make child processes. The
-// Job can be the same as the one used to create this process or it can
+// Handle to a job object which can be used to make child processes.
+//
+// The job can be the same as the one used to create this process or it can
 // be different.
-#define PA_JOB_DEFAULT           0x03u
+#define PA_JOB_DEFAULT 0x03u
 
 // Handle to the root of our address space
-#define PA_VMAR_ROOT             0x04u
+#define PA_VMAR_ROOT 0x04u
 
 // Handle to the VMAR used to load the initial program image.
-#define PA_VMAR_LOADED           0x05u
-
+#define PA_VMAR_LOADED 0x05u
 
 // --- Loader Service and VMO Handles ---
 // Used by libc init (or equivalent) and dynamic loader
 
 // Service for loading shared libraries.
+//
 // See |fuchsia.ldsvc.Loader| for the interface definition.
-#define PA_LDSVC_LOADER          0x10u
+#define PA_LDSVC_LOADER 0x10u
 
 // Handle to the VMO containing the ELF image of the system vDSO.  This
 // handle is duplicable, transferable, readable, and executable, but not
@@ -100,7 +100,7 @@
 // might create or propagate it on to its children so they can do so.
 // Each process's own vDSO was mapped in by its creator before the
 // process started, its address passed as an argument to entry point.
-#define PA_VMO_VDSO              0x11u
+#define PA_VMO_VDSO 0x11u
 
 // Handle to the VMO used to map the initial thread's stack.  This
 // handle usually has all rights.  The protocol between process creator
@@ -111,53 +111,66 @@
 // calling convention for function entry.  Thus the new process can
 // compute its exact stack bounds by subtracting the size reported by
 // this VMO from the (adjusted back up) initial SP value.
-#define PA_VMO_STACK             0x13u
+#define PA_VMO_STACK 0x13u
 
 // VM object handle for the main executable file
-#define PA_VMO_EXECUTABLE        0x14u
+#define PA_VMO_EXECUTABLE 0x14u
 
 // Used by kernel and userboot during startup
-#define PA_VMO_BOOTDATA          0x1Au
+#define PA_VMO_BOOTDATA 0x1Au
 
 // Used by kernel and userboot during startup
-#define PA_VMO_BOOTFS            0x1Bu
+#define PA_VMO_BOOTFS 0x1Bu
 
 // Used by the kernel to export debug information as a file in bootfs.  When
 // devmgr starts, it looks for handles of this type, and adds them as files in
 // /boot/kernel/<vmo-name>.
-#define PA_VMO_KERNEL_FILE       0x1Cu
-
+#define PA_VMO_KERNEL_FILE 0x1Cu
 
 // --- Namespace Handles ---
 
 // A handle which will handle OPEN requests relative
 // to a particular path which is specified by the
 // nametable entry referred to by the "arg" field
-#define PA_NS_DIR                0x20u
+#define PA_NS_DIR 0x20u
 
+// --- File Descriptor Handles ---
 
-// --- FDIO Handles ---
-// Used by libfdio for passing fdtable, fsroot, etc
+// A handle which will be used as a file descriptor.
+#define PA_FD 0x30u
 
-// Handle types the fdio library uses
-#define PA_FDIO_REMOTE           0x32u
-#define PA_FDIO_LOGGER           0x35u
-#define PA_FDIO_SOCKET           0x36u
+// -- Lifecyle handle --
+//
+// A Handle to a channel on which the process may receive lifecycle events from
+// the ELF runner by serving the |fuchsia.process.Lifecycle| protocol.
+#define PA_LIFECYCLE 0x3Au
 
 // Server endpoint for handling connection to appmgr services.
-#define PA_DIRECTORY_REQUEST     0x3Bu
+#define PA_DIRECTORY_REQUEST 0x3Bu
 
 // Used by devmgr and devhosts
-#define PA_RESOURCE              0x3Fu
+#define PA_RESOURCE 0x3Fu
 
+// --- Clock handles ---
+//
+// A clock which provides access to UTC.  Used by runtimes which are expected to
+// provide access to UTC via their standard libraries.
+//
+#define PA_CLOCK_UTC 0x40u
+
+// --- Resource handles ---
+#define PA_MMIO_RESOURCE 0x50
+#define PA_IRQ_RESOURCE 0x51
+#define PA_IOPORT_RESOURCE 0x52
+#define PA_SMC_RESOURCE 0x53
 
 // --- Various ---
 
 // Handle types for one-off use and prototyping
-#define PA_USER0                 0xF0u
-#define PA_USER1                 0xF1u
-#define PA_USER2                 0xF2u
+#define PA_USER0 0xF0u
+#define PA_USER1 0xF1u
+#define PA_USER2 0xF2u
 
 __END_CDECLS
 
-#endif // ZIRCON_PROCESSARGS_H_
+#endif  // SYSROOT_ZIRCON_PROCESSARGS_H_
diff --git a/arch/arm64/sysroot/include/zircon/rights.h b/arch/arm64/sysroot/include/zircon/rights.h
index 8c9f021..1cfa768 100644
--- a/arch/arm64/sysroot/include/zircon/rights.h
+++ b/arch/arm64/sysroot/include/zircon/rights.h
@@ -2,34 +2,34 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_RIGHTS_H_
-#define ZIRCON_RIGHTS_H_
+#ifndef SYSROOT_ZIRCON_RIGHTS_H_
+#define SYSROOT_ZIRCON_RIGHTS_H_
 
 #include <stdint.h>
 
 typedef uint32_t zx_rights_t;
-#define ZX_RIGHT_NONE             ((zx_rights_t)0u)
-#define ZX_RIGHT_DUPLICATE        ((zx_rights_t)1u << 0)
-#define ZX_RIGHT_TRANSFER         ((zx_rights_t)1u << 1)
-#define ZX_RIGHT_READ             ((zx_rights_t)1u << 2)
-#define ZX_RIGHT_WRITE            ((zx_rights_t)1u << 3)
-#define ZX_RIGHT_EXECUTE          ((zx_rights_t)1u << 4)
-#define ZX_RIGHT_MAP              ((zx_rights_t)1u << 5)
-#define ZX_RIGHT_GET_PROPERTY     ((zx_rights_t)1u << 6)
-#define ZX_RIGHT_SET_PROPERTY     ((zx_rights_t)1u << 7)
-#define ZX_RIGHT_ENUMERATE        ((zx_rights_t)1u << 8)
-#define ZX_RIGHT_DESTROY          ((zx_rights_t)1u << 9)
-#define ZX_RIGHT_SET_POLICY       ((zx_rights_t)1u << 10)
-#define ZX_RIGHT_GET_POLICY       ((zx_rights_t)1u << 11)
-#define ZX_RIGHT_SIGNAL           ((zx_rights_t)1u << 12)
-#define ZX_RIGHT_SIGNAL_PEER      ((zx_rights_t)1u << 13)
-#define ZX_RIGHT_WAIT             ((zx_rights_t)1u << 14)
-#define ZX_RIGHT_INSPECT          ((zx_rights_t)1u << 15)
-#define ZX_RIGHT_MANAGE_JOB       ((zx_rights_t)1u << 16)
-#define ZX_RIGHT_MANAGE_PROCESS   ((zx_rights_t)1u << 17)
-#define ZX_RIGHT_MANAGE_THREAD    ((zx_rights_t)1u << 18)
-#define ZX_RIGHT_APPLY_PROFILE    ((zx_rights_t)1u << 19)
-#define ZX_RIGHT_SAME_RIGHTS      ((zx_rights_t)1u << 31)
+#define ZX_RIGHT_NONE ((zx_rights_t)0u)
+#define ZX_RIGHT_DUPLICATE ((zx_rights_t)1u << 0)
+#define ZX_RIGHT_TRANSFER ((zx_rights_t)1u << 1)
+#define ZX_RIGHT_READ ((zx_rights_t)1u << 2)
+#define ZX_RIGHT_WRITE ((zx_rights_t)1u << 3)
+#define ZX_RIGHT_EXECUTE ((zx_rights_t)1u << 4)
+#define ZX_RIGHT_MAP ((zx_rights_t)1u << 5)
+#define ZX_RIGHT_GET_PROPERTY ((zx_rights_t)1u << 6)
+#define ZX_RIGHT_SET_PROPERTY ((zx_rights_t)1u << 7)
+#define ZX_RIGHT_ENUMERATE ((zx_rights_t)1u << 8)
+#define ZX_RIGHT_DESTROY ((zx_rights_t)1u << 9)
+#define ZX_RIGHT_SET_POLICY ((zx_rights_t)1u << 10)
+#define ZX_RIGHT_GET_POLICY ((zx_rights_t)1u << 11)
+#define ZX_RIGHT_SIGNAL ((zx_rights_t)1u << 12)
+#define ZX_RIGHT_SIGNAL_PEER ((zx_rights_t)1u << 13)
+#define ZX_RIGHT_WAIT ((zx_rights_t)1u << 14)
+#define ZX_RIGHT_INSPECT ((zx_rights_t)1u << 15)
+#define ZX_RIGHT_MANAGE_JOB ((zx_rights_t)1u << 16)
+#define ZX_RIGHT_MANAGE_PROCESS ((zx_rights_t)1u << 17)
+#define ZX_RIGHT_MANAGE_THREAD ((zx_rights_t)1u << 18)
+#define ZX_RIGHT_APPLY_PROFILE ((zx_rights_t)1u << 19)
+#define ZX_RIGHT_SAME_RIGHTS ((zx_rights_t)1u << 31)
 
 // Convenient names for commonly grouped rights.
 #define ZX_RIGHTS_BASIC (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WAIT | ZX_RIGHT_INSPECT)
@@ -40,88 +40,85 @@
 
 #define ZX_RIGHTS_POLICY (ZX_RIGHT_GET_POLICY | ZX_RIGHT_SET_POLICY)
 
-#define ZX_DEFAULT_CHANNEL_RIGHTS                                                                  \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_DUPLICATE)) | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL |                  \
-     ZX_RIGHT_SIGNAL_PEER)
+#define ZX_DEFAULT_CHANNEL_RIGHTS                                               \
+  ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_DUPLICATE)) | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL | \
+   ZX_RIGHT_SIGNAL_PEER)
 
 #define ZX_DEFAULT_EVENT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_SIGNAL)
 
+#define ZX_DEFAULT_SYSTEM_EVENT_LOW_MEMORY_RIGHTS \
+  (ZX_RIGHT_WAIT | ZX_RIGHT_DUPLICATE | ZX_RIGHT_TRANSFER)
+
 #define ZX_DEFAULT_EVENTPAIR_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
 #define ZX_DEFAULT_FIFO_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO |\
-     ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
-#define ZX_DEFAULT_GUEST_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE |\
-     ZX_RIGHT_INSPECT | ZX_RIGHT_MANAGE_PROCESS)
+#define ZX_DEFAULT_GUEST_RIGHTS                                                 \
+  (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE | ZX_RIGHT_INSPECT | \
+   ZX_RIGHT_MANAGE_PROCESS)
 
 #define ZX_DEFAULT_INTERRUPT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_IO_MAPPING_RIGHTS \
-    (ZX_RIGHT_READ | ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_IO_MAPPING_RIGHTS (ZX_RIGHT_READ | ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_JOB_RIGHTS                                                                      \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHTS_POLICY | ZX_RIGHT_ENUMERATE | \
-     ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_JOB | ZX_RIGHT_MANAGE_PROCESS)
+#define ZX_DEFAULT_JOB_RIGHTS                                                                    \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHTS_POLICY | ZX_RIGHT_ENUMERATE | \
+   ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_JOB | ZX_RIGHT_MANAGE_PROCESS |          \
+   ZX_RIGHT_MANAGE_THREAD)
 
-#define ZX_DEFAULT_LOG_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_LOG_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_PCI_DEVICE_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
+#define ZX_DEFAULT_MSI_RIGHTS (ZX_RIGHTS_BASIC)
 
-#define ZX_DEFAULT_PCI_INTERRUPT_RIGHTS \
-    (ZX_RIGHTS_BASIC  | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_PCI_DEVICE_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
 
-#define ZX_DEFAULT_PORT_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO)
+#define ZX_DEFAULT_PCI_INTERRUPT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_PROCESS_RIGHTS                                                                  \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_ENUMERATE | ZX_RIGHT_DESTROY | \
-     ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_PROCESS | ZX_RIGHT_MANAGE_THREAD)
+#define ZX_DEFAULT_PORT_RIGHTS ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO)
+
+#define ZX_DEFAULT_PROCESS_RIGHTS                                                                \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_ENUMERATE | ZX_RIGHT_DESTROY | \
+   ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_PROCESS | ZX_RIGHT_MANAGE_THREAD)
 
 #define ZX_DEFAULT_RESOURCE_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE |\
-     ZX_RIGHT_INSPECT)
+  (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE | ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_SOCKET_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_GET_PROPERTY |\
-     ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
+#define ZX_DEFAULT_SOCKET_RIGHTS                                                    \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_GET_PROPERTY | ZX_RIGHT_SET_PROPERTY | \
+   ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
-#define ZX_DEFAULT_THREAD_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY |\
-     ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_THREAD)
+#define ZX_DEFAULT_STREAM_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_PROPERTY | ZX_RIGHT_SIGNAL)
+
+#define ZX_DEFAULT_THREAD_RIGHTS                                                              \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | \
+   ZX_RIGHT_MANAGE_THREAD)
 
 #define ZX_DEFAULT_TIMER_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_VCPU_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_EXECUTE | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_VCPU_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_EXECUTE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_VMAR_RIGHTS \
-    (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
+#define ZX_DEFAULT_VMAR_RIGHTS (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
 
-#define ZX_DEFAULT_VMO_RIGHTS\
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY |\
-     ZX_RIGHT_EXECUTE | ZX_RIGHT_MAP | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_VMO_RIGHTS \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_MAP | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_IOMMU_RIGHTS \
-    (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
+#define ZX_DEFAULT_IOMMU_RIGHTS (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
 
 #define ZX_DEFAULT_BTI_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO | ZX_RIGHT_MAP)
+  ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_MAP)
 
-#define ZX_DEFAULT_PROFILE_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHT_APPLY_PROFILE)
+#define ZX_DEFAULT_PROFILE_RIGHTS ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHT_APPLY_PROFILE)
 
-#define ZX_DEFAULT_PMT_RIGHTS \
-    (ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_PMT_RIGHTS (ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_SUSPEND_TOKEN_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_SUSPEND_TOKEN_RIGHTS (ZX_RIGHT_TRANSFER | ZX_RIGHT_INSPECT)
 
 #define ZX_DEFAULT_PAGER_RIGHTS \
-    (ZX_RIGHT_INSPECT | ZX_RIGHT_ENUMERATE | ZX_RIGHT_GET_PROPERTY |\
-     ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_TRANSFER)
+  (ZX_RIGHT_INSPECT | ZX_RIGHT_GET_PROPERTY | ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_TRANSFER)
 
-#endif // ZIRCON_RIGHTS_H_
+#define ZX_DEFAULT_EXCEPTION_RIGHTS (ZX_RIGHT_TRANSFER | ZX_RIGHTS_PROPERTY | ZX_RIGHT_INSPECT)
+
+#define ZX_DEFAULT_CLOCK_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
+
+#endif  // SYSROOT_ZIRCON_RIGHTS_H_
diff --git a/arch/arm64/sysroot/include/zircon/sanitizer.h b/arch/arm64/sysroot/include/zircon/sanitizer.h
index 0b0b7a3..c2f2e8e 100644
--- a/arch/arm64/sysroot/include/zircon/sanitizer.h
+++ b/arch/arm64/sysroot/include/zircon/sanitizer.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SANITIZER_H_
+#define SYSROOT_ZIRCON_SANITIZER_H_
 
 // Interfaces declared in this file are intended for the use of sanitizer
 // runtime library implementation code.  Each sanitizer runtime works only
@@ -38,14 +39,20 @@
 //     [shadow_base,    shadow_limit)   Shadow memory, preallocated.
 //     [0,              shadow_base)    Shadow gap, cannot be allocated.
 typedef struct saniziter_shadow_bounds {
-    uintptr_t shadow_base;
-    uintptr_t shadow_limit;
-    uintptr_t memory_limit;
+  uintptr_t shadow_base;
+  uintptr_t shadow_limit;
+  uintptr_t memory_limit;
 } sanitizer_shadow_bounds_t;
 
 // Returns the shadow bounds for the current process.
 sanitizer_shadow_bounds_t __sanitizer_shadow_bounds(void);
 
+// Fill the shadow memory corresponding to [base, base+size) with |value|. The
+// threshold is used as a hint to determine when to switch to a more efficient
+// mechanism when zero-filling large shadow regions. This assumes that both
+// |base| and |size| are aligned to the shadow multiple.
+void __sanitizer_fill_shadow(uintptr_t base, size_t size, uint8_t value, size_t threshold);
+
 // Write logging information from the sanitizer runtime.  The buffer
 // is expected to be printable text with '\n' ending each line.
 // Timestamps and globally unique identifiers of the calling process
@@ -58,7 +65,7 @@
 // files and their debugging information.  The text can contain markup
 // around address values that should be resolved symbolically; see
 // TODO(mcgrathr) for the format and details of the post-processor.
-void __sanitizer_log_write(const char *buffer, size_t len);
+void __sanitizer_log_write(const char* buffer, size_t len);
 
 // Runtimes that have binary data to publish (e.g. coverage) use this
 // interface.  The name describes the data sink that will receive this
@@ -80,16 +87,32 @@
 // after this call returns.  On success, this yields a read-only VMO
 // handle from which the contents associated with that name can be
 // read; the caller is responsible for closing this handle.
-zx_status_t __sanitizer_get_configuration(const char* config_name,
-                                          zx_handle_t* out_vmo);
+zx_status_t __sanitizer_get_configuration(const char* config_name, zx_handle_t* out_vmo);
 
 // Changes protection of the code in the range of len bytes starting
 // from addr. The writable argument specifies whether the code should
 // be made writable or not. This function is only valid on ranges within
 // the caller's own code segment.
 // TODO(phosek) removes this when the proper debugging interface exists.
-zx_status_t __sanitizer_change_code_protection(uintptr_t addr, size_t len,
-                                               bool writable);
+zx_status_t __sanitizer_change_code_protection(uintptr_t addr, size_t len, bool writable);
+
+// This stops all other threads in the process so memory should be quiescent.
+// Then it makes callbacks for memory regions containing non-const global
+// variables, thread stacks, thread registers, and thread-local storage
+// regions (this includes thread_local variables as well as tss_set or
+// pthread_setspecific values).  Each callback is optional; no such callbacks
+// are made if a null function pointer is given.  The memory region passed to
+// each callback can be accessed only during that single callback and might no
+// longer be valid once the callback returns.  Then it makes a final callback
+// before allowing other threads to resume running normally.  If there are
+// problems stopping threads, no memory callbacks will be made and the
+// argument to the final callback will get an error code rather than ZX_OK.
+typedef void sanitizer_memory_snapshot_callback_t(void* mem, size_t len, void* arg);
+void __sanitizer_memory_snapshot(sanitizer_memory_snapshot_callback_t* globals,
+                                 sanitizer_memory_snapshot_callback_t* stacks,
+                                 sanitizer_memory_snapshot_callback_t* regs,
+                                 sanitizer_memory_snapshot_callback_t* tls,
+                                 void (*done)(zx_status_t, void*), void* arg);
 
 // The "hook" interfaces are functions that the sanitizer runtime library
 // can define and libc will call.  There are default definitions in libc
@@ -106,17 +129,16 @@
 // the initial thread has switched to its real thread stack.  Since not
 // even all of libc's own constructors have run yet, this should not call
 // into libc or other library code.
-__EXPORT void __sanitizer_startup_hook(int argc, char** argv, char** envp,
-                                       void* stack_base, size_t stack_size);
+__EXPORT void __sanitizer_startup_hook(int argc, char** argv, char** envp, void* stack_base,
+                                       size_t stack_size);
 
 // This is called when a new thread has been created but is not yet
 // running.  Its C11 thrd_t value has been determined and its stack has
 // been allocated.  All that remains is to actually start the thread
 // running (which can fail only in catastrophic bug situations).  Its
 // return value will be passed to __sanitizer_thread_create_hook, below.
-__EXPORT void* __sanitizer_before_thread_create_hook(
-    thrd_t thread, bool detached, const char* name,
-    void* stack_base, size_t stack_size);
+__EXPORT void* __sanitizer_before_thread_create_hook(thrd_t thread, bool detached, const char* name,
+                                                     void* stack_base, size_t stack_size);
 
 // This is called after a new thread has been created or creation has
 // failed at the final stage; __sanitizer_before_thread_create_hook has
@@ -128,8 +150,7 @@
 // <threads.h> thrd_* value), thread creation has failed and the thread
 // details reported to __sanitizer_before_thread_create_hook will be
 // freed without the thread ever starting.
-__EXPORT void __sanitizer_thread_create_hook(
-    void* hook, thrd_t thread, int error);
+__EXPORT void __sanitizer_thread_create_hook(void* hook, thrd_t thread, int error);
 
 // This is called in each new thread as it starts up.  The argument is
 // the same one returned by __sanitizer_before_thread_create_hook and
@@ -141,4 +162,10 @@
 // The argument is the same one passed to __sanitizer_thread_start_hook.
 __EXPORT void __sanitizer_thread_exit_hook(void* hook, thrd_t self);
 
+// This is called with the argument to _exit and its return value
+// is the actual exit status for the process.
+__EXPORT int __sanitizer_process_exit_hook(int status);
+
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SANITIZER_H_
diff --git a/arch/arm64/sysroot/include/zircon/status.h b/arch/arm64/sysroot/include/zircon/status.h
index 5d83c72..798d2b0 100644
--- a/arch/arm64/sysroot/include/zircon/status.h
+++ b/arch/arm64/sysroot/include/zircon/status.h
@@ -15,8 +15,8 @@
 //
 // For example, zx_status_get_string(ZX_ERR_TIMED_OUT) returns the string
 // "ZX_ERR_TIMED_OUT".
-const char* _zx_status_get_string(zx_status_t status);
-const char* zx_status_get_string(zx_status_t status);
+__EXPORT const char* _zx_status_get_string(zx_status_t status);
+__EXPORT const char* zx_status_get_string(zx_status_t status);
 
 #ifdef __cplusplus
 }
diff --git a/arch/arm64/sysroot/include/zircon/string_view.h b/arch/arm64/sysroot/include/zircon/string_view.h
new file mode 100644
index 0000000..f54ff2a
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/string_view.h
@@ -0,0 +1,67 @@
+// Copyright 2020 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.
+
+#pragma once
+
+#include <stddef.h>
+#if __cplusplus >= 201103L && __has_include(<type_traits>)
+#include <type_traits>
+#endif
+
+// This represents a UTF-8 string constant provided by the vDSO itself.
+// This pointer remains valid and the string doesn't change for the
+// life of the process (if not the system).
+//
+// This type exists to be the return value type for vDSO functions.
+// In current machine ABIs, it's returned "for free" in two registers.
+// To a C caller, these functions have ABIs indistinguishable from if
+// they simply returned `const char*` so there is no overhead to
+// supporting the explicit-length API as well as the traditional C
+// string API, though it does require writing out `.c_str` in the
+// source.  C++ 17 callers can take advantage of direct coercion to
+// the standard std::string_view and std::u8string_view types, which
+// also allows e.g. direct construction of std::string.
+typedef struct {
+  const char* c_str;  // UTF-8, guaranteed to be '\0'-terminated.
+  size_t length;      // Length, not including the '\0' terminator.
+
+#ifdef __cplusplus
+  // This is ABI-identical to the usual implementation of std::string_view,
+  // when applied to NUL-terminated C strings.  But this API doesn't presume
+  // that std::string_view has a particular implementation or exists at all.
+  // For convenience of use without directly using the C++ standard library
+  // API, a templatized implicit coercion is defined to types that have the
+  // API of std::string_view or std::u8string_view.  With the most common
+  // implementations, this coercion will be compiled away to nothing.
+  template <
+      typename _T
+#if __cplusplus >= 201103L && __has_include(<type_traits>)
+      ,
+      typename = typename std::enable_if<sizeof(typename _T::value_type) == sizeof(char)>::type
+#endif
+      >
+  operator _T() {
+    // It's preferable to exclude incompatible types via SFINAE so that
+    // the user's diagnostic experience is exactly as if no coercion
+    // operator existed.  SFINAE should exclude this definition when a
+    // C++11 <type_traits> is available to define std::enable_if.  If
+    // no standard C++ library header is available, this will provide
+    // a specific diagnostic.
+    static_assert(sizeof(typename _T::value_type) == sizeof(char),
+                  "zx_string_view_t can be coerced to C++ 17 std::string_view"
+                  " or std::u8string_view or types with equivalent API");
+    return {reinterpret_cast<typename _T::const_pointer>(c_str), length};
+  }
+
+  // Preferably zx_string_view_t values should just be coerced to
+  // std::string_view.  But it provides the most minimal aspects of
+  // the equivalent API in case a return value expression is used
+  // directly as `zx_foo_string().data()`, for example.
+  using value_type = char;
+  using const_pointer = const char*;
+  using size_type = size_t;
+  const_pointer data() const { return c_str; }
+  size_type size() const { return length; }
+#endif
+} zx_string_view_t;
diff --git a/arch/arm64/sysroot/include/zircon/syscalls.h b/arch/arm64/sysroot/include/zircon/syscalls.h
index b5c0057..9e79e55 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls.h
@@ -2,29 +2,40 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_H_
-#define ZIRCON_SYSCALLS_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_H_
+#define SYSROOT_ZIRCON_SYSCALLS_H_
 
-#include <zircon/types.h>
-#include <zircon/syscalls/types.h>
-
-#include <zircon/syscalls/pci.h>
+#include <zircon/string_view.h>
 #include <zircon/syscalls/object.h>
+#include <zircon/syscalls/pci.h>
 #include <zircon/syscalls/profile.h>
+#include <zircon/syscalls/types.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
-#if defined(__clang__)
-#define ZX_SYSCALL_PARAM_ATTR(x)   __attribute__((annotate("zx_" #x)))
+#define _ZX_SYSCALL_DECL(name, type, attrs, nargs, arglist, prototype) \
+  extern attrs type zx_##name prototype;                               \
+  extern attrs type _zx_##name prototype;
+
+#ifdef __clang__
+#define _ZX_SYSCALL_ANNO(attr) __attribute__((attr))
 #else
-#define ZX_SYSCALL_PARAM_ATTR(x)   // no-op
+#define _ZX_SYSCALL_ANNO(attr)  // Nothing for compilers without the support.
 #endif
 
-#include <zircon/syscalls/definitions.h>
+#include <zircon/syscalls/internal/cdecls.inc>
+
+#undef _ZX_SYSCALL_ANNO
+#undef _ZX_SYSCALL_DECL
 
 // Compatibility wrappers for deprecated syscalls also go here, when
 // there are any.
 
+// This DEPRECATED interface is replaced by zx_system_get_version_string.
+zx_status_t zx_system_get_version(char* version, size_t version_size) __LEAF_FN;
+zx_status_t _zx_system_get_version(char* version, size_t version_size) __LEAF_FN;
+
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_H_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/clock.h b/arch/arm64/sysroot/include/zircon/syscalls/clock.h
new file mode 100644
index 0000000..eab1cd1
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/syscalls/clock.h
@@ -0,0 +1,90 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
+#define SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
+
+#include <zircon/time.h>
+
+// clang-format off
+
+// Argument version identifiers.
+//
+// All zx_clock_* syscalls which fetch or receive a structure's worth of
+// arguments encode a version number in the options field of the syscall.  This
+// version field is in the same location and is the same size for each syscall,
+// so a common set of macros may be used for encoding and decoding.
+#define ZX_CLOCK_ARGS_VERSION_SHIFT              ((uint64_t)58u)
+#define ZX_CLOCK_ARGS_VERSION_BITS               ((uint64_t)6u)
+#define ZX_CLOCK_ARGS_VERSION_MASK \
+  (((((uint64_t)1) << ZX_CLOCK_ARGS_VERSION_BITS) - 1) << ZX_CLOCK_ARGS_VERSION_SHIFT)
+#define ZX_CLOCK_ARGS_VERSION(_N) \
+  (((uint64_t)(_N) << ZX_CLOCK_ARGS_VERSION_SHIFT) & ZX_CLOCK_ARGS_VERSION_MASK)
+
+// Clock creation options.
+#define ZX_CLOCK_OPT_MONOTONIC                   ((uint64_t)1u << 0)
+#define ZX_CLOCK_OPT_CONTINUOUS                  ((uint64_t)1u << 1)
+#define ZX_CLOCK_OPT_AUTO_START                  ((uint64_t)1u << 2)
+
+#define ZX_CLOCK_OPTS_ALL ( \
+        ZX_CLOCK_OPT_MONOTONIC | \
+        ZX_CLOCK_OPT_CONTINUOUS | \
+        ZX_CLOCK_OPT_AUTO_START)
+
+// Clock update flags
+#define ZX_CLOCK_UPDATE_OPTION_VALUE_VALID       ((uint64_t)1u << 0)
+#define ZX_CLOCK_UPDATE_OPTION_RATE_ADJUST_VALID ((uint64_t)1u << 1)
+#define ZX_CLOCK_UPDATE_OPTION_ERROR_BOUND_VALID ((uint64_t)1u << 2)
+
+#define ZX_CLOCK_UPDATE_OPTIONS_ALL ( \
+        ZX_CLOCK_UPDATE_OPTION_VALUE_VALID |  \
+        ZX_CLOCK_UPDATE_OPTION_RATE_ADJUST_VALID | \
+        ZX_CLOCK_UPDATE_OPTION_ERROR_BOUND_VALID)
+
+// Clock rate adjustment limits
+#define ZX_CLOCK_UPDATE_MIN_RATE_ADJUST          ((int32_t)-1000)
+#define ZX_CLOCK_UPDATE_MAX_RATE_ADJUST          ((int32_t)1000)
+
+// Special clock error values
+#define ZX_CLOCK_UNKNOWN_ERROR                   ((uint64_t)0xFFFFFFFFFFFFFFFF)
+
+// clang-format on
+
+typedef struct zx_clock_create_args_v1 {
+  zx_time_t backstop_time;
+} zx_clock_create_args_v1_t;
+
+typedef struct zx_clock_rate {
+  uint32_t synthetic_ticks;
+  uint32_t reference_ticks;
+} zx_clock_rate_t;
+
+typedef struct zx_clock_transformation {
+  int64_t reference_offset;
+  int64_t synthetic_offset;
+  zx_clock_rate_t rate;
+} zx_clock_transformation_t;
+
+typedef struct zx_clock_details_v1 {
+  uint64_t options;
+  zx_time_t backstop_time;
+  zx_clock_transformation_t ticks_to_synthetic;
+  zx_clock_transformation_t mono_to_synthetic;
+  uint64_t error_bound;
+  zx_ticks_t query_ticks;
+  zx_ticks_t last_value_update_ticks;
+  zx_ticks_t last_rate_adjust_update_ticks;
+  zx_ticks_t last_error_bounds_update_ticks;
+  uint32_t generation_counter;
+  uint8_t padding1[4];
+} zx_clock_details_v1_t;
+
+typedef struct zx_clock_update_args_v1 {
+  int32_t rate_adjust;
+  uint8_t padding1[4];
+  int64_t value;
+  uint64_t error_bound;
+} zx_clock_update_args_v1_t;
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/debug.h b/arch/arm64/sysroot/include/zircon/syscalls/debug.h
index 82ea309..373381f 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/debug.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/debug.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_DEBUG_
-#define ZIRCON_SYSCALLS_DEBUG_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_DEBUG_
+#define SYSROOT_ZIRCON_SYSCALLS_DEBUG_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
@@ -14,43 +14,47 @@
 
 // Value for ZX_THREAD_STATE_GENERAL_REGS on x86-64 platforms.
 typedef struct zx_thread_state_general_regs {
-    uint64_t rax;
-    uint64_t rbx;
-    uint64_t rcx;
-    uint64_t rdx;
-    uint64_t rsi;
-    uint64_t rdi;
-    uint64_t rbp;
-    uint64_t rsp;
-    uint64_t r8;
-    uint64_t r9;
-    uint64_t r10;
-    uint64_t r11;
-    uint64_t r12;
-    uint64_t r13;
-    uint64_t r14;
-    uint64_t r15;
-    uint64_t rip;
-    uint64_t rflags;
+  uint64_t rax;
+  uint64_t rbx;
+  uint64_t rcx;
+  uint64_t rdx;
+  uint64_t rsi;
+  uint64_t rdi;
+  uint64_t rbp;
+  uint64_t rsp;
+  uint64_t r8;
+  uint64_t r9;
+  uint64_t r10;
+  uint64_t r11;
+  uint64_t r12;
+  uint64_t r13;
+  uint64_t r14;
+  uint64_t r15;
+  uint64_t rip;
+  uint64_t rflags;
+  uint64_t fs_base;
+  uint64_t gs_base;
 } zx_thread_state_general_regs_t;
 
 // Value for ZX_THREAD_STATE_FP_REGS on x64. Holds x87 and MMX state.
 typedef struct zx_thread_state_fp_regs {
-    uint16_t fcw; // Control word.
-    uint16_t fsw; // Status word.
-    uint8_t ftw;  // Tag word.
-    uint8_t reserved;
-    uint16_t fop; // Opcode.
-    uint64_t fip; // Instruction pointer.
-    uint64_t fdp; // Data pointer.
+  uint16_t fcw;  // Control word.
+  uint16_t fsw;  // Status word.
+  uint8_t ftw;   // Tag word.
+  uint8_t reserved;
+  uint16_t fop;  // Opcode.
+  uint64_t fip;  // Instruction pointer.
+  uint64_t fdp;  // Data pointer.
 
-    // The x87/MMX state. For x87 the each "st" entry has the low 80 bits used for the register
-    // contents. For MMX, the low 64 bits are used. The higher bits are unused.
-    __ALIGNED(16)
-    struct {
-        uint64_t low;
-        uint64_t high;
-    } st[8];
+  uint8_t padding1[8];
+
+  // The x87/MMX state. For x87 the each "st" entry has the low 80 bits used for the register
+  // contents. For MMX, the low 64 bits are used. The higher bits are unused.
+  __ALIGNED(16)
+  struct {
+    uint64_t low;
+    uint64_t high;
+  } st[8];
 } zx_thread_state_fp_regs_t;
 
 // Value for ZX_THREAD_STATE_VECTOR_REGS on x64. Holds SSE and AVX registers.
@@ -58,58 +62,56 @@
 // Setting vector registers will only work for threads that have previously executed an
 // instruction using the corresponding register class.
 typedef struct zx_thread_state_vector_regs {
-    // When only 16 registers are supported (pre-AVX-512), zmm[16-31] will be 0.
-    // YMM registers (256 bits) are v[0-4], XMM registers (128 bits) are v[0-2].
-    struct {
-        uint64_t v[8];
-    } zmm[32];
+  // When only 16 registers are supported (pre-AVX-512), zmm[16-31] will be 0.
+  // YMM registers (256 bits) are v[0-4], XMM registers (128 bits) are v[0-2].
+  struct {
+    uint64_t v[8];
+  } zmm[32];
 
-    // AVX-512 opmask registers. Will be 0 unless AVX-512 is supported.
-    uint64_t opmask[8];
+  // AVX-512 opmask registers. Will be 0 unless AVX-512 is supported.
+  uint64_t opmask[8];
 
-    // SIMD control and status register.
-    uint32_t mxcsr;
+  // SIMD control and status register.
+  uint32_t mxcsr;
+
+  uint8_t padding1[4];
 } zx_thread_state_vector_regs_t;
 
 // Value for ZX_THREAD_STATE_DEBUG_REGS on x64 platforms.
 typedef struct zx_thread_state_debug_regs {
   uint64_t dr[4];
   // DR4 and D5 are not used.
-  uint64_t dr6;         // Status register.
-  uint64_t dr7;         // Control register.
-  // TODO(donosoc): These values are deprecated but are still used by zxdb. We debine both values
-  //                in order to do a soft transition. Delete these values once zxdb has made the
-  //                update.
-  uint64_t dr6_status;  // Status register.
-  uint64_t dr7_control; // Control register.
+  uint64_t dr6;  // Status register.
+  uint64_t dr7;  // Control register.
 } zx_thread_state_debug_regs_t;
 
 #elif defined(__aarch64__)
 
 // Value for ZX_THREAD_STATE_GENERAL_REGS on ARM64 platforms.
 typedef struct zx_thread_state_general_regs {
-    uint64_t r[30];
-    uint64_t lr;
-    uint64_t sp;
-    uint64_t pc;
-    uint64_t cpsr;
+  uint64_t r[30];
+  uint64_t lr;
+  uint64_t sp;
+  uint64_t pc;
+  uint64_t cpsr;
+  uint64_t tpidr;
 } zx_thread_state_general_regs_t;
 
 // Value for ZX_THREAD_STATE_FP_REGS on ARM64 platforms.
 // This is unused because vector state is used for all floating point on ARM64.
 typedef struct zx_thread_state_fp_regs {
-    // Avoids sizing differences for empty structs between C and C++.
-    uint32_t unused;
+  // Avoids sizing differences for empty structs between C and C++.
+  uint32_t unused;
 } zx_thread_state_fp_regs_t;
 
 // Value for ZX_THREAD_STATE_VECTOR_REGS on ARM64 platforms.
 typedef struct zx_thread_state_vector_regs {
-    uint32_t fpcr;
-    uint32_t fpsr;
-    struct {
-        uint64_t low;
-        uint64_t high;
-    } v[32];
+  uint32_t fpcr;
+  uint32_t fpsr;
+  struct {
+    uint64_t low;
+    uint64_t high;
+  } v[32];
 } zx_thread_state_vector_regs_t;
 
 // ARMv8-A provides 2 to 16 hardware breakpoint registers.
@@ -122,19 +124,34 @@
 // Value for XZ_THREAD_STATE_DEBUG_REGS for ARM64 platforms.
 typedef struct zx_thread_state_debug_regs {
   struct {
-    uint64_t dbgbvr;      //  HW Breakpoint Value register.
-    uint32_t dbgbcr;      //  HW Breakpoint Control register.
+    uint32_t dbgbcr;  //  HW Breakpoint Control register.
+    uint8_t padding1[4];
+    uint64_t dbgbvr;  //  HW Breakpoint Value register.
   } hw_bps[AARCH64_MAX_HW_BREAKPOINTS];
   // Number of HW Breakpoints in the platform.
   // Will be set on read and ignored on write.
-  uint8_t hw_bps_count;
+
   struct {
-    uint64_t dbgwvr;      // HW Watchpoint Value register.
-    uint32_t dbgwcr;      // HW Watchpoint Control register.
+    uint32_t dbgwcr;  // HW Watchpoint Control register.
+    uint8_t padding1[4];
+    uint64_t dbgwvr;  // HW Watchpoint Value register.
   } hw_wps[AARCH64_MAX_HW_WATCHPOINTS];
-  // Number of HW Watchpoints in the platform.
+
+  // Faulting Virtual Address for watchpoint exceptions.
+  // Read-only, values are ignored on write.
+  uint64_t far;
+
+  // The esr value since the last exception.
+  // Read-only, values are ignored on write.
+  uint32_t esr;
+
+  // Number of HW Breakpoints/Watchpoints in the platform.
   // Will be set on read and ignored on write.
+  uint8_t hw_bps_count;
   uint8_t hw_wps_count;
+
+  uint8_t padding1[2];
+
 } zx_thread_state_debug_regs_t;
 
 #endif
@@ -149,14 +166,14 @@
 
 // Possible values for "kind" in zx_thread_read_state and zx_thread_write_state.
 typedef uint32_t zx_thread_state_topic_t;
-#define ZX_THREAD_STATE_GENERAL_REGS  ((uint32_t)0) // zx_thread_state_general_regs_t value.
-#define ZX_THREAD_STATE_FP_REGS       ((uint32_t)1) // zx_thread_state_fp_regs_t value.
-#define ZX_THREAD_STATE_VECTOR_REGS   ((uint32_t)2) // zx_thread_state_vector_regs_t value.
-#define ZX_THREAD_STATE_DEBUG_REGS    ((uint32_t)4) // zx_thread_state_debug_regs_t value.
-#define ZX_THREAD_STATE_SINGLE_STEP   ((uint32_t)5) // zx_thread_state_single_step_t value.
-#define ZX_THREAD_X86_REGISTER_FS     ((uint32_t)6) // zx_thread_x86_register_fs_t value.
-#define ZX_THREAD_X86_REGISTER_GS     ((uint32_t)7) // zx_thread_x86_register_gs_t value.
+#define ZX_THREAD_STATE_GENERAL_REGS ((uint32_t)0)  // zx_thread_state_general_regs_t value.
+#define ZX_THREAD_STATE_FP_REGS ((uint32_t)1)       // zx_thread_state_fp_regs_t value.
+#define ZX_THREAD_STATE_VECTOR_REGS ((uint32_t)2)   // zx_thread_state_vector_regs_t value.
+#define ZX_THREAD_STATE_DEBUG_REGS ((uint32_t)4)    // zx_thread_state_debug_regs_t value.
+#define ZX_THREAD_STATE_SINGLE_STEP ((uint32_t)5)   // zx_thread_state_single_step_t value.
+#define ZX_THREAD_X86_REGISTER_FS ((uint32_t)6)     // zx_thread_x86_register_fs_t value.
+#define ZX_THREAD_X86_REGISTER_GS ((uint32_t)7)     // zx_thread_x86_register_gs_t value.
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_DEBUG_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_DEBUG_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/definitions.h b/arch/arm64/sysroot/include/zircon/syscalls/definitions.h
deleted file mode 100644
index 70da713..0000000
--- a/arch/arm64/sysroot/include/zircon/syscalls/definitions.h
+++ /dev/null
@@ -1,1839 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// This is a GENERATED file, see //zircon/system/host/abigen.
-// The license governing this file can be found in the LICENSE file.
-
-extern zx_time_t zx_clock_get(
-    zx_clock_t clock_id) __LEAF_FN;
-
-extern zx_time_t _zx_clock_get(
-    zx_clock_t clock_id) __LEAF_FN;
-
-extern zx_status_t zx_clock_get_new(
-    zx_clock_t clock_id,
-    zx_time_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_clock_get_new(
-    zx_clock_t clock_id,
-    zx_time_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_time_t zx_clock_get_monotonic(
-    void) __LEAF_FN;
-
-extern zx_time_t _zx_clock_get_monotonic(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_nanosleep(
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_nanosleep(
-    zx_time_t deadline) __LEAF_FN;
-
-extern uint64_t zx_ticks_get(
-    void) __LEAF_FN;
-
-extern uint64_t _zx_ticks_get(
-    void) __LEAF_FN;
-
-extern uint64_t zx_ticks_per_second(
-    void) __LEAF_FN __CONST;
-
-extern uint64_t _zx_ticks_per_second(
-    void) __LEAF_FN __CONST;
-
-extern zx_time_t zx_deadline_after(
-    zx_duration_t nanoseconds) __LEAF_FN;
-
-extern zx_time_t _zx_deadline_after(
-    zx_duration_t nanoseconds) __LEAF_FN;
-
-extern zx_status_t zx_clock_adjust(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_clock_t clock_id,
-    int64_t offset) __LEAF_FN;
-
-extern zx_status_t _zx_clock_adjust(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_clock_t clock_id,
-    int64_t offset) __LEAF_FN;
-
-extern uint32_t zx_system_get_dcache_line_size(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t _zx_system_get_dcache_line_size(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t zx_system_get_num_cpus(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t _zx_system_get_num_cpus(
-    void) __LEAF_FN __CONST;
-
-extern zx_status_t zx_system_get_version(
-    char* version,
-    size_t version_size) __LEAF_FN;
-
-extern zx_status_t _zx_system_get_version(
-    char* version,
-    size_t version_size) __LEAF_FN;
-
-extern uint64_t zx_system_get_physmem(
-    void) __LEAF_FN;
-
-extern uint64_t _zx_system_get_physmem(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_system_get_features(
-    uint32_t kind,
-    ZX_SYSCALL_PARAM_ATTR(features) uint32_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_system_get_features(
-    uint32_t kind,
-    ZX_SYSCALL_PARAM_ATTR(features) uint32_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_cache_flush(
-    const void* addr,
-    size_t size,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_cache_flush(
-    const void* addr,
-    size_t size,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_handle_close(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_handle_close(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_handle_close_many(
-    const zx_handle_t* handles,
-    size_t num_handles) __LEAF_FN;
-
-extern zx_status_t _zx_handle_close_many(
-    const zx_handle_t* handles,
-    size_t num_handles) __LEAF_FN;
-
-extern zx_status_t zx_handle_duplicate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_handle_duplicate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_handle_replace(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_handle_replace(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_one(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_signals_t signals,
-    zx_time_t deadline,
-    zx_signals_t* observed) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_one(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_signals_t signals,
-    zx_time_t deadline,
-    zx_signals_t* observed) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_many(
-    zx_wait_item_t* items,
-    size_t count,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_many(
-    zx_wait_item_t* items,
-    size_t count,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_async(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    zx_signals_t signals,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_async(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    zx_signals_t signals,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_object_signal(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t _zx_object_signal(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t zx_object_signal_peer(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t _zx_object_signal_peer(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t zx_object_get_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t zx_object_set_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    const void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    const void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t zx_object_set_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t cookie) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t cookie) __LEAF_FN;
-
-extern zx_status_t zx_object_get_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t* cookie) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t* cookie) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_object_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t topic,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual_count,
-    size_t* avail_count) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t topic,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual_count,
-    size_t* avail_count) __LEAF_FN;
-
-extern zx_status_t zx_object_get_child(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t koid,
-    zx_rights_t rights,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_child(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t koid,
-    zx_rights_t rights,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_object_set_profile(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t profile,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_profile(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t profile,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_channel_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_channel_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_channel_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_read_etc(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_info_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_read_etc(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_info_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* bytes,
-    uint32_t num_bytes,
-    const zx_handle_t* handles,
-    uint32_t num_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* bytes,
-    uint32_t num_bytes,
-    const zx_handle_t* handles,
-    uint32_t num_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t deadline,
-    const zx_channel_call_args_t* args,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_channel_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t deadline,
-    const zx_channel_call_args_t* args,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_socket_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_socket_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_socket_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t _zx_socket_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t zx_socket_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t _zx_socket_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t zx_socket_share(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t socket_to_share) __LEAF_FN;
-
-extern zx_status_t _zx_socket_share(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t socket_to_share) __LEAF_FN;
-
-extern zx_status_t zx_socket_accept(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_socket) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_socket_accept(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_socket) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_socket_shutdown(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_socket_shutdown(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options) __LEAF_FN;
-
-extern void zx_thread_exit(
-    void) __LEAF_FN __NO_RETURN;
-
-extern void _zx_thread_exit(
-    void) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_thread_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t process,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_thread_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t process,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_thread_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t thread_entry,
-    zx_vaddr_t stack,
-    uintptr_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t _zx_thread_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t thread_entry,
-    zx_vaddr_t stack,
-    uintptr_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t zx_thread_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_thread_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_thread_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_thread_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_thread_set_priority(
-    int32_t prio) __LEAF_FN;
-
-extern zx_status_t _zx_thread_set_priority(
-    int32_t prio) __LEAF_FN;
-
-extern void zx_process_exit(
-    int64_t retcode) __LEAF_FN __NO_RETURN;
-
-extern void _zx_process_exit(
-    int64_t retcode) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_process_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* proc_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_process_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* proc_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_process_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t thread,
-    zx_vaddr_t entry,
-    zx_vaddr_t stack,
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t _zx_process_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t thread,
-    zx_vaddr_t entry,
-    zx_vaddr_t stack,
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t zx_process_read_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_process_read_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_process_write_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_process_write_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_job_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_job,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_job_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_job,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_job_set_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    uint32_t options,
-    uint32_t topic,
-    const void* policy,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t _zx_job_set_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    uint32_t options,
-    uint32_t topic,
-    const void* policy,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t zx_task_bind_exception_port(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_task_bind_exception_port(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_task_suspend(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_task_suspend(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_task_suspend_token(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_task_suspend_token(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_task_resume_from_exception(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_task_resume_from_exception(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_task_kill(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_task_kill(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_event_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_event_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_eventpair_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_eventpair_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_futex_wait(
-    const zx_futex_t* value_ptr,
-    zx_futex_t current_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_futex_owner,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wait(
-    const zx_futex_t* value_ptr,
-    zx_futex_t current_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_futex_owner,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_futex_wake(
-    const zx_futex_t* value_ptr,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wake(
-    const zx_futex_t* value_ptr,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t zx_futex_wake_single_owner(
-    const zx_futex_t* value_ptr) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wake_single_owner(
-    const zx_futex_t* value_ptr) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue_single_owner(
-    const zx_futex_t* wake_ptr,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue_single_owner(
-    const zx_futex_t* wake_ptr,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t zx_futex_get_owner(
-    const zx_futex_t* value_ptr,
-    zx_koid_t* koid) __LEAF_FN;
-
-extern zx_status_t _zx_futex_get_owner(
-    const zx_futex_t* value_ptr,
-    zx_koid_t* koid) __LEAF_FN;
-
-extern zx_status_t zx_futex_wait_deprecated(
-    const zx_futex_t* value_ptr,
-    int32_t current_value,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wait_deprecated(
-    const zx_futex_t* value_ptr,
-    int32_t current_value,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue_deprecated(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    int32_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue_deprecated(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    int32_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count) __LEAF_FN;
-
-extern zx_status_t zx_port_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_port_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_port_queue(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t _zx_port_queue(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t zx_port_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t _zx_port_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t zx_port_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t source,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t _zx_port_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t source,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t zx_timer_create(
-    uint32_t options,
-    zx_clock_t clock_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_timer_create(
-    uint32_t options,
-    zx_clock_t clock_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_timer_set(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_duration_t slack) __LEAF_FN;
-
-extern zx_status_t _zx_timer_set(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_duration_t slack) __LEAF_FN;
-
-extern zx_status_t zx_timer_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_timer_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create(
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create(
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_get_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t* size) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_get_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t* size) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_set_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_set_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_op_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t op,
-    uint64_t offset,
-    uint64_t size,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_op_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t op,
-    uint64_t offset,
-    uint64_t size,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_clone(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_clone(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_set_cache_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t cache_policy) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_set_cache_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t cache_policy) __LEAF_FN;
-
-extern zx_status_t zx_vmo_replace_as_executable(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmex,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_replace_as_executable(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmex,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_allocate_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    uint64_t offset,
-    uint64_t size,
-    uint32_t map_flags,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_allocate_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    uint64_t offset,
-    uint64_t size,
-    uint32_t map_flags,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_map_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    uint32_t map_flags,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_map_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    uint32_t map_flags,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_protect_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len,
-    uint32_t prot_flags) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_protect_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len,
-    uint32_t prot_flags) __LEAF_FN;
-
-extern zx_status_t zx_vmar_allocate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    zx_vm_option_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_allocate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    zx_vm_option_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_vmar_map(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_map(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_unmap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_unmap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t zx_vmar_protect(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_protect(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern void zx_cprng_draw(
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern void _zx_cprng_draw(
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_cprng_add_entropy(
-    const void* buffer,
-    size_t len) __LEAF_FN;
-
-extern zx_status_t _zx_cprng_add_entropy(
-    const void* buffer,
-    size_t len) __LEAF_FN;
-
-extern zx_status_t zx_fifo_create(
-    size_t elem_count,
-    size_t elem_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((4, 5)) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_create(
-    size_t elem_count,
-    size_t elem_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((4, 5)) __LEAF_FN;
-
-extern zx_status_t zx_fifo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t zx_fifo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    const void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    const void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t zx_profile_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const zx_profile_info_t* profile,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_profile_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const zx_profile_info_t* profile,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_unmap_handle_close_thread_exit(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmar_handle,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_unmap_handle_close_thread_exit(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmar_handle,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN;
-
-extern void zx_futex_wake_handle_close_thread_exit(
-    const zx_futex_t* value_ptr,
-    uint32_t count,
-    int32_t new_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN __NO_RETURN;
-
-extern void _zx_futex_wake_handle_close_thread_exit(
-    const zx_futex_t* value_ptr,
-    uint32_t count,
-    int32_t new_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_log_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    const void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_log_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    const void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_log_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_log_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* data,
-    uint32_t offset,
-    size_t data_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* data,
-    uint32_t offset,
-    size_t data_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t action,
-    uint32_t options,
-    void* ptr) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t action,
-    uint32_t options,
-    void* ptr) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t id,
-    uint32_t arg0,
-    uint32_t arg1) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t id,
-    uint32_t arg0,
-    uint32_t arg1) __LEAF_FN;
-
-extern zx_status_t zx_mtrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    uint32_t action,
-    uint32_t options,
-    void* ptr,
-    size_t ptr_size) __LEAF_FN;
-
-extern zx_status_t _zx_mtrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    uint32_t action,
-    uint32_t options,
-    void* ptr,
-    size_t ptr_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    char* buffer,
-    size_t* buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    char* buffer,
-    size_t* buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_write(
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_write(
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_send_command(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_send_command(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t src_obj,
-    uint32_t src_num,
-    uint32_t options,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t src_obj,
-    uint32_t src_num,
-    uint32_t options,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_bind(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_bind(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t* out_timestamp) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t* out_timestamp) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_ack(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_ack(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_trigger(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t timestamp) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_trigger(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t timestamp) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_bind_vcpu(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vcpu,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_bind_vcpu(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vcpu,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_ioports_request(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint16_t io_addr,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t _zx_ioports_request(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint16_t io_addr,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create_contiguous(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bti,
-    size_t size,
-    uint32_t alignment_log2,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create_contiguous(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bti,
-    size_t size,
-    uint32_t alignment_log2,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create_physical(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    zx_paddr_t paddr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create_physical(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    zx_paddr_t paddr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_iommu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t type,
-    const void* desc,
-    size_t desc_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_iommu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t type,
-    const void* desc,
-    size_t desc_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_bti_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t iommu,
-    uint32_t options,
-    uint64_t bti_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_bti_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t iommu,
-    uint32_t options,
-    uint64_t bti_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_bti_pin(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t offset,
-    uint64_t size,
-    zx_paddr_t* addrs,
-    size_t addrs_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((8)) __LEAF_FN;
-
-extern zx_status_t _zx_bti_pin(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t offset,
-    uint64_t size,
-    zx_paddr_t* addrs,
-    size_t addrs_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((8)) __LEAF_FN;
-
-extern zx_status_t zx_bti_release_quarantine(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_bti_release_quarantine(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_pmt_unpin(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_pmt_unpin(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_framebuffer_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t* format,
-    uint32_t* width,
-    uint32_t* height,
-    uint32_t* stride) __NONNULL((2, 3, 4, 5)) __LEAF_FN;
-
-extern zx_status_t _zx_framebuffer_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t* format,
-    uint32_t* width,
-    uint32_t* height,
-    uint32_t* stride) __NONNULL((2, 3, 4, 5)) __LEAF_FN;
-
-extern zx_status_t zx_framebuffer_set_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint32_t len,
-    uint32_t format,
-    uint32_t width,
-    uint32_t height,
-    uint32_t stride) __LEAF_FN;
-
-extern zx_status_t _zx_framebuffer_set_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint32_t len,
-    uint32_t format,
-    uint32_t width,
-    uint32_t height,
-    uint32_t stride) __LEAF_FN;
-
-extern zx_status_t zx_pci_get_nth_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t index,
-    zx_pcie_device_info_t* out_info,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_get_nth_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t index,
-    zx_pcie_device_info_t* out_info,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t zx_pci_enable_bus_master(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool enable) __LEAF_FN;
-
-extern zx_status_t _zx_pci_enable_bus_master(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool enable) __LEAF_FN;
-
-extern zx_status_t zx_pci_reset_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_pci_reset_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_pci_config_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t* out_val) __LEAF_FN;
-
-extern zx_status_t _zx_pci_config_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t* out_val) __LEAF_FN;
-
-extern zx_status_t zx_pci_config_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t val) __LEAF_FN;
-
-extern zx_status_t _zx_pci_config_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t val) __LEAF_FN;
-
-extern zx_status_t zx_pci_cfg_pio_rw(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint8_t bus,
-    uint8_t dev,
-    uint8_t func,
-    uint8_t offset,
-    uint32_t* val,
-    size_t width,
-    bool write) __LEAF_FN;
-
-extern zx_status_t _zx_pci_cfg_pio_rw(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint8_t bus,
-    uint8_t dev,
-    uint8_t func,
-    uint8_t offset,
-    uint32_t* val,
-    size_t width,
-    bool write) __LEAF_FN;
-
-extern zx_status_t zx_pci_get_bar(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t bar_num,
-    zx_pci_bar_t* out_bar,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_get_bar(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t bar_num,
-    zx_pci_bar_t* out_bar,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_pci_map_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    int32_t which_irq,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_map_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    int32_t which_irq,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_pci_query_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t* out_max_irqs) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_query_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t* out_max_irqs) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_pci_set_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t requested_irq_count) __LEAF_FN;
-
-extern zx_status_t _zx_pci_set_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t requested_irq_count) __LEAF_FN;
-
-extern zx_status_t zx_pci_init(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_pci_init_arg_t* init_buf,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t _zx_pci_init(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_pci_init_arg_t* init_buf,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t zx_pci_add_subtract_io_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool mmio,
-    uint64_t base,
-    uint64_t len,
-    bool add) __LEAF_FN;
-
-extern zx_status_t _zx_pci_add_subtract_io_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool mmio,
-    uint64_t base,
-    uint64_t len,
-    bool add) __LEAF_FN;
-
-extern zx_status_t zx_pc_firmware_tables(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_paddr_t* acpi_rsdp,
-    zx_paddr_t* smbios) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_pc_firmware_tables(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_paddr_t* acpi_rsdp,
-    zx_paddr_t* smbios) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_smc_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_smc_parameters_t* parameters,
-    zx_smc_result_t* out_smc_result) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_smc_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_smc_parameters_t* parameters,
-    zx_smc_result_t* out_smc_result) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_resource_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_rsrc,
-    uint32_t options,
-    uint64_t base,
-    size_t size,
-    const char* name,
-    size_t name_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* resource_out) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_resource_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_rsrc,
-    uint32_t options,
-    uint64_t base,
-    size_t size,
-    const char* name,
-    size_t name_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* resource_out) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_guest_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* guest_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t _zx_guest_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* guest_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t zx_guest_set_trap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t _zx_guest_set_trap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t guest,
-    uint32_t options,
-    zx_vaddr_t entry,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t guest,
-    uint32_t options,
-    zx_vaddr_t entry,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_resume(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_port_packet_t* packet) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_resume(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_port_packet_t* packet) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t vector) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t vector) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_system_mexec(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t kernel,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bootimage) __LEAF_FN;
-
-extern zx_status_t _zx_system_mexec(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t kernel,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bootimage) __LEAF_FN;
-
-extern zx_status_t zx_system_mexec_payload_get(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_system_mexec_payload_get(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_system_powerctl(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t cmd,
-    const zx_system_powerctl_arg_t* arg) __LEAF_FN;
-
-extern zx_status_t _zx_system_powerctl(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t cmd,
-    const zx_system_powerctl_arg_t* arg) __LEAF_FN;
-
-extern zx_status_t zx_pager_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(pager) zx_handle_t* out_pager) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_pager_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(pager) zx_handle_t* out_pager) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_pager_create_vmo(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t pager,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(out_pager_vmo) zx_handle_t* out_pager_vmo) __NONNULL((6)) __LEAF_FN;
-
-extern zx_status_t _zx_pager_create_vmo(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t pager,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(out_pager_vmo) zx_handle_t* out_pager_vmo) __NONNULL((6)) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_0(
-    void) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_0(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_1(
-    int a) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_1(
-    int a) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_2(
-    int a,
-    int b) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_2(
-    int a,
-    int b) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_3(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_3(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_4(
-    int a,
-    int b,
-    int c,
-    int d) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_4(
-    int a,
-    int b,
-    int c,
-    int d) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_5(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_5(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_6(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_6(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_7(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_7(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_8(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g,
-    int h) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_8(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g,
-    int h) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_wrapper(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_wrapper(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/exception.h b/arch/arm64/sysroot/include/zircon/syscalls/exception.h
index 4ddf2fb..6191e0f 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/exception.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/exception.h
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_EXCEPTION_H_
-#define ZIRCON_SYSCALLS_EXCEPTION_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
+#define SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
 
 #include <zircon/compiler.h>
-#include <zircon/syscalls/port.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
@@ -14,63 +13,60 @@
 // ask clang format not to mess up the indentation:
 // clang-format off
 
-// This bit is set for synthetic exceptions to distinguish them from
-// architectural exceptions.
-// Note: Port packet types provide 8 bits to distinguish the exception type.
-// See zircon/port.h.
-#define ZX_EXCP_SYNTH ((uint8_t)0x80)
+// The following exception values were chosen for historical reasons.
 
-// The kind of an exception.
-// Exception types are a subset of port packet types. See zircon/port.h.
-
-// These are architectural exceptions.
+// Architectural exceptions.
+//
 // Depending on the exception, further information can be found in
 // |report.context.arch|.
 
-// General exception not covered by another value.
-#define ZX_EXCP_GENERAL ZX_PKT_TYPE_EXCEPTION(0)
-#define ZX_EXCP_FATAL_PAGE_FAULT ZX_PKT_TYPE_EXCEPTION(1)
-#define ZX_EXCP_UNDEFINED_INSTRUCTION ZX_PKT_TYPE_EXCEPTION(2)
-#define ZX_EXCP_SW_BREAKPOINT ZX_PKT_TYPE_EXCEPTION(3)
-#define ZX_EXCP_HW_BREAKPOINT ZX_PKT_TYPE_EXCEPTION(4)
-#define ZX_EXCP_UNALIGNED_ACCESS ZX_PKT_TYPE_EXCEPTION(5)
+#define ZX_EXCP_GENERAL                 ((uint32_t) 0x008u)
+#define ZX_EXCP_FATAL_PAGE_FAULT        ((uint32_t) 0x108u)
+#define ZX_EXCP_UNDEFINED_INSTRUCTION   ((uint32_t) 0x208u)
+#define ZX_EXCP_SW_BREAKPOINT           ((uint32_t) 0x308u)
+#define ZX_EXCP_HW_BREAKPOINT           ((uint32_t) 0x408u)
+#define ZX_EXCP_UNALIGNED_ACCESS        ((uint32_t) 0x508u)
 
 // Synthetic exceptions.
 
+// These bits are set for synthetic exceptions to distinguish them from
+// architectural exceptions.
+#define ZX_EXCP_SYNTH                   ((uint32_t) 0x8000u)
+
 // A thread is starting.
-// This exception is sent to debuggers only (ZX_EXCEPTION_PORT_TYPE_DEBUGGER).
-// The thread is paused until it is resumed by the debugger
-// with zx_task_resume_from_exception.
-#define ZX_EXCP_THREAD_STARTING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 0)
+// This exception is sent to debuggers only (ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER).
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_THREAD_STARTING         ((uint32_t) 0x008u | ZX_EXCP_SYNTH)
 
 // A thread is exiting.
-// This exception is sent to debuggers only (ZX_EXCEPTION_PORT_TYPE_DEBUGGER).
+// This exception is sent to debuggers only (ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER).
 // This exception is different from ZX_EXCP_GONE in that a debugger can
 // still examine thread state.
-// The thread is paused until it is resumed by the debugger
-// with zx_task_resume_from_exception.
-#define ZX_EXCP_THREAD_EXITING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 1)
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_THREAD_EXITING          ((uint32_t) 0x108u | ZX_EXCP_SYNTH)
 
 // This exception is generated when a syscall fails with a job policy
 // error (for example, an invalid handle argument is passed to the
 // syscall when the ZX_POL_BAD_HANDLE policy is enabled) and
-// ZX_POL_ACTION_EXCEPTION is set for the policy.  The thread that
-// invoked the syscall may be resumed with zx_task_resume_from_exception.
-#define ZX_EXCP_POLICY_ERROR ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 2)
+// ZX_POL_ACTION_EXCEPTION is set for the policy.
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_POLICY_ERROR            ((uint32_t) 0x208u | ZX_EXCP_SYNTH)
 
 // A process is starting.
 // This exception is sent to job debuggers only
-// (ZX_EXCEPTION_PORT_TYPE_JOB_DEBUGGER).
-// The initial thread is paused until it is resumed by the debugger with
-// zx_task_resume_from_exception.
-#define ZX_EXCP_PROCESS_STARTING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 3)
+// (ZX_EXCEPTION_CHANNEL_TYPE_JOB_DEBUGGER).
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_PROCESS_STARTING        ((uint32_t) 0x308u | ZX_EXCP_SYNTH)
 
 typedef uint32_t zx_excp_type_t;
 
-// Assuming |excp| is an exception type, return non-zero if it is an
-// architectural exception.
-#define ZX_EXCP_IS_ARCH(excp) \
-  (((excp) & (ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH) & ~ZX_PKT_TYPE_MASK)) == 0)
+// Assuming |excp| is an exception type, the following returns true if the
+// type is architectural.
+#define ZX_EXCP_IS_ARCH(excp)  (((excp) & ZX_EXCP_SYNTH) == 0)
 
 typedef struct zx_x86_64_exc_data {
     uint64_t vector;
@@ -80,6 +76,7 @@
 
 typedef struct zx_arm64_exc_data {
     uint32_t esr;
+    uint8_t padding1[4];
     uint64_t far;
 } zx_arm64_exc_data_t;
 
@@ -90,7 +87,10 @@
     struct {
         union {
             zx_x86_64_exc_data_t x86_64;
-            zx_arm64_exc_data_t  arm_64;
+            struct {
+                zx_arm64_exc_data_t  arm_64;
+                uint8_t padding1[8];
+            };
         } u;
     } arch;
 } zx_exception_context_t;
@@ -110,26 +110,27 @@
     zx_exception_context_t context;
 } zx_exception_report_t;
 
-// Options for zx_task_resume_from_exception()
-#define ZX_RESUME_TRY_NEXT ((uint32_t)2)
-// Indicates that instead of resuming from the faulting instruction we instead
-// let the next exception handler in the search order, if any, process the
-// exception. If there are no more then the entire process is killed.
+// Basic info sent along with the handle over an exception channel.
+typedef struct zx_exception_info {
+    zx_koid_t pid;
+    zx_koid_t tid;
+    zx_excp_type_t type;
+    uint8_t padding1[4];
+} zx_exception_info_t;
 
-// Options for zx_task_bind_exception_port.
-#define ZX_EXCEPTION_PORT_DEBUGGER ((uint32_t)1)
-// When binding an exception port to a process, set the process's debugger
-// exception port.
+// Options for zx_create_exception_channel.
+// When creating an exception channel, use the task's debug channel.
+#define ZX_EXCEPTION_CHANNEL_DEBUGGER ((uint32_t)1)
 
-// The type of exception port a thread may be waiting for a response from.
-// These values are reported in zx_info_thread_t.wait_exception_port_type.
-#define ZX_EXCEPTION_PORT_TYPE_NONE         ((uint32_t)0u)
-#define ZX_EXCEPTION_PORT_TYPE_DEBUGGER     ((uint32_t)1u)
-#define ZX_EXCEPTION_PORT_TYPE_THREAD       ((uint32_t)2u)
-#define ZX_EXCEPTION_PORT_TYPE_PROCESS      ((uint32_t)3u)
-#define ZX_EXCEPTION_PORT_TYPE_JOB          ((uint32_t)4u)
-#define ZX_EXCEPTION_PORT_TYPE_JOB_DEBUGGER ((uint32_t)5u)
+// The type of exception handler a thread may be waiting for a response from.
+// These values are reported in zx_info_thread_t.wait_exception_channel_type.
+#define ZX_EXCEPTION_CHANNEL_TYPE_NONE         ((uint32_t)0u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER     ((uint32_t)1u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_THREAD       ((uint32_t)2u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_PROCESS      ((uint32_t)3u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_JOB          ((uint32_t)4u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_JOB_DEBUGGER ((uint32_t)5u)
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_EXCEPTION_H_
+#endif // SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h b/arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h
index a62de92..f574d4e 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
+#define SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
 
 #include <assert.h>
 
@@ -27,41 +28,51 @@
 // Structure to read and write VCPU state.
 typedef struct zx_vcpu_state {
 #if __aarch64__
-    uint64_t x[31];
-    uint64_t sp;
-    // Contains only the user-controllable upper 4-bits (NZCV).
-    uint32_t cpsr;
+  uint64_t x[31];
+  uint64_t sp;
+  // Contains only the user-controllable upper 4-bits (NZCV).
+  uint32_t cpsr;
+  uint8_t padding1[4];
 #elif __x86_64__
-    uint64_t rax;
-    uint64_t rcx;
-    uint64_t rdx;
-    uint64_t rbx;
-    uint64_t rsp;
-    uint64_t rbp;
-    uint64_t rsi;
-    uint64_t rdi;
-    uint64_t r8;
-    uint64_t r9;
-    uint64_t r10;
-    uint64_t r11;
-    uint64_t r12;
-    uint64_t r13;
-    uint64_t r14;
-    uint64_t r15;
-    // Contains only the user-controllable lower 32-bits.
-    uint64_t rflags;
+  uint64_t rax;
+  uint64_t rcx;
+  uint64_t rdx;
+  uint64_t rbx;
+  uint64_t rsp;
+  uint64_t rbp;
+  uint64_t rsi;
+  uint64_t rdi;
+  uint64_t r8;
+  uint64_t r9;
+  uint64_t r10;
+  uint64_t r11;
+  uint64_t r12;
+  uint64_t r13;
+  uint64_t r14;
+  uint64_t r15;
+  // Contains only the user-controllable lower 32-bits.
+  uint64_t rflags;
 #endif
 } zx_vcpu_state_t;
 
 // Structure to read and write VCPU state for IO ports.
 typedef struct zx_vcpu_io {
-    uint8_t access_size;
-    union {
-        uint8_t u8;
-        uint16_t u16;
-        uint32_t u32;
-        uint8_t data[4];
+  uint8_t access_size;
+  uint8_t padding1[3];
+  union {
+    struct {
+      uint8_t u8;
+      uint8_t padding2[3];
     };
+    struct {
+      uint16_t u16;
+      uint8_t padding3[2];
+    };
+    uint32_t u32;
+    uint8_t data[4];
+  };
 } zx_vcpu_io_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/internal/cdecls.inc b/arch/arm64/sysroot/include/zircon/syscalls/internal/cdecls.inc
new file mode 100644
index 0000000..63510b9
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/syscalls/internal/cdecls.inc
@@ -0,0 +1,1090 @@
+// Copyright 2019 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.
+
+// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.
+
+#ifndef _ZX_SYSCALL_DECL
+#error "<zircon/syscalls.h> is the public API header"
+#endif
+
+_ZX_SYSCALL_DECL(bti_create, zx_status_t, /* no attributes */, 4,
+    (iommu, options, bti_id, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t iommu,
+    uint32_t options,
+    uint64_t bti_id,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(bti_pin, zx_status_t, /* no attributes */, 8,
+    (handle, options, vmo, offset, size, addrs, num_addrs, pmt), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint64_t offset,
+    uint64_t size,
+    zx_paddr_t* addrs,
+    size_t num_addrs,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* pmt))
+
+_ZX_SYSCALL_DECL(bti_release_quarantine, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(cache_flush, zx_status_t, /* no attributes */, 3,
+    (addr, size, options), (
+    const void* addr,
+    size_t size,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(channel_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(channel_read, zx_status_t, /* no attributes */, 8,
+    (handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("FuchsiaUnchecked")) zx_handle_t handle,
+    uint32_t options,
+    void* bytes,
+    _ZX_SYSCALL_ANNO(acquire_handle("FuchsiaUnchecked")) zx_handle_t* handles,
+    uint32_t num_bytes,
+    uint32_t num_handles,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_read_etc, zx_status_t, /* no attributes */, 8,
+    (handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* bytes,
+    zx_handle_info_t* handles,
+    uint32_t num_bytes,
+    uint32_t num_handles,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_write, zx_status_t, /* no attributes */, 6,
+    (handle, options, bytes, num_bytes, handles, num_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* bytes,
+    uint32_t num_bytes,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) const zx_handle_t* handles,
+    uint32_t num_handles))
+
+_ZX_SYSCALL_DECL(channel_write_etc, zx_status_t, /* no attributes */, 6,
+    (handle, options, bytes, num_bytes, handles, num_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* bytes,
+    uint32_t num_bytes,
+    zx_handle_disposition_t* handles,
+    uint32_t num_handles))
+
+_ZX_SYSCALL_DECL(channel_call, zx_status_t, /* no attributes */, 6,
+    (handle, options, deadline, args, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t deadline,
+    const zx_channel_call_args_t* args,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_call_etc, zx_status_t, /* no attributes */, 6,
+    (handle, options, deadline, args, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t deadline,
+    zx_channel_call_etc_args_t* args,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(clock_get, zx_status_t, /* no attributes */, 2,
+    (clock_id, out), (
+    zx_clock_t clock_id,
+    zx_time_t* out))
+
+_ZX_SYSCALL_DECL(clock_get_monotonic, zx_time_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(clock_adjust, zx_status_t, /* no attributes */, 3,
+    (handle, clock_id, offset), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_clock_t clock_id,
+    int64_t offset))
+
+_ZX_SYSCALL_DECL(clock_create, zx_status_t, /* no attributes */, 3,
+    (options, args, out), (
+    uint64_t options,
+    const void* args,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(clock_read, zx_status_t, /* no attributes */, 2,
+    (handle, now), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t* now))
+
+_ZX_SYSCALL_DECL(clock_get_details, zx_status_t, /* no attributes */, 3,
+    (handle, options, details), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t options,
+    void* details))
+
+_ZX_SYSCALL_DECL(clock_update, zx_status_t, /* no attributes */, 3,
+    (handle, options, args), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t options,
+    const void* args))
+
+_ZX_SYSCALL_DECL(cprng_draw, void, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(cprng_add_entropy, zx_status_t, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debug_read, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    char* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(debug_write, zx_status_t, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    const char* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debug_send_command, zx_status_t, /* no attributes */, 3,
+    (resource, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    const char* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debuglog_create, zx_status_t, /* no attributes */, 3,
+    (resource, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(debuglog_write, zx_status_t, /* no attributes */, 4,
+    (handle, options, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debuglog_read, zx_status_t, /* no attributes */, 4,
+    (handle, options, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(event_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(eventpair_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(exception_get_thread, zx_status_t, /* no attributes */, 2,
+    (handle, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(exception_get_process, zx_status_t, /* no attributes */, 2,
+    (handle, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(fifo_create, zx_status_t, /* no attributes */, 5,
+    (elem_count, elem_size, options, out0, out1), (
+    size_t elem_count,
+    size_t elem_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(fifo_read, zx_status_t, /* no attributes */, 5,
+    (handle, elem_size, data, data_size, actual_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    size_t elem_size,
+    void* data,
+    size_t data_size,
+    size_t* actual_count))
+
+_ZX_SYSCALL_DECL(fifo_write, zx_status_t, /* no attributes */, 5,
+    (handle, elem_size, data, count, actual_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    size_t elem_size,
+    const void* data,
+    size_t count,
+    size_t* actual_count))
+
+_ZX_SYSCALL_DECL(framebuffer_get_info, zx_status_t, /* no attributes */, 5,
+    (resource, format, width, height, stride), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t* format,
+    uint32_t* width,
+    uint32_t* height,
+    uint32_t* stride))
+
+_ZX_SYSCALL_DECL(framebuffer_set_range, zx_status_t, /* no attributes */, 7,
+    (resource, vmo, len, format, width, height, stride), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint32_t len,
+    uint32_t format,
+    uint32_t width,
+    uint32_t height,
+    uint32_t stride))
+
+_ZX_SYSCALL_DECL(futex_wait, zx_status_t, /* no attributes */, 4,
+    (value_ptr, current_value, new_futex_owner, deadline), (
+    const zx_futex_t* value_ptr,
+    zx_futex_t current_value,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_futex_owner,
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(futex_wake, zx_status_t, /* no attributes */, 2,
+    (value_ptr, wake_count), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count))
+
+_ZX_SYSCALL_DECL(futex_requeue, zx_status_t, /* no attributes */, 6,
+    (value_ptr, wake_count, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count,
+    zx_futex_t current_value,
+    const zx_futex_t* requeue_ptr,
+    uint32_t requeue_count,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))
+
+_ZX_SYSCALL_DECL(futex_wake_single_owner, zx_status_t, /* no attributes */, 1,
+    (value_ptr), (
+    const zx_futex_t* value_ptr))
+
+_ZX_SYSCALL_DECL(futex_requeue_single_owner, zx_status_t, /* no attributes */, 5,
+    (value_ptr, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
+    const zx_futex_t* value_ptr,
+    zx_futex_t current_value,
+    const zx_futex_t* requeue_ptr,
+    uint32_t requeue_count,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))
+
+_ZX_SYSCALL_DECL(futex_get_owner, zx_status_t, /* no attributes */, 2,
+    (value_ptr, koid), (
+    const zx_futex_t* value_ptr,
+    zx_koid_t* koid))
+
+_ZX_SYSCALL_DECL(guest_create, zx_status_t, /* no attributes */, 4,
+    (resource, options, guest_handle, vmar_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* guest_handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* vmar_handle))
+
+_ZX_SYSCALL_DECL(guest_set_trap, zx_status_t, /* no attributes */, 6,
+    (handle, kind, addr, size, port_handle, key), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    zx_vaddr_t addr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port_handle,
+    uint64_t key))
+
+_ZX_SYSCALL_DECL(handle_close, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(handle_close_many, zx_status_t, /* no attributes */, 2,
+    (handles, num_handles), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) const zx_handle_t* handles,
+    size_t num_handles))
+
+_ZX_SYSCALL_DECL(handle_duplicate, zx_status_t, /* no attributes */, 3,
+    (handle, rights, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(handle_replace, zx_status_t, /* no attributes */, 3,
+    (handle, rights, out), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(interrupt_create, zx_status_t, /* no attributes */, 4,
+    (src_obj, src_num, options, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t src_obj,
+    uint32_t src_num,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(interrupt_bind, zx_status_t, /* no attributes */, 4,
+    (handle, port_handle, key, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port_handle,
+    uint64_t key,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(interrupt_wait, zx_status_t, /* no attributes */, 2,
+    (handle, out_timestamp), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t* out_timestamp))
+
+_ZX_SYSCALL_DECL(interrupt_destroy, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(interrupt_ack, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(interrupt_trigger, zx_status_t, /* no attributes */, 3,
+    (handle, options, timestamp), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t timestamp))
+
+_ZX_SYSCALL_DECL(interrupt_bind_vcpu, zx_status_t, /* no attributes */, 3,
+    (handle, vcpu, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vcpu,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(iommu_create, zx_status_t, /* no attributes */, 5,
+    (resource, type, desc, desc_size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t type,
+    const void* desc,
+    size_t desc_size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(ioports_request, zx_status_t, /* no attributes */, 3,
+    (resource, io_addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint16_t io_addr,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(ioports_release, zx_status_t, /* no attributes */, 3,
+    (resource, io_addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint16_t io_addr,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(job_create, zx_status_t, /* no attributes */, 3,
+    (parent_job, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_job,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(job_set_policy, zx_status_t, /* no attributes */, 5,
+    (handle, options, topic, policy, policy_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint32_t topic,
+    const void* policy,
+    uint32_t policy_size))
+
+_ZX_SYSCALL_DECL(job_set_critical, zx_status_t, /* no attributes */, 3,
+    (job, options, process), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t job,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t process))
+
+_ZX_SYSCALL_DECL(ktrace_read, zx_status_t, /* no attributes */, 5,
+    (handle, data, offset, data_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    void* data,
+    uint32_t offset,
+    size_t data_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(ktrace_control, zx_status_t, /* no attributes */, 4,
+    (handle, action, options, ptr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t action,
+    uint32_t options,
+    void* ptr))
+
+_ZX_SYSCALL_DECL(ktrace_write, zx_status_t, /* no attributes */, 4,
+    (handle, id, arg0, arg1), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t id,
+    uint32_t arg0,
+    uint32_t arg1))
+
+_ZX_SYSCALL_DECL(nanosleep, zx_status_t, /* no attributes */, 1,
+    (deadline), (
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(ticks_get, zx_ticks_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(ticks_per_second, zx_ticks_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(deadline_after, zx_time_t, /* no attributes */, 1,
+    (nanoseconds), (
+    zx_duration_t nanoseconds))
+
+_ZX_SYSCALL_DECL(vmar_unmap_handle_close_thread_exit, zx_status_t, /* no attributes */, 4,
+    (vmar_handle, addr, size, close_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmar_handle,
+    zx_vaddr_t addr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t close_handle))
+
+_ZX_SYSCALL_DECL(futex_wake_handle_close_thread_exit, void, __NO_RETURN, 4,
+    (value_ptr, wake_count, new_value, close_handle), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count,
+    int32_t new_value,
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t close_handle))
+
+_ZX_SYSCALL_DECL(msi_allocate, zx_status_t, /* no attributes */, 3,
+    (handle, count, out_allocation), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t count,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_allocation))
+
+_ZX_SYSCALL_DECL(msi_create, zx_status_t, /* no attributes */, 6,
+    (handle, options, msi_id, vmo, vmo_offset, out_interrupt), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint32_t msi_id,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    size_t vmo_offset,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_interrupt))
+
+_ZX_SYSCALL_DECL(mtrace_control, zx_status_t, /* no attributes */, 6,
+    (handle, kind, action, options, ptr, ptr_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    uint32_t action,
+    uint32_t options,
+    void* ptr,
+    size_t ptr_size))
+
+_ZX_SYSCALL_DECL(object_wait_one, zx_status_t, /* no attributes */, 4,
+    (handle, signals, deadline, observed), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_signals_t signals,
+    zx_time_t deadline,
+    zx_signals_t* observed))
+
+_ZX_SYSCALL_DECL(object_wait_many, zx_status_t, /* no attributes */, 3,
+    (items, num_items, deadline), (
+    zx_wait_item_t* items,
+    size_t num_items,
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(object_wait_async, zx_status_t, /* no attributes */, 5,
+    (handle, port, key, signals, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port,
+    uint64_t key,
+    zx_signals_t signals,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(object_signal, zx_status_t, /* no attributes */, 3,
+    (handle, clear_mask, set_mask), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t clear_mask,
+    uint32_t set_mask))
+
+_ZX_SYSCALL_DECL(object_signal_peer, zx_status_t, /* no attributes */, 3,
+    (handle, clear_mask, set_mask), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t clear_mask,
+    uint32_t set_mask))
+
+_ZX_SYSCALL_DECL(object_get_property, zx_status_t, /* no attributes */, 4,
+    (handle, property, value, value_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t property,
+    void* value,
+    size_t value_size))
+
+_ZX_SYSCALL_DECL(object_set_property, zx_status_t, /* no attributes */, 4,
+    (handle, property, value, value_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t property,
+    const void* value,
+    size_t value_size))
+
+_ZX_SYSCALL_DECL(object_get_info, zx_status_t, /* no attributes */, 6,
+    (handle, topic, buffer, buffer_size, actual, avail), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t topic,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual,
+    size_t* avail))
+
+_ZX_SYSCALL_DECL(object_get_child, zx_status_t, /* no attributes */, 4,
+    (handle, koid, rights, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t koid,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(object_set_profile, zx_status_t, /* no attributes */, 3,
+    (handle, profile, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t profile,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(pager_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(pager_create_vmo, zx_status_t, /* no attributes */, 6,
+    (pager, options, port, key, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port,
+    uint64_t key,
+    uint64_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(pager_detach_vmo, zx_status_t, /* no attributes */, 2,
+    (pager, vmo), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo))
+
+_ZX_SYSCALL_DECL(pager_supply_pages, zx_status_t, /* no attributes */, 6,
+    (pager, pager_vmo, offset, length, aux_vmo, aux_offset), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager_vmo,
+    uint64_t offset,
+    uint64_t length,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t aux_vmo,
+    uint64_t aux_offset))
+
+_ZX_SYSCALL_DECL(pager_op_range, zx_status_t, /* no attributes */, 6,
+    (pager, op, pager_vmo, offset, length, data), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    uint32_t op,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager_vmo,
+    uint64_t offset,
+    uint64_t length,
+    uint64_t data))
+
+_ZX_SYSCALL_DECL(pc_firmware_tables, zx_status_t, /* no attributes */, 3,
+    (handle, acpi_rsdp, smbios), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_paddr_t* acpi_rsdp,
+    zx_paddr_t* smbios))
+
+_ZX_SYSCALL_DECL(pci_get_nth_device, zx_status_t, /* no attributes */, 4,
+    (handle, index, out_info, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t index,
+    zx_pcie_device_info_t* out_info,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_enable_bus_master, zx_status_t, /* no attributes */, 2,
+    (handle, enable), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t enable))
+
+_ZX_SYSCALL_DECL(pci_reset_device, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(pci_config_read, zx_status_t, /* no attributes */, 4,
+    (handle, offset, width, out_val), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint16_t offset,
+    size_t width,
+    uint32_t* out_val))
+
+_ZX_SYSCALL_DECL(pci_config_write, zx_status_t, /* no attributes */, 4,
+    (handle, offset, width, val), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint16_t offset,
+    size_t width,
+    uint32_t val))
+
+_ZX_SYSCALL_DECL(pci_cfg_pio_rw, zx_status_t, /* no attributes */, 8,
+    (handle, bus, dev, func, offset, val, width, write), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint8_t bus,
+    uint8_t dev,
+    uint8_t func,
+    uint8_t offset,
+    uint32_t* val,
+    size_t width,
+    uint32_t write))
+
+_ZX_SYSCALL_DECL(pci_get_bar, zx_status_t, /* no attributes */, 4,
+    (handle, bar_num, out_bar, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t bar_num,
+    zx_pci_bar_t* out_bar,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_map_interrupt, zx_status_t, /* no attributes */, 3,
+    (handle, which_irq, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    int32_t which_irq,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_query_irq_mode, zx_status_t, /* no attributes */, 3,
+    (handle, mode, out_max_irqs), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mode,
+    uint32_t* out_max_irqs))
+
+_ZX_SYSCALL_DECL(pci_set_irq_mode, zx_status_t, /* no attributes */, 3,
+    (handle, mode, requested_irq_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mode,
+    uint32_t requested_irq_count))
+
+_ZX_SYSCALL_DECL(pci_init, zx_status_t, /* no attributes */, 3,
+    (handle, init_buf, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_pci_init_arg_t* init_buf,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(pci_add_subtract_io_range, zx_status_t, /* no attributes */, 5,
+    (handle, mmio, base, len, add), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mmio,
+    uint64_t base,
+    uint64_t len,
+    uint32_t add))
+
+_ZX_SYSCALL_DECL(pmt_unpin, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(port_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(port_queue, zx_status_t, /* no attributes */, 2,
+    (handle, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(port_wait, zx_status_t, /* no attributes */, 3,
+    (handle, deadline, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t deadline,
+    zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(port_cancel, zx_status_t, /* no attributes */, 3,
+    (handle, source, key), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t source,
+    uint64_t key))
+
+_ZX_SYSCALL_DECL(process_exit, void, __NO_RETURN, 1,
+    (retcode), (
+    int64_t retcode))
+
+_ZX_SYSCALL_DECL(process_create, zx_status_t, /* no attributes */, 6,
+    (job, name, name_size, options, proc_handle, vmar_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t job,
+    const char* name,
+    size_t name_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* proc_handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* vmar_handle))
+
+_ZX_SYSCALL_DECL(process_start, zx_status_t, /* no attributes */, 6,
+    (handle, thread, entry, stack, arg1, arg2), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t thread,
+    zx_vaddr_t entry,
+    zx_vaddr_t stack,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t arg1,
+    uintptr_t arg2))
+
+_ZX_SYSCALL_DECL(process_read_memory, zx_status_t, /* no attributes */, 5,
+    (handle, vaddr, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t vaddr,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(process_write_memory, zx_status_t, /* no attributes */, 5,
+    (handle, vaddr, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t vaddr,
+    const void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(profile_create, zx_status_t, /* no attributes */, 4,
+    (root_job, options, profile, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t root_job,
+    uint32_t options,
+    const zx_profile_info_t* profile,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(resource_create, zx_status_t, /* no attributes */, 7,
+    (parent_rsrc, options, base, size, name, name_size, resource_out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_rsrc,
+    uint32_t options,
+    uint64_t base,
+    size_t size,
+    const char* name,
+    size_t name_size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* resource_out))
+
+_ZX_SYSCALL_DECL(smc_call, zx_status_t, /* no attributes */, 3,
+    (handle, parameters, out_smc_result), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_smc_parameters_t* parameters,
+    zx_smc_result_t* out_smc_result))
+
+_ZX_SYSCALL_DECL(socket_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(socket_write, zx_status_t, /* no attributes */, 5,
+    (handle, options, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(socket_read, zx_status_t, /* no attributes */, 5,
+    (handle, options, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(socket_shutdown, zx_status_t, /* no attributes */, 2,
+    (handle, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(stream_create, zx_status_t, /* no attributes */, 4,
+    (options, vmo, seek, out_stream), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    zx_off_t seek,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_stream))
+
+_ZX_SYSCALL_DECL(stream_writev, zx_status_t, /* no attributes */, 5,
+    (handle, options, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_writev_at, zx_status_t, /* no attributes */, 6,
+    (handle, options, offset, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_off_t offset,
+    const zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_readv, zx_status_t, /* no attributes */, 5,
+    (handle, options, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_readv_at, zx_status_t, /* no attributes */, 6,
+    (handle, options, offset, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_off_t offset,
+    zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_seek, zx_status_t, /* no attributes */, 4,
+    (handle, whence, offset, out_seek), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_stream_seek_origin_t whence,
+    int64_t offset,
+    zx_off_t* out_seek))
+
+_ZX_SYSCALL_DECL(system_get_dcache_line_size, uint32_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_num_cpus, uint32_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_version_string, zx_string_view_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_physmem, uint64_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_features, zx_status_t, /* no attributes */, 2,
+    (kind, features), (
+    uint32_t kind,
+    uint32_t* features))
+
+_ZX_SYSCALL_DECL(system_get_event, zx_status_t, /* no attributes */, 3,
+    (root_job, kind, event), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t root_job,
+    uint32_t kind,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* event))
+
+_ZX_SYSCALL_DECL(system_mexec, zx_status_t, /* no attributes */, 3,
+    (resource, kernel_vmo, bootimage_vmo), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t kernel_vmo,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t bootimage_vmo))
+
+_ZX_SYSCALL_DECL(system_mexec_payload_get, zx_status_t, /* no attributes */, 3,
+    (resource, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(system_powerctl, zx_status_t, /* no attributes */, 3,
+    (resource, cmd, arg), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t cmd,
+    const zx_system_powerctl_arg_t* arg))
+
+_ZX_SYSCALL_DECL(task_suspend, zx_status_t, /* no attributes */, 2,
+    (handle, token), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* token))
+
+_ZX_SYSCALL_DECL(task_suspend_token, zx_status_t, /* no attributes */, 2,
+    (handle, token), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* token))
+
+_ZX_SYSCALL_DECL(task_create_exception_channel, zx_status_t, /* no attributes */, 3,
+    (handle, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(task_kill, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(thread_exit, void, __NO_RETURN, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(thread_create, zx_status_t, /* no attributes */, 5,
+    (process, name, name_size, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t process,
+    const char* name,
+    size_t name_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(thread_start, zx_status_t, /* no attributes */, 5,
+    (handle, thread_entry, stack, arg1, arg2), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t thread_entry,
+    zx_vaddr_t stack,
+    uintptr_t arg1,
+    uintptr_t arg2))
+
+_ZX_SYSCALL_DECL(thread_read_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(thread_write_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(timer_create, zx_status_t, /* no attributes */, 3,
+    (options, clock_id, out), (
+    uint32_t options,
+    zx_clock_t clock_id,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(timer_set, zx_status_t, /* no attributes */, 3,
+    (handle, deadline, slack), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t deadline,
+    zx_duration_t slack))
+
+_ZX_SYSCALL_DECL(timer_cancel, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(vcpu_create, zx_status_t, /* no attributes */, 4,
+    (guest, options, entry, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t guest,
+    uint32_t options,
+    zx_vaddr_t entry,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vcpu_resume, zx_status_t, /* no attributes */, 2,
+    (handle, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(vcpu_interrupt, zx_status_t, /* no attributes */, 2,
+    (handle, vector), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t vector))
+
+_ZX_SYSCALL_DECL(vcpu_read_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vcpu_write_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmar_allocate, zx_status_t, /* no attributes */, 6,
+    (parent_vmar, options, offset, size, child_vmar, child_addr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_vmar,
+    zx_vm_option_t options,
+    size_t offset,
+    size_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* child_vmar,
+    zx_vaddr_t* child_addr))
+
+_ZX_SYSCALL_DECL(vmar_destroy, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(vmar_map, zx_status_t, /* no attributes */, 7,
+    (handle, options, vmar_offset, vmo, vmo_offset, len, mapped_addr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vm_option_t options,
+    size_t vmar_offset,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint64_t vmo_offset,
+    size_t len,
+    zx_vaddr_t* mapped_addr))
+
+_ZX_SYSCALL_DECL(vmar_unmap, zx_status_t, /* no attributes */, 3,
+    (handle, addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t addr,
+    size_t len))
+
+_ZX_SYSCALL_DECL(vmar_protect, zx_status_t, /* no attributes */, 4,
+    (handle, options, addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vm_option_t options,
+    zx_vaddr_t addr,
+    size_t len))
+
+_ZX_SYSCALL_DECL(vmar_op_range, zx_status_t, /* no attributes */, 6,
+    (handle, op, address, size, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t op,
+    zx_vaddr_t address,
+    size_t size,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_create, zx_status_t, /* no attributes */, 3,
+    (size, options, out), (
+    uint64_t size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_read, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, offset, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    void* buffer,
+    uint64_t offset,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_write, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, offset, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const void* buffer,
+    uint64_t offset,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_get_size, zx_status_t, /* no attributes */, 2,
+    (handle, size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t* size))
+
+_ZX_SYSCALL_DECL(vmo_set_size, zx_status_t, /* no attributes */, 2,
+    (handle, size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t size))
+
+_ZX_SYSCALL_DECL(vmo_op_range, zx_status_t, /* no attributes */, 6,
+    (handle, op, offset, size, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t op,
+    uint64_t offset,
+    uint64_t size,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_create_child, zx_status_t, /* no attributes */, 5,
+    (handle, options, offset, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint64_t offset,
+    uint64_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_set_cache_policy, zx_status_t, /* no attributes */, 2,
+    (handle, cache_policy), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t cache_policy))
+
+_ZX_SYSCALL_DECL(vmo_replace_as_executable, zx_status_t, /* no attributes */, 3,
+    (handle, vmex, out), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmex,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_create_contiguous, zx_status_t, /* no attributes */, 4,
+    (bti, size, alignment_log2, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t bti,
+    size_t size,
+    uint32_t alignment_log2,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_create_physical, zx_status_t, /* no attributes */, 4,
+    (resource, paddr, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    zx_paddr_t paddr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/iommu.h b/arch/arm64/sysroot/include/zircon/syscalls/iommu.h
index e567175..414320d 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/iommu.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/iommu.h
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
+#define SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
 
 #include <assert.h>
-#include <zircon/compiler.h>
 #include <stdbool.h>
 #include <stdint.h>
+#include <zircon/compiler.h>
 
 __BEGIN_CDECLS
 
@@ -19,77 +20,78 @@
 
 // Data structures for creating a dummy IOMMU instance
 typedef struct zx_iommu_desc_dummy {
-    uint8_t reserved;
+  uint8_t reserved;
 } zx_iommu_desc_dummy_t;
 
-
 // Data structures for creating an Intel IOMMU instance
 
 // This scope represents a single PCI endpoint device
 #define ZX_IOMMU_INTEL_SCOPE_ENDPOINT 0
 // This scope represents a PCI-PCI bridge.  The bridge and all of its downstream
 // devices will be included in this scope.
-#define ZX_IOMMU_INTEL_SCOPE_BRIDGE   1
+#define ZX_IOMMU_INTEL_SCOPE_BRIDGE 1
 
 // TODO(teisenbe): Investigate FIDL for this.  Multiple embedded lists seems
 // right up its alley.
 typedef struct zx_iommu_desc_intel_scope {
-    uint8_t type;
-    // The bus number of the first bus decoded by the host bridge this scope is attached to.
-    uint8_t start_bus;
-    // Number of bridges (including the host bridge) between host bridge and the
-    // device.
-    uint8_t num_hops;
-    // The device number and function numbers of the bridges along the way,
-    // ending with the device itself.
-    // |dev_func[0]| is the address on |start_bus| of the first bridge in the
-    // path (excluding the host bridge).  |dev_func[num_hops-1]| is the address
-    // of the the device itself.
-    uint8_t dev_func[5];
+  uint8_t type;
+  // The bus number of the first bus decoded by the host bridge this scope is attached to.
+  uint8_t start_bus;
+  // Number of bridges (including the host bridge) between host bridge and the
+  // device.
+  uint8_t num_hops;
+  // The device number and function numbers of the bridges along the way,
+  // ending with the device itself.
+  // |dev_func[0]| is the address on |start_bus| of the first bridge in the
+  // path (excluding the host bridge).  |dev_func[num_hops-1]| is the address
+  // of the device itself.
+  uint8_t dev_func[5];
 } zx_iommu_desc_intel_scope_t;
 
 typedef struct zx_iommu_desc_intel_reserved_memory {
-    uint64_t base_addr; // Physical address of the base of reserved memory.
-    uint64_t len; // Number of bytes of reserved memory.
+  uint64_t base_addr;  // Physical address of the base of reserved memory.
+  uint64_t len;        // Number of bytes of reserved memory.
 
-    // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
-    uint8_t scope_bytes;
+  // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
+  uint8_t scope_bytes;
 
-    uint8_t _reserved[7]; // Padding
+  uint8_t _reserved[7];  // Padding
 
-    // This is a list of all devices that need access to this memory range.
-    //
-    // zx_iommu_desc_intel_scope_t scopes[num_scopes];
+  // This is a list of all devices that need access to this memory range.
+  //
+  // zx_iommu_desc_intel_scope_t scopes[num_scopes];
 } zx_iommu_desc_intel_reserved_memory_t;
 
 typedef struct zx_iommu_desc_intel {
-    uint64_t register_base; // Physical address of registers
-    uint16_t pci_segment; // The PCI segment associated with this IOMMU
+  uint64_t register_base;  // Physical address of registers
+  uint16_t pci_segment;    // The PCI segment associated with this IOMMU
 
-    // If true, this IOMMU has all PCI devices in its segment under its scope.
-    // In this case, the list of scopes acts as a blacklist.
-    bool whole_segment;
+  // If false, scopes[] represents all PCI devices in this segment managed by this IOMMU.
+  // If true, scopes[] represents all PCI devices in this segment *not* managed by this IOMMU.
+  bool whole_segment;
 
-    // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
-    uint8_t scope_bytes;
+  // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
+  uint8_t scope_bytes;
 
-    // The number of bytes of zx_iommu_desc_intel_reserved_memory_t's that follow the scope
-    // list.
-    uint16_t reserved_memory_bytes;
+  // The number of bytes of zx_iommu_desc_intel_reserved_memory_t's that follow the scope
+  // list.
+  uint16_t reserved_memory_bytes;
 
-    uint8_t _reserved[2]; // Padding
+  uint8_t _reserved[2];  // Padding
 
-    // If |whole_segment| is false, this is a list of all devices managed by
-    // this IOMMU.  If |whole_segment| is true, this is a list of all devices on
-    // this segment *not* managed by this IOMMU.  It has a total length in bytes of
-    // |scope_bytes|.
-    //
-    // zx_iommu_desc_intel_scope_t scopes[];
+  // If |whole_segment| is false, this is a list of all devices managed by
+  // this IOMMU.  If |whole_segment| is true, this is a list of all devices on
+  // this segment *not* managed by this IOMMU.  It has a total length in bytes of
+  // |scope_bytes|.
+  //
+  // zx_iommu_desc_intel_scope_t scopes[];
 
-    // A list of all BIOS-reserved memory regions this IOMMU needs to translate.
-    // It has a total length in bytes of |reserved_memory_bytes|.
-    //
-    // zx_iommu_desc_intel_reserved_memory_t reserved_mem[];
+  // A list of all BIOS-reserved memory regions this IOMMU needs to translate.
+  // It has a total length in bytes of |reserved_memory_bytes|.
+  //
+  // zx_iommu_desc_intel_reserved_memory_t reserved_mem[];
 } zx_iommu_desc_intel_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/log.h b/arch/arm64/sysroot/include/zircon/syscalls/log.h
index e89d9c5..c6af1d9 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/log.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/log.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_LOG_H_
+#define SYSROOT_ZIRCON_SYSCALLS_LOG_H_
 
 #include <zircon/types.h>
 
@@ -10,13 +11,14 @@
 
 // Defines and structures for zx_log_*()
 typedef struct zx_log_record {
-    uint32_t reserved;
-    uint16_t datalen;
-    uint16_t flags;
-    zx_time_t timestamp;
-    uint64_t pid;
-    uint64_t tid;
-    char data[];
+  uint32_t rollout;
+  uint16_t datalen;
+  uint8_t severity;
+  uint8_t flags;
+  zx_time_t timestamp;
+  uint64_t pid;
+  uint64_t tid;
+  char data[];
 } zx_log_record_t;
 
 // ask clang format not to mess up the indentation:
@@ -24,32 +26,26 @@
 
 #define ZX_LOG_RECORD_MAX     256
 
-// Common Log Levels
-#define ZX_LOG_ERROR          (0x0001)
-#define ZX_LOG_WARN           (0x0002)
-#define ZX_LOG_INFO           (0x0004)
-
-// Verbose log levels
-#define ZX_LOG_TRACE          (0x0010)
-#define ZX_LOG_SPEW           (0x0020)
-
-// Custom Log Levels
-#define ZX_LOG_DEBUG1         (0x0100)
-#define ZX_LOG_DEBUG2         (0x0200)
-#define ZX_LOG_DEBUG3         (0x0400)
-#define ZX_LOG_DEBUG4         (0x0800)
+// Log Levels
+#define ZX_LOG_TRACE          (0x10)
+#define ZX_LOG_DEBUG          (0x20)
+#define ZX_LOG_INFO           (0x30)
+#define ZX_LOG_WARNING        (0x40)
+#define ZX_LOG_ERROR          (0x50)
+#define ZX_LOG_FATAL          (0x60)
 
 // Filter Flags
 
 // Do not forward this message via network
 // (for logging in network core and drivers)
-#define ZX_LOG_LOCAL          (0x1000)
+#define ZX_LOG_LOCAL          (0x10)
 
-#define ZX_LOG_LEVEL_MASK     (0x0FFF)
-#define ZX_LOG_FLAGS_MASK     (0xFFFF)
+#define ZX_LOG_FLAGS_MASK     (0x10)
 
 // Options
 
 #define ZX_LOG_FLAG_READABLE  0x40000000
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_LOG_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/object.h b/arch/arm64/sysroot/include/zircon/syscalls/object.h
index 33e2e90..81414d5 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/object.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/object.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_OBJECT_H_
-#define ZIRCON_SYSCALLS_OBJECT_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
+#define SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
 
 #include <zircon/types.h>
 
@@ -12,6 +12,9 @@
 // ask clang format not to mess up the indentation:
 // clang-format off
 
+// Help macro for building versioned topics. Version is the upper 4 bits and starts counting at 0.
+#define __ZX_INFO_TOPIC(t, v) ((zx_object_info_topic_t) ((t) | ((v) << 28)))
+
 // Valid topics for zx_object_get_info.
 typedef uint32_t zx_object_info_topic_t;
 #define ZX_INFO_NONE                    ((zx_object_info_topic_t)  0u)
@@ -26,7 +29,8 @@
 #define ZX_INFO_THREAD_EXCEPTION_REPORT ((zx_object_info_topic_t) 11u) // zx_exception_report_t[1]
 #define ZX_INFO_TASK_STATS              ((zx_object_info_topic_t) 12u) // zx_info_task_stats_t[1]
 #define ZX_INFO_PROCESS_MAPS            ((zx_object_info_topic_t) 13u) // zx_info_maps_t[n]
-#define ZX_INFO_PROCESS_VMOS            ((zx_object_info_topic_t) 14u) // zx_info_vmo_t[n]
+#define ZX_INFO_PROCESS_VMOS_V1         __ZX_INFO_TOPIC(14u, 0)        // zx_info_vmo_t[n]
+#define ZX_INFO_PROCESS_VMOS            __ZX_INFO_TOPIC(14u, 1)        // zx_info_vmo_t[n]
 #define ZX_INFO_THREAD_STATS            ((zx_object_info_topic_t) 15u) // zx_info_thread_stats_t[1]
 #define ZX_INFO_CPU_STATS               ((zx_object_info_topic_t) 16u) // zx_info_cpu_stats_t[n]
 #define ZX_INFO_KMEM_STATS              ((zx_object_info_topic_t) 17u) // zx_info_kmem_stats_t[1]
@@ -35,11 +39,27 @@
 #define ZX_INFO_BTI                     ((zx_object_info_topic_t) 20u) // zx_info_bti_t[1]
 #define ZX_INFO_PROCESS_HANDLE_STATS    ((zx_object_info_topic_t) 21u) // zx_info_process_handle_stats_t[1]
 #define ZX_INFO_SOCKET                  ((zx_object_info_topic_t) 22u) // zx_info_socket_t[1]
-#define ZX_INFO_VMO                     ((zx_object_info_topic_t) 23u) // zx_info_vmo_t[1]
+#define ZX_INFO_VMO_V1                  __ZX_INFO_TOPIC(23u, 0)        // zx_info_vmo_t[1]
+#define ZX_INFO_VMO                     __ZX_INFO_TOPIC(23u, 1)        // zx_info_vmo_t[1]
+#define ZX_INFO_JOB                     ((zx_object_info_topic_t) 24u) // zx_info_job_t[1]
+#define ZX_INFO_TIMER                   ((zx_object_info_topic_t) 25u) // zx_info_timer_t[1]
+#define ZX_INFO_STREAM                  ((zx_object_info_topic_t) 26u) // zx_info_stream_t[1]
+#define ZX_INFO_HANDLE_TABLE            ((zx_object_info_topic_t) 27u) // zx_info_handle_extended_t[n]
+#define ZX_INFO_MSI                     ((zx_object_info_topic_t) 28u) // zx_info_msi_t[1]
+#define ZX_INFO_GUEST_STATS             ((zx_object_info_topic_t) 29u) // zx_info_guest_stats_t[1]
+#define ZX_INFO_TASK_RUNTIME            ((zx_object_info_topic_t) 30u) // zx_info_task_runtime_t[1]
 
-typedef uint32_t zx_obj_props_t;
-#define ZX_OBJ_PROP_NONE                ((zx_obj_props_t)0u)
-#define ZX_OBJ_PROP_WAITABLE            ((zx_obj_props_t)1u)
+// Return codes set when a task is killed.
+#define ZX_TASK_RETCODE_SYSCALL_KILL            ((int64_t) -1024)   // via zx_task_kill().
+#define ZX_TASK_RETCODE_OOM_KILL                ((int64_t) -1025)   // by the OOM killer.
+#define ZX_TASK_RETCODE_POLICY_KILL             ((int64_t) -1026)   // by the Job policy.
+#define ZX_TASK_RETCODE_VDSO_KILL               ((int64_t) -1027)   // by the VDSO.
+#define ZX_TASK_RETCODE_EXCEPTION_KILL          ((int64_t) -1028)   // Exception not handled.
+#define ZX_TASK_RETCODE_CRITICAL_PROCESS_KILL   ((int64_t) -1029)   // by a critical process.
+
+// Sentinel indicating an invalid or missing CPU.
+#define ZX_INFO_INVALID_CPU             ((uint32_t)0xFFFFFFFFu)
+
 
 typedef struct zx_info_handle_basic {
     // The unique id assigned by kernel to the object referenced by the
@@ -61,11 +81,46 @@
     // not change even if the related object no longer exists.
     zx_koid_t related_koid;
 
-    // Set to ZX_OBJ_PROP_WAITABLE if the object referenced by the
-    // handle can be waited on; zero otherwise.
-    zx_obj_props_t props;
+    uint32_t reserved;
+
+    uint8_t padding1[4];
 } zx_info_handle_basic_t;
 
+typedef struct zx_info_handle_extended {
+    // The object type: channel, event, socket, etc.
+    zx_obj_type_t type;
+
+    // The handle value which is only valid for the process which
+    // was passed to ZX_INFO_HANDLE_TABLE.
+    zx_handle_t handle_value;
+
+    // The immutable rights assigned to the handle. Two handles that
+    // have the same koid and the same rights are equivalent and
+    // interchangeable.
+    zx_rights_t rights;
+
+    uint32_t reserved;
+
+    // The unique id assigned by kernel to the object referenced by the
+    // handle.
+    zx_koid_t koid;
+
+    // If the object referenced by the handle is related to another (such
+    // as the other end of a channel, or the parent of a job) then
+    // |related_koid| is the koid of that object, otherwise it is zero.
+    // This relationship is immutable: an object's |related_koid| does
+    // not change even if the related object no longer exists.
+    zx_koid_t related_koid;
+
+    // If the object referenced by the handle has a peer, like the
+    // other end of a channel, then this is the koid of the process
+    // which currently owns it. This value is not stable; the process
+    // can change the owner at any moment.
+    //
+    // This is currently unimplemented and contains 0.
+    zx_koid_t peer_owner_koid;
+} zx_info_handle_extended_t;
+
 typedef struct zx_info_handle_count {
     // The number of outstanding handles to a kernel object.
     uint32_t handle_count;
@@ -73,12 +128,12 @@
 
 typedef struct zx_info_process_handle_stats {
     // The number of outstanding handles to kernel objects of each type.
-    uint32_t handle_count[64];
+    uint32_t handle_count[ZX_OBJ_TYPE_UPPER_BOUND];
 } zx_info_process_handle_stats_t;
 
 typedef struct zx_info_process {
     // The process's return code; only valid if |exited| is true.
-    // Guaranteed to be non-zero if the process was killed by |zx_task_kill|.
+    // If the process was killed, it will be one of the ZX_TASK_RETCODE values.
     int64_t return_code;
 
     // True if the process has ever left the initial creation state,
@@ -90,8 +145,70 @@
 
     // True if a debugger is attached to the process.
     bool debugger_attached;
+
+    uint8_t padding1[5];
 } zx_info_process_t;
 
+typedef struct zx_info_job {
+    // The job's return code; only valid if |exited| is true.
+    // If the process was killed, it will be one of the ZX_TASK_RETCODE values.
+    int64_t return_code;
+
+    // If true, the job has exited and |return_code| is valid.
+    bool exited;
+
+    // True if the ZX_PROP_JOB_KILL_ON_OOM was set.
+    bool kill_on_oom;
+
+    // True if a debugger is attached to the job.
+    bool debugger_attached;
+
+    uint8_t padding1[5];
+} zx_info_job_t;
+
+typedef struct zx_info_timer {
+    // The options passed to zx_timer_create().
+    uint32_t options;
+
+    uint8_t padding1[4];
+
+    // The deadline with respect to ZX_CLOCK_MONOTONIC at which the timer will
+    // fire next.
+    //
+    // This value will be zero if the timer is not set to fire.
+    zx_time_t deadline;
+
+    // Specifies a range from deadline - slack to deadline + slack during which
+    // the timer is allowed to fire. The system uses this parameter as a hint to
+    // coalesce nearby timers.
+    //
+    // The precise coalescing behavior is controlled by the options parameter
+    // specified when the timer was created.
+    //
+    // This value will be zero if the timer is not set to fire.
+    zx_duration_t slack;
+} zx_info_timer_t;
+
+typedef struct zx_info_stream {
+    // The options passed to zx_stream_create().
+    uint32_t options;
+
+    uint8_t padding1[4];
+
+    // The current seek offset.
+    //
+    // Used by zx_stream_readv and zx_stream_writev to determine where to read
+    // and write the stream.
+    zx_off_t seek;
+
+    // The current size of the stream.
+    //
+    // The number of bytes in the stream that store data. The stream itself
+    // might have a larger capacity to avoid reallocating the underlying storage
+    // as the stream grows or shrinks.
+    uint64_t content_size;
+} zx_info_stream_t;
+
 typedef uint32_t zx_thread_state_t;
 
 typedef struct zx_info_thread {
@@ -99,15 +216,32 @@
     zx_thread_state_t state;
 
     // If |state| is ZX_THREAD_STATE_BLOCKED_EXCEPTION, the thread has gotten
-    // an exception and is waiting for the exception to be handled by the
-    // specified port.
-    // The value is one of ZX_EXCEPTION_PORT_TYPE_*.
-    uint32_t wait_exception_port_type;
+    // an exception and is waiting for the exception response from the specified
+    // handler.
+
+    // The value is one of ZX_EXCEPTION_CHANNEL_TYPE_*.
+    uint32_t wait_exception_channel_type;
+
+    // CPUs this thread may be scheduled on, as specified by
+    // a profile object applied to this thread.
+    //
+    // The kernel may not internally store invalid CPUs in the mask, so
+    // this may not exactly match the mask applied to the thread for
+    // CPUs beyond what the system is able to use.
+    zx_cpu_set_t cpu_affinity_mask;
 } zx_info_thread_t;
 
 typedef struct zx_info_thread_stats {
     // Total accumulated running time of the thread.
     zx_duration_t total_runtime;
+
+    // CPU number that this thread was last scheduled on, or ZX_INFO_INVALID_CPU
+    // if the thread has never been scheduled on a CPU. By the time this call
+    // returns, the thread may have been scheduled elsewhere, so this
+    // information should only be used as a hint or for statistics.
+    uint32_t last_scheduled_cpu;
+
+    uint8_t padding1[4];
 } zx_info_thread_stats_t;
 
 // Statistics about resources (e.g., memory) used by a task. Can be relatively
@@ -155,12 +289,22 @@
 
     // The number of bytes in the device's address space (UINT64_MAX if 2^64).
     uint64_t aspace_size;
+
+    // The count of the pinned memory object tokens. Requesting this count is
+    // racy, so this should only be used for informative reasons.
+    uint64_t pmo_count;
+
+    // The count of the quarantined pinned memory object tokens. Requesting this count is
+    // racy, so this should only be used for informative reasons.
+    uint64_t quarantine_count;
 } zx_info_bti_t;
 
 typedef struct zx_info_socket {
     // The options passed to zx_socket_create().
     uint32_t options;
 
+    uint8_t padding1[4];
+
     // The maximum size of the receive buffer of a socket, in bytes.
     //
     // The receive buffer may become full at a capacity less than the maximum
@@ -199,6 +343,7 @@
     // MMU flags for the mapping.
     // Bitwise OR of ZX_VM_PERM_{READ,WRITE,EXECUTE} values.
     zx_vm_option_t mmu_flags;
+    uint8_t padding1[4];
     // koid of the mapped VMO.
     zx_koid_t vmo_koid;
     // Offset into the above VMO.
@@ -232,6 +377,7 @@
     size_t depth;
     // The type of this entry; indicates which union entry is valid.
     zx_info_maps_type_t type;
+    uint8_t padding1[4];
     union {
         zx_info_maps_mapping_t mapping;
         // No additional fields for other types.
@@ -256,7 +402,10 @@
 // if (ZX_INFO_VMO_TYPE(f) == ZX_INFO_VMO_TYPE_PAGED)
 #define ZX_INFO_VMO_TYPE(flags)             ((flags) & (1u<<0))
 
-// The VMO is a clone, and is a copy-on-write clone.
+// The VMO is resizable.
+#define ZX_INFO_VMO_RESIZABLE               (1u<<1)
+
+// The VMO is a child, and is a copy-on-write clone.
 #define ZX_INFO_VMO_IS_COW_CLONE            (1u<<2)
 
 // When reading a list of VMOs pointed to by a process, indicates that the
@@ -268,6 +417,14 @@
 // the VMO.
 #define ZX_INFO_VMO_VIA_MAPPING             (1u<<4)
 
+// The VMO is a pager owned VMO created by zx_pager_create_vmo or is
+// a clone of a VMO with this flag set. Will only be set on VMOs with
+// the ZX_INFO_VMO_TYPE_PAGED flag set.
+#define ZX_INFO_VMO_PAGER_BACKED            (1u<<5)
+
+// The VMO is contiguous
+#define ZX_INFO_VMO_CONTIGUOUS              (1u<<6)
+
 // Describes a VMO. For mapping information, see |zx_info_maps_t|.
 typedef struct zx_info_vmo {
     // The koid of this VMO.
@@ -301,6 +458,8 @@
     // Bitwise OR of ZX_INFO_VMO_* values.
     uint32_t flags;
 
+    uint8_t padding1[4];
+
     // If |ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|, the amount of
     // memory currently allocated to this VMO; i.e., the amount of physical
     // memory it consumes. Undefined otherwise.
@@ -310,15 +469,83 @@
     // Undefined otherwise.
     zx_rights_t handle_rights;
 
-    // VMO creation options. This is a bitmask of
-    // kResizable    = (1u << 0);
-    // kContiguous   = (1u << 1);
-    uint32_t create_options;
-
     // VMO mapping cache policy. One of ZX_CACHE_POLICY_*
     uint32_t cache_policy;
+
+    // Amount of kernel memory, in bytes, allocated to track metadata
+    // associated with this VMO.
+    uint64_t metadata_bytes;
+
+    // Running counter of the number of times the kernel, without user request,
+    // performed actions on this VMO that would have caused |committed_bytes| to
+    // report a different value.
+    uint64_t committed_change_events;
 } zx_info_vmo_t;
 
+typedef struct zx_info_vmo_v1 {
+    zx_koid_t koid;
+    char name[ZX_MAX_NAME_LEN];
+    uint64_t size_bytes;
+    zx_koid_t parent_koid;
+    size_t num_children;
+    size_t num_mappings;
+    size_t share_count;
+    uint32_t flags;
+    uint8_t padding1[4];
+    uint64_t committed_bytes;
+    zx_rights_t handle_rights;
+    uint32_t cache_policy;
+} zx_info_vmo_v1_t;
+
+typedef struct zx_info_guest_stats {
+    uint32_t cpu_number;
+    uint32_t flags;
+
+    uint64_t vm_entries;
+    uint64_t vm_exits;
+#ifdef __aarch64__
+    uint64_t wfi_wfe_instructions;
+    uint64_t instruction_aborts;
+    uint64_t data_aborts;
+    uint64_t system_instructions;
+    uint64_t smc_instructions;
+    uint64_t interrupts;
+#else
+    uint64_t interrupts;
+    uint64_t interrupt_windows;
+    uint64_t cpuid_instructions;
+    uint64_t hlt_instructions;
+    uint64_t control_register_accesses;
+    uint64_t io_instructions;
+    uint64_t rdmsr_instructions;
+    uint64_t wrmsr_instructions;
+    uint64_t ept_violations;
+    uint64_t xsetbv_instructions;
+    uint64_t pause_instructions;
+    uint64_t vmcall_instructions;
+#endif
+} zx_info_guest_stats_t;
+
+// Info on the runtime of a task.
+typedef struct zx_info_task_runtime {
+    // The total amount of time this task and its children were running.
+    // * Threads include only their own runtime.
+    // * Processes include the runtime for all of their threads (including threads that previously
+    // exited).
+    // * Jobs include the runtime for all of their processes (including processes that previously
+    // exited).
+    zx_duration_t cpu_time;
+
+    // The total amount of time this task and its children were queued to run.
+    // * Threads include only their own queue time.
+    // * Processes include the queue time for all of their threads (including threads that
+    // previously exited).
+    // * Jobs include the queue time for all of their processes (including processes that previously
+    // exited).
+    zx_duration_t queue_time;
+} zx_info_task_runtime_t;
+
+
 // kernel statistics per cpu
 // TODO(cpu), expose the deprecated stats via a new syscall.
 typedef struct zx_info_cpu_stats {
@@ -399,6 +626,19 @@
     char name[ZX_MAX_NAME_LEN];
 } zx_info_resource_t;
 
+typedef struct zx_info_msi {
+  // The target adress for write transactions.
+  uint64_t target_addr;
+  // The data that the device will write when triggering an IRQ.
+  uint32_t target_data;
+  // The first IRQ in the allocated block.
+  uint32_t base_irq_id;
+  // The number of IRQs in the allocated block.
+  uint32_t num_irq;
+  // The number of outstanding interrupt objects created off this Msi object.
+  uint32_t interrupt_count;
+} zx_info_msi_t;
+
 #define ZX_INFO_CPU_STATS_FLAG_ONLINE       (1u<<0)
 
 // Object properties.
@@ -422,6 +662,19 @@
 // Argument is the base address of the vDSO mapping (or zero), a uintptr_t.
 #define ZX_PROP_PROCESS_VDSO_BASE_ADDRESS   ((uint32_t) 6u)
 
+// Whether the dynamic loader should issue a debug trap when loading a shared library,
+// either initially or when running (e.g. dlopen).
+//
+// See docs/reference/syscalls/object_get_property.md
+// See third_party/ulib/musl/ldso/dynlink.c.
+#define ZX_PROP_PROCESS_BREAK_ON_LOAD ((uint32_t) 7u)
+
+// The process's context id as recorded by h/w instruction tracing, a uintptr_t.
+// On X86 this is the cr3 value.
+// TODO(dje): Wasn't sure whether the gaps in property numbers are unusable
+// due to being old dleeted values. For now I just picked something.
+#define ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID ((uint32_t) 8u)
+
 // Argument is a size_t.
 #define ZX_PROP_SOCKET_RX_THRESHOLD         12u
 #define ZX_PROP_SOCKET_TX_THRESHOLD         13u
@@ -429,6 +682,21 @@
 // Terminate this job if the system is low on memory.
 #define ZX_PROP_JOB_KILL_ON_OOM             15u
 
+// Exception close behavior.
+#define ZX_PROP_EXCEPTION_STATE             16u
+
+// The size of the content in a VMO, in bytes.
+//
+// The content size of a VMO can be larger or smaller than the actual size of
+// the VMO.
+//
+// Argument is a uint64_t.
+#define ZX_PROP_VMO_CONTENT_SIZE            17u
+
+// How an exception should be handled.
+// See //docs/concepts/kernel/exceptions.md.
+#define ZX_PROP_EXCEPTION_STRATEGY          18u
+
 // Basic thread states, in zx_info_thread_t.state.
 #define ZX_THREAD_STATE_NEW                 ((zx_thread_state_t) 0x0000u)
 #define ZX_THREAD_STATE_RUNNING             ((zx_thread_state_t) 0x0001u)
@@ -449,11 +717,22 @@
 #define ZX_THREAD_STATE_BLOCKED_WAIT_ONE    ((zx_thread_state_t) 0x0603u)
 #define ZX_THREAD_STATE_BLOCKED_WAIT_MANY   ((zx_thread_state_t) 0x0703u)
 #define ZX_THREAD_STATE_BLOCKED_INTERRUPT   ((zx_thread_state_t) 0x0803u)
+#define ZX_THREAD_STATE_BLOCKED_PAGER       ((zx_thread_state_t) 0x0903u)
 
 // Reduce possibly-more-precise state to a basic state.
 // Useful if, for example, you want to check for BLOCKED on anything.
 #define ZX_THREAD_STATE_BASIC(n) ((n) & 0xff)
 
+// How a thread should behave when the current exception is closed.
+// ZX_PROP_EXCEPTION_STATE values.
+#define ZX_EXCEPTION_STATE_TRY_NEXT         0u
+#define ZX_EXCEPTION_STATE_HANDLED          1u
+
+// How an exception should be handled
+// ZX_PROP_EXCEPTION_STRATEGY values.
+#define ZX_EXCEPTION_STRATEGY_FIRST_CHANCE  0u
+#define ZX_EXCEPTION_STRATEGY_SECOND_CHANCE 1u
+
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_OBJECT_H_
+#endif // SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/pci.h b/arch/arm64/sysroot/include/zircon/syscalls/pci.h
index b97f1c3..d1049c2 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/pci.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/pci.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PCI_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PCI_H_
 
 #include <zircon/types.h>
 
@@ -32,7 +33,10 @@
     size_t size;
     union {
         uintptr_t addr;
-        zx_handle_t handle;
+        struct {
+            zx_handle_t handle;
+            uint8_t padding1[4];
+        };
     };
 } zx_pci_bar_t;
 
@@ -50,6 +54,8 @@
     uint8_t  bus_id;
     uint8_t  dev_id;
     uint8_t  func_id;
+
+    uint8_t  padding1;
 } zx_pcie_device_info_t;
 
 #define ZX_PCI_MAX_BUSSES (256u)
@@ -84,6 +90,10 @@
                                          [ZX_PCI_MAX_FUNCTIONS_PER_DEVICE]
                                          [ZX_PCI_MAX_LEGACY_IRQ_PINS];
 
+// We support up to 224 IRQs on a system, this is the maximum supported by
+// LAPICs (today) so this should be a safe number.
+#define ZX_PCI_MAX_IRQS 224
+
 typedef struct zx_pci_init_arg {
     zx_pci_irq_swizzle_lut_t dev_pin_to_global_irq;
 
@@ -92,7 +102,8 @@
         uint32_t global_irq;
         bool level_triggered;
         bool active_high;
-    } irqs[64];
+        uint8_t padding1[2];
+    } irqs[ZX_PCI_MAX_IRQS];
 
     uint32_t addr_window_count;
     struct {
@@ -102,6 +113,7 @@
         uint8_t bus_end;
         uint8_t cfg_space_type;
         bool has_ecam;
+        uint8_t padding1[4];
     } addr_windows[];
 } zx_pci_init_arg_t;
 
@@ -118,3 +130,5 @@
 #define ZX_PCIE_IRQ_MODE_MSI_X ((zx_pci_irq_mode_t) 3u)
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PCI_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/policy.h b/arch/arm64/sysroot/include/zircon/syscalls/policy.h
index f7061ce..158c604 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/policy.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/policy.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
+#define SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
 
 #include <zircon/types.h>
 
@@ -13,18 +14,33 @@
 
 // Policy is applied for the conditions that are not
 // specified by the parent job policy.
-#define ZX_JOB_POL_RELATIVE                 0u
+#define ZX_JOB_POL_RELATIVE                     0u
 // Policy is either applied as-is or the syscall fails.
-#define ZX_JOB_POL_ABSOLUTE                 1u
+#define ZX_JOB_POL_ABSOLUTE                     1u
 
 // Basic policy topic.
-#define ZX_JOB_POL_BASIC                    0u
+#define ZX_JOB_POL_BASIC_V1                     0u
+#define ZX_JOB_POL_BASIC_V2            0x01000000u
 
-// Input structure to use with ZX_JOB_POL_BASIC.
-typedef struct zx_policy_basic {
+// Timer slack policy topic.
+#define ZX_JOB_POL_TIMER_SLACK                  1u
+
+// Input structure to use with ZX_JOB_POL_BASIC_V1.
+typedef struct zx_policy_basic_v1 {
     uint32_t condition;
     uint32_t policy;
-} zx_policy_basic_t;
+} zx_policy_basic_v1_t;
+
+// Input structure to use with ZX_JOB_POL_BASIC_V2.
+typedef struct zx_policy_basic_v2 {
+    uint32_t condition;
+    uint32_t action;
+    uint32_t flags;
+} zx_policy_basic_v2_t;
+
+#define ZX_JOB_POL_BASIC        ZX_JOB_POL_BASIC_V1
+typedef struct zx_policy_basic_v1 zx_policy_basic;
+typedef struct zx_policy_basic_v1 zx_policy_basic_t;
 
 // Conditions handled by job policy.
 #define ZX_POL_BAD_HANDLE                    0u
@@ -40,16 +56,34 @@
 #define ZX_POL_NEW_FIFO                     10u
 #define ZX_POL_NEW_TIMER                    11u
 #define ZX_POL_NEW_PROCESS                  12u
+#define ZX_POL_NEW_PROFILE                  13u
+#define ZX_POL_AMBIENT_MARK_VMO_EXEC        14u
 #ifdef _KERNEL
-#define ZX_POL_MAX                          13u
+#define ZX_POL_MAX                          15u
 #endif
 
 // Policy actions.
-// ZX_POL_ACTION_ALLOW and ZX_POL_ACTION_DENY can be ORed with ZX_POL_ACTION_EXCEPTION.
-// ZX_POL_ACTION_KILL implies ZX_POL_ACTION_DENY.
 #define ZX_POL_ACTION_ALLOW                 0u
 #define ZX_POL_ACTION_DENY                  1u
-#define ZX_POL_ACTION_EXCEPTION             2u
-#define ZX_POL_ACTION_KILL                  5u
+#define ZX_POL_ACTION_ALLOW_EXCEPTION       2u
+#define ZX_POL_ACTION_DENY_EXCEPTION        3u
+#define ZX_POL_ACTION_KILL                  4u
+#ifdef _KERNEL
+#define ZX_POL_ACTION_MAX                   5u
+#endif
+
+// Policy override.
+#define ZX_POL_OVERRIDE_ALLOW               0u
+#define ZX_POL_OVERRIDE_DENY                1u
+
+
+// Input structure to use with ZX_JOB_POL_TIMER_SLACK.
+typedef struct zx_policy_timer_slack {
+    zx_duration_t min_slack;
+    uint32_t default_mode;
+    uint8_t padding1[4];
+} zx_policy_timer_slack_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/port.h b/arch/arm64/sysroot/include/zircon/syscalls/port.h
index 10bc39b..06b3b6a 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/port.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/port.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_PORT_H_
-#define ZIRCON_SYSCALLS_PORT_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PORT_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PORT_H_
 
 #include <zircon/compiler.h>
 #include <zircon/types.h>
@@ -13,140 +13,162 @@
 // clang-format off
 
 // zx_object_wait_async() options
+// Do not use ZX_WAIT_ASYNC_ONCE. It is now superfluous and will be removed.
 #define ZX_WAIT_ASYNC_ONCE          ((uint32_t)0u)
-#define ZX_WAIT_ASYNC_REPEATING     ((uint32_t)1u)
+#define ZX_WAIT_ASYNC_TIMESTAMP     ((uint32_t)1u)
 
 // packet types.  zx_port_packet_t::type
 #define ZX_PKT_TYPE_USER            ((uint8_t)0x00u)
 #define ZX_PKT_TYPE_SIGNAL_ONE      ((uint8_t)0x01u)
-#define ZX_PKT_TYPE_SIGNAL_REP      ((uint8_t)0x02u)
+// 0x02 was previously used for "ZX_PKT_TYPE_SIGNAL_REP".
 #define ZX_PKT_TYPE_GUEST_BELL      ((uint8_t)0x03u)
 #define ZX_PKT_TYPE_GUEST_MEM       ((uint8_t)0x04u)
 #define ZX_PKT_TYPE_GUEST_IO        ((uint8_t)0x05u)
 #define ZX_PKT_TYPE_GUEST_VCPU      ((uint8_t)0x06u)
 #define ZX_PKT_TYPE_INTERRUPT       ((uint8_t)0x07u)
-#define ZX_PKT_TYPE_EXCEPTION(n)    ((uint32_t)(0x08u | (((n) & 0xFFu) << 8)))
+#define ZX_PKT_TYPE_PAGE_REQUEST    ((uint8_t)0x09u)
 
 // For options passed to port_create
 #define ZX_PORT_BIND_TO_INTERRUPT   ((uint32_t)(0x1u << 0))
 
 #define ZX_PKT_TYPE_MASK            ((uint32_t)0x000000FFu)
 
-#define ZX_PKT_IS_USER(type)        ((type) == ZX_PKT_TYPE_USER)
-#define ZX_PKT_IS_SIGNAL_ONE(type)  ((type) == ZX_PKT_TYPE_SIGNAL_ONE)
-#define ZX_PKT_IS_SIGNAL_REP(type)  ((type) == ZX_PKT_TYPE_SIGNAL_REP)
-#define ZX_PKT_IS_GUEST_BELL(type)  ((type) == ZX_PKT_TYPE_GUEST_BELL)
-#define ZX_PKT_IS_GUEST_MEM(type)   ((type) == ZX_PKT_TYPE_GUEST_MEM)
-#define ZX_PKT_IS_GUEST_IO(type)    ((type) == ZX_PKT_TYPE_GUEST_IO)
-#define ZX_PKT_IS_GUEST_VCPU(type)  ((type) == ZX_PKT_TYPE_GUEST_VCPU)
-#define ZX_PKT_IS_INTERRUPT(type)   ((type) == ZX_PKT_TYPE_INTERRUPT)
-#define ZX_PKT_IS_EXCEPTION(type)   (((type) & ZX_PKT_TYPE_MASK) == ZX_PKT_TYPE_EXCEPTION(0))
+#define ZX_PKT_IS_USER(type)          ((type) == ZX_PKT_TYPE_USER)
+#define ZX_PKT_IS_SIGNAL_ONE(type)    ((type) == ZX_PKT_TYPE_SIGNAL_ONE)
+#define ZX_PKT_IS_GUEST_BELL(type)    ((type) == ZX_PKT_TYPE_GUEST_BELL)
+#define ZX_PKT_IS_GUEST_MEM(type)     ((type) == ZX_PKT_TYPE_GUEST_MEM)
+#define ZX_PKT_IS_GUEST_IO(type)      ((type) == ZX_PKT_TYPE_GUEST_IO)
+#define ZX_PKT_IS_GUEST_VCPU(type)    ((type) == ZX_PKT_TYPE_GUEST_VCPU)
+#define ZX_PKT_IS_INTERRUPT(type)     ((type) == ZX_PKT_TYPE_INTERRUPT)
+#define ZX_PKT_IS_PAGE_REQUEST(type)  ((type) == ZX_PKT_TYPE_PAGE_REQUEST)
 
 // zx_packet_guest_vcpu_t::type
 #define ZX_PKT_GUEST_VCPU_INTERRUPT  ((uint8_t)0)
 #define ZX_PKT_GUEST_VCPU_STARTUP    ((uint8_t)1)
+
+// zx_packet_page_request_t::command
+#define ZX_PAGER_VMO_READ ((uint16_t) 0)
+#define ZX_PAGER_VMO_COMPLETE ((uint16_t) 1)
 // clang-format on
 
 // port_packet_t::type ZX_PKT_TYPE_USER.
 typedef union zx_packet_user {
-    uint64_t u64[4];
-    uint32_t u32[8];
-    uint16_t u16[16];
-    uint8_t c8[32];
+  uint64_t u64[4];
+  uint32_t u32[8];
+  uint16_t u16[16];
+  uint8_t c8[32];
 } zx_packet_user_t;
 
-// port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE and ZX_PKT_TYPE_SIGNAL_REP.
+// port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE.
 typedef struct zx_packet_signal {
-    zx_signals_t trigger;
-    zx_signals_t observed;
-    uint64_t count;
-    uint64_t reserved0;
-    uint64_t reserved1;
+  zx_signals_t trigger;
+  zx_signals_t observed;
+  uint64_t count;
+  uint64_t timestamp;
+  uint64_t reserved1;
 } zx_packet_signal_t;
 
-typedef struct zx_packet_exception {
-    uint64_t pid;
-    uint64_t tid;
-    uint64_t reserved0;
-    uint64_t reserved1;
-} zx_packet_exception_t;
-
 typedef struct zx_packet_guest_bell {
-    zx_gpaddr_t addr;
-    uint64_t reserved0;
-    uint64_t reserved1;
-    uint64_t reserved2;
+  zx_gpaddr_t addr;
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_guest_bell_t;
 
 typedef struct zx_packet_guest_mem {
-    zx_gpaddr_t addr;
+  zx_gpaddr_t addr;
 #if __aarch64__
-    uint8_t access_size;
-    bool sign_extend;
-    uint8_t xt;
-    bool read;
-    uint64_t data;
-    uint64_t reserved;
+  uint8_t access_size;
+  bool sign_extend;
+  uint8_t xt;
+  bool read;
+  uint8_t padding1[4];
+  uint64_t data;
+  uint64_t reserved;
 #elif __x86_64__
 // NOTE: x86 instructions are guaranteed to be 15 bytes or fewer.
 #define X86_MAX_INST_LEN 15u
-    uint8_t inst_len;
-    uint8_t inst_buf[X86_MAX_INST_LEN];
-    uint8_t default_operand_size;
-    uint8_t reserved[7];
+  uint8_t inst_len;
+  uint8_t inst_buf[X86_MAX_INST_LEN];
+  // This is the default operand size as determined by the CS and EFER register (Volume 3,
+  // Section 5.2.1). If operating in 64-bit mode then near branches and all instructions, except
+  // far branches, that implicitly reference the RSP will actually have a default operand size of
+  // 64-bits (Volume 2, Section 2.2.1.7), and not the 32-bits that will be given here.
+  uint8_t default_operand_size;
+  uint8_t reserved[7];
 #endif
 } zx_packet_guest_mem_t;
 
 typedef struct zx_packet_guest_io {
-    uint16_t port;
-    uint8_t access_size;
-    bool input;
-    union {
-        uint8_t u8;
-        uint16_t u16;
-        uint32_t u32;
-        uint8_t data[4];
+  uint16_t port;
+  uint8_t access_size;
+  bool input;
+  union {
+    struct {
+      uint8_t u8;
+      uint8_t padding1[3];
     };
-    uint64_t reserved0;
-    uint64_t reserved1;
-    uint64_t reserved2;
+    struct {
+      uint16_t u16;
+      uint8_t padding2[2];
+    };
+    uint32_t u32;
+    uint8_t data[4];
+  };
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_guest_io_t;
 
 typedef struct zx_packet_guest_vcpu {
-    union {
-        struct {
-            uint64_t mask;
-            uint8_t vector;
-        } interrupt;
-        struct {
-            uint64_t id;
-            zx_gpaddr_t entry;
-        } startup;
-    };
-    uint8_t type;
-    uint64_t reserved;
+  union {
+    struct {
+      uint64_t mask;
+      uint8_t vector;
+      uint8_t padding1[7];
+    } interrupt;
+    struct {
+      uint64_t id;
+      zx_gpaddr_t entry;
+    } startup;
+  };
+  uint8_t type;
+  uint8_t padding1[7];
+  uint64_t reserved;
 } zx_packet_guest_vcpu_t;
 
 typedef struct zx_packet_interrupt {
-    zx_time_t timestamp;
+  zx_time_t timestamp;
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_interrupt_t;
 
+typedef struct zx_packet_page_request {
+  uint16_t command;
+  uint16_t flags;
+  uint32_t reserved0;
+  uint64_t offset;
+  uint64_t length;
+  uint64_t reserved1;
+} zx_packet_page_request_t;
+
 typedef struct zx_port_packet {
-    uint64_t key;
-    uint32_t type;
-    int32_t status;
-    union {
-        zx_packet_user_t user;
-        zx_packet_signal_t signal;
-        zx_packet_exception_t exception;
-        zx_packet_guest_bell_t guest_bell;
-        zx_packet_guest_mem_t guest_mem;
-        zx_packet_guest_io_t guest_io;
-        zx_packet_guest_vcpu_t guest_vcpu;
-        zx_packet_interrupt_t interrupt;
-    };
+  uint64_t key;
+  uint32_t type;
+  zx_status_t status;
+  union {
+    zx_packet_user_t user;
+    zx_packet_signal_t signal;
+    zx_packet_guest_bell_t guest_bell;
+    zx_packet_guest_mem_t guest_mem;
+    zx_packet_guest_io_t guest_io;
+    zx_packet_guest_vcpu_t guest_vcpu;
+    zx_packet_interrupt_t interrupt;
+    zx_packet_page_request_t page_request;
+  };
 } zx_port_packet_t;
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_PORT_H_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PORT_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/profile.h b/arch/arm64/sysroot/include/zircon/syscalls/profile.h
index 10ed499..5abf561 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/profile.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/profile.h
@@ -2,36 +2,48 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
 
+#include <zircon/syscalls/scheduler.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
-// ask clang format not to mess up the indentation:
-// clang-format off
+#define ZX_PRIORITY_LOWEST 0
+#define ZX_PRIORITY_LOW 8
+#define ZX_PRIORITY_DEFAULT 16
+#define ZX_PRIORITY_HIGH 24
+#define ZX_PRIORITY_HIGHEST 31
 
-#define ZX_PROFILE_INFO_SCHEDULER   1
-
-typedef struct zx_profile_scheduler {
-    int32_t priority;
-    uint32_t boost;
-    uint32_t deboost;
-    uint32_t quantum;
-} zx_profile_scheduler_t;
-
-#define ZX_PRIORITY_LOWEST              0
-#define ZX_PRIORITY_LOW                 8
-#define ZX_PRIORITY_DEFAULT             16
-#define ZX_PRIORITY_HIGH                24
-#define ZX_PRIORITY_HIGHEST             31
+#define ZX_PROFILE_INFO_FLAG_PRIORITY (1 << 0)
+#define ZX_PROFILE_INFO_FLAG_CPU_MASK (1 << 1)
+#define ZX_PROFILE_INFO_FLAG_DEADLINE (1 << 2)
 
 typedef struct zx_profile_info {
-    uint32_t type;                  // one of ZX_PROFILE_INFO_
-    union {
-        zx_profile_scheduler_t scheduler;
+  // A bitmask of ZX_PROFILE_INFO_FLAG_* values. Specifies which fields
+  // below have been specified. Other fields are considered unset.
+  uint32_t flags;
+
+  uint8_t padding1[4];
+
+  union {
+    struct {
+      // Scheduling priority. |flags| must have ZX_PROFILE_INFO_FLAG_PRIORITY set.
+      int32_t priority;
+
+      uint8_t padding2[20];
     };
+
+    // Scheduling deadline. |flags| must have ZX_PROFILE_INFO_FLAG_DEADLINE set.
+    zx_sched_deadline_params_t deadline_params;
+  };
+
+  // CPUs that threads may be scheduled on. |flags| must have
+  // ZX_PROFILE_INFO_FLAG_CPU_MASK set.
+  zx_cpu_set_t cpu_affinity_mask;
 } zx_profile_info_t;
 
-
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/resource.h b/arch/arm64/sysroot/include/zircon/syscalls/resource.h
index 6defbda..9243d17 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/resource.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/resource.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
+#define SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
 
 #include <stdint.h>
-
 #include <zircon/compiler.h>
 
 // Resources that require a region allocator to handle exclusive reservations
@@ -14,21 +14,23 @@
 // bookkeeping. It's important that ZX_RSRC_KIND_COUNT is defined for each
 // architecture to properly allocate only the bookkeeping necessary.
 //
-// TODO(ZX-2419): Don't expose ZX_RSRC_KIND_COUNT to userspace
+// TODO(fxbug.dev/32272): Don't expose ZX_RSRC_KIND_COUNT to userspace
 
 typedef uint32_t zx_rsrc_kind_t;
-#define ZX_RSRC_KIND_MMIO           ((zx_rsrc_kind_t)0u)
-#define ZX_RSRC_KIND_IRQ            ((zx_rsrc_kind_t)1u)
-#define ZX_RSRC_KIND_IOPORT         ((zx_rsrc_kind_t)2u)
-#define ZX_RSRC_KIND_HYPERVISOR     ((zx_rsrc_kind_t)3u)
-#define ZX_RSRC_KIND_ROOT           ((zx_rsrc_kind_t)4u)
-#define ZX_RSRC_KIND_VMEX           ((zx_rsrc_kind_t)5u)
-#define ZX_RSRC_KIND_SMC            ((zx_rsrc_kind_t)6u)
-#define ZX_RSRC_KIND_COUNT          ((zx_rsrc_kind_t)7u)
+#define ZX_RSRC_KIND_MMIO ((zx_rsrc_kind_t)0u)
+#define ZX_RSRC_KIND_IRQ ((zx_rsrc_kind_t)1u)
+#define ZX_RSRC_KIND_IOPORT ((zx_rsrc_kind_t)2u)
+#define ZX_RSRC_KIND_HYPERVISOR ((zx_rsrc_kind_t)3u)
+#define ZX_RSRC_KIND_ROOT ((zx_rsrc_kind_t)4u)
+#define ZX_RSRC_KIND_VMEX ((zx_rsrc_kind_t)5u)
+#define ZX_RSRC_KIND_SMC ((zx_rsrc_kind_t)6u)
+#define ZX_RSRC_KIND_COUNT ((zx_rsrc_kind_t)7u)
 
 typedef uint32_t zx_rsrc_flags_t;
-#define ZX_RSRC_FLAG_EXCLUSIVE      ((zx_rsrc_flags_t)0x00010000u)
-#define ZX_RSRC_FLAGS_MASK          ((zx_rsrc_flags_t)ZX_RSRC_FLAG_EXCLUSIVE)
+#define ZX_RSRC_FLAG_EXCLUSIVE ((zx_rsrc_flags_t)0x00010000u)
+#define ZX_RSRC_FLAGS_MASK ((zx_rsrc_flags_t)ZX_RSRC_FLAG_EXCLUSIVE)
 
-#define ZX_RSRC_EXTRACT_KIND(x)     ((x) & 0x0000FFFF)
-#define ZX_RSRC_EXTRACT_FLAGS(x)    ((x) & 0xFFFF0000)
+#define ZX_RSRC_EXTRACT_KIND(x) ((x)&0x0000FFFF)
+#define ZX_RSRC_EXTRACT_FLAGS(x) ((x)&0xFFFF0000)
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/scheduler.h b/arch/arm64/sysroot/include/zircon/syscalls/scheduler.h
new file mode 100644
index 0000000..c119562
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/syscalls/scheduler.h
@@ -0,0 +1,36 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
+
+#include <zircon/compiler.h>
+#include <zircon/time.h>
+
+__BEGIN_CDECLS
+
+// Parameters for deadline scheduler profiles.
+//
+// At minimum, the following relation must hold:
+//
+//   0 < capacity <= relative_deadline <= period
+//
+// Additional restrictions on the range and granularity of the parameters may be
+// enforced, which can vary from system to system.
+//
+typedef struct zx_sched_deadline_params {
+  // The worst case execution time of the deadline work per interarrival period.
+  zx_duration_t capacity;
+
+  // The worst case finish time of the deadline work, relative to the beginning
+  // of the current interarrival period.
+  zx_duration_t relative_deadline;
+
+  // The worst case interarrival period of the deadline work.
+  zx_duration_t period;
+} zx_sched_deadline_params_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/smc.h b/arch/arm64/sysroot/include/zircon/syscalls/smc.h
index 5c8f9ba..93f1761 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/smc.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/smc.h
@@ -2,37 +2,46 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SMC_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SMC_H_
 
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
+// Silicon Partner.
+#define ARM_SMC_SERVICE_CALL_NUM_SIP_SERVICE_BASE 0x02
+#define ARM_SMC_SERVICE_CALL_NUM_SIP_SERVICE_LENGTH 0x01
 #define ARM_SMC_SERVICE_CALL_NUM_TRUSTED_OS_BASE 0x32
 #define ARM_SMC_SERVICE_CALL_NUM_TRUSTED_OS_LENGTH 0xE
 #define ARM_SMC_SERVICE_CALL_NUM_MAX 0x3F
 #define ARM_SMC_SERVICE_CALL_NUM_MASK 0x3F
 #define ARM_SMC_SERVICE_CALL_NUM_SHIFT 24
 #define ARM_SMC_GET_SERVICE_CALL_NUM_FROM_FUNC_ID(func_id) \
-    (((func_id) >> ARM_SMC_SERVICE_CALL_NUM_SHIFT) & ARM_SMC_SERVICE_CALL_NUM_MASK)
+  (((func_id) >> ARM_SMC_SERVICE_CALL_NUM_SHIFT) & ARM_SMC_SERVICE_CALL_NUM_MASK)
 
 typedef struct zx_smc_parameters {
-    uint32_t func_id;
-    uint64_t arg1;
-    uint64_t arg2;
-    uint64_t arg3;
-    uint64_t arg4;
-    uint64_t arg5;
-    uint64_t arg6;
-    uint16_t client_id;
-    uint16_t secure_os_id;
+  uint32_t func_id;
+  uint8_t padding1[4];
+  uint64_t arg1;
+  uint64_t arg2;
+  uint64_t arg3;
+  uint64_t arg4;
+  uint64_t arg5;
+  uint64_t arg6;
+  uint16_t client_id;
+  uint16_t secure_os_id;
+  uint8_t padding2[4];
 } zx_smc_parameters_t;
 
 typedef struct zx_smc_result {
-    uint64_t arg0;
-    uint64_t arg1;
-    uint64_t arg2;
-    uint64_t arg3;
+  uint64_t arg0;
+  uint64_t arg1;
+  uint64_t arg2;
+  uint64_t arg3;
+  uint64_t arg6;  // at least one implementation uses it as a way to return session_id.
 } zx_smc_result_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SMC_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/system.h b/arch/arm64/sysroot/include/zircon/syscalls/system.h
index c58de1d..b54d443 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/system.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/system.h
@@ -2,36 +2,43 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
 
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
 // Commands used by zx_system_powerctl()
-#define ZX_SYSTEM_POWERCTL_ENABLE_ALL_CPUS              1u
+#define ZX_SYSTEM_POWERCTL_ENABLE_ALL_CPUS 1u
 #define ZX_SYSTEM_POWERCTL_DISABLE_ALL_CPUS_BUT_PRIMARY 2u
-#define ZX_SYSTEM_POWERCTL_ACPI_TRANSITION_S_STATE      3u
-#define ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1              4u
-#define ZX_SYSTEM_POWERCTL_REBOOT                       5u
-#define ZX_SYSTEM_POWERCTL_REBOOT_BOOTLOADER            6u
-#define ZX_SYSTEM_POWERCTL_REBOOT_RECOVERY              7u
-#define ZX_SYSTEM_POWERCTL_SHUTDOWN                     8u
+#define ZX_SYSTEM_POWERCTL_ACPI_TRANSITION_S_STATE 3u
+#define ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1 4u
+#define ZX_SYSTEM_POWERCTL_REBOOT 5u
+#define ZX_SYSTEM_POWERCTL_REBOOT_BOOTLOADER 6u
+#define ZX_SYSTEM_POWERCTL_REBOOT_RECOVERY 7u
+#define ZX_SYSTEM_POWERCTL_SHUTDOWN 8u
 
 typedef struct zx_system_powerctl_arg {
-    union {
-        struct {
-            uint8_t target_s_state; // Value between 1 and 5 indicating which S-state
-            uint8_t sleep_type_a; // Value from ACPI VM (SLP_TYPa)
-            uint8_t sleep_type_b; // Value from ACPI VM (SLP_TYPb)
-        } acpi_transition_s_state;
-        struct {
-            uint32_t power_limit; // PL1 value in milliwatts
-            uint32_t time_window; // PL1 time window in microseconds
-            uint8_t clamp;        // PL1 clamping enable
-            uint8_t enable;       // PL1 enable
-        } x86_power_limit;
+  union {
+    struct {
+      struct {
+        uint8_t target_s_state;  // Value between 1 and 5 indicating which S-state
+        uint8_t sleep_type_a;    // Value from ACPI VM (SLP_TYPa)
+        uint8_t sleep_type_b;    // Value from ACPI VM (SLP_TYPb)
+      } acpi_transition_s_state;
+      uint8_t padding1[9];
     };
+    struct {
+      uint32_t power_limit;  // PL1 value in milliwatts
+      uint32_t time_window;  // PL1 time window in microseconds
+      uint8_t clamp;         // PL1 clamping enable
+      uint8_t enable;        // PL1 enable
+      uint8_t padding2[2];
+    } x86_power_limit;
+  };
 } zx_system_powerctl_arg_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
diff --git a/arch/arm64/sysroot/include/zircon/syscalls/types.h b/arch/arm64/sysroot/include/zircon/syscalls/types.h
index a5a69c8..b7910f2 100644
--- a/arch/arm64/sysroot/include/zircon/syscalls/types.h
+++ b/arch/arm64/sysroot/include/zircon/syscalls/types.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
+#define SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
 
 #include <zircon/compiler.h>
 
@@ -20,3 +21,5 @@
 typedef struct zx_smc_result zx_smc_result_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
diff --git a/arch/arm64/sysroot/include/zircon/testonly-syscalls.h b/arch/arm64/sysroot/include/zircon/testonly-syscalls.h
new file mode 100644
index 0000000..d994d86
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/testonly-syscalls.h
@@ -0,0 +1,30 @@
+// Copyright 2020 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.
+
+#ifndef SYSROOT_ZIRCON_TESTONLY_SYSCALLS_H_
+#define SYSROOT_ZIRCON_TESTONLY_SYSCALLS_H_
+
+#include <zircon/syscalls.h>
+
+__BEGIN_CDECLS
+
+// Make sure this matches <zircon/syscalls.h>.
+#define _ZX_SYSCALL_DECL(name, type, attrs, nargs, arglist, prototype) \
+  extern attrs type zx_##name prototype;                               \
+  extern attrs type _zx_##name prototype;
+
+#ifdef __clang__
+#define _ZX_SYSCALL_ANNO(attr) __attribute__((attr))
+#else
+#define _ZX_SYSCALL_ANNO(attr)  // Nothing for compilers without the support.
+#endif
+
+#include <zircon/syscalls/internal/testonly-cdecls.inc>
+
+#undef _ZX_SYSCALL_ANNO
+#undef _ZX_SYSCALL_DECL
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_ONLY_SYSCALLS_H_
diff --git a/arch/arm64/sysroot/include/zircon/threads.h b/arch/arm64/sysroot/include/zircon/threads.h
index 937a9f9..2cfdd7e 100644
--- a/arch/arm64/sysroot/include/zircon/threads.h
+++ b/arch/arm64/sysroot/include/zircon/threads.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_THREADS_H_
+#define SYSROOT_ZIRCON_THREADS_H_
 
 #include <threads.h>
 #include <zircon/compiler.h>
@@ -19,19 +20,37 @@
 
 // Converts a threads.h-style status value to an |zx_status_t|.
 static inline zx_status_t __PURE thrd_status_to_zx_status(int thrd_status) {
-    switch (thrd_status) {
+  switch (thrd_status) {
     case thrd_success:
-        return ZX_OK;
+      return ZX_OK;
     case thrd_nomem:
-        return ZX_ERR_NO_MEMORY;
+      return ZX_ERR_NO_MEMORY;
     case thrd_timedout:
-        return ZX_ERR_TIMED_OUT;
+      return ZX_ERR_TIMED_OUT;
     case thrd_busy:
-        return ZX_ERR_SHOULD_WAIT;
+      return ZX_ERR_SHOULD_WAIT;
     default:
     case thrd_error:
-        return ZX_ERR_INTERNAL;
-    }
+      return ZX_ERR_INTERNAL;
+  }
 }
 
 __END_CDECLS
+
+#ifdef __cplusplus
+
+#if __has_include(<thread>)
+
+#include <thread>
+
+// Get the zx_handle_t corresponding to the std::thread::native_handle() value.
+// See `thrd_get_zx_handle` (above) for constraints on the returned handle.
+// Using this API avoids any assumptions about std::thread::native_handle_type
+// corresponding exactly to thrd_t or any other particular type.
+zx_handle_t native_thread_get_zx_handle(std::thread::native_handle_type);
+
+#endif  // __has_include(<thread>)
+
+#endif  // __cplusplus
+
+#endif  // SYSROOT_ZIRCON_THREADS_H_
diff --git a/arch/arm64/sysroot/include/zircon/time.h b/arch/arm64/sysroot/include/zircon/time.h
index a075d89..33f5452 100644
--- a/arch/arm64/sysroot/include/zircon/time.h
+++ b/arch/arm64/sysroot/include/zircon/time.h
@@ -1,96 +1,184 @@
-// Copyright 2018 The Fuchsia Authors
-//
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file or at
-// https://opensource.org/licenses/MIT
+// 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.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_TIME_H_
+#define SYSROOT_ZIRCON_TIME_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
-#include <zircon/types.h>
 
-// These functions perform overflow-safe time arithmetic, clamping to ZX_TIME_INFINITE in case of
-// overflow and ZX_TIME_INFINITE_PAST in case of underflow.
+#if __has_include(<time.h>)
+#include <time.h>
+#endif
+
+__BEGIN_CDECLS
+
+// absolute time in nanoseconds (generally with respect to the monotonic clock)
+typedef int64_t zx_time_t;
+// a duration in nanoseconds
+typedef int64_t zx_duration_t;
+// a duration in hardware ticks
+typedef int64_t zx_ticks_t;
+
+#define ZX_TIME_INFINITE INT64_MAX
+#define ZX_TIME_INFINITE_PAST INT64_MIN
+
+// These functions perform overflow-safe time arithmetic and unit conversion, clamping to
+// ZX_TIME_INFINITE in case of overflow and ZX_TIME_INFINITE_PAST in case of underflow.
 //
 // C++ code should use zx::time and zx::duration instead.
 //
-// The naming scheme is zx_<first argument>_<operation>_<second argument>.
+// For arithmetic the naming scheme is:
+//     zx_<first argument>_<operation>_<second argument>
 //
-// TODO(maniscalco): Consider expanding the set of operations to include division, modulo, unit
-// conversion, and floating point math.
+// For unit conversion the naming scheme is:
+//     zx_duration_from_<unit of argument>
+//
+// TODO(maniscalco): Consider expanding the set of operations to include division, modulo, and
+// floating point math.
 
 __CONSTEXPR static inline zx_time_t zx_time_add_duration(zx_time_t time, zx_duration_t duration) {
-    zx_time_t x = 0;
-    if (unlikely(add_overflow(time, duration, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_time_t x = 0;
+  if (unlikely(add_overflow(time, duration, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_time_t zx_time_sub_duration(zx_time_t time, zx_duration_t duration) {
-    zx_time_t x = 0;
-    if (unlikely(sub_overflow(time, duration, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
-
+  zx_time_t x = 0;
+  if (unlikely(sub_overflow(time, duration, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_time_sub_time(zx_time_t time1, zx_time_t time2) {
-    zx_duration_t x = 0;
-    if (unlikely(sub_overflow(time1, time2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(sub_overflow(time1, time2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_add_duration(zx_duration_t dur1,
                                                                  zx_duration_t dur2) {
-    zx_duration_t x = 0;
-    if (unlikely(add_overflow(dur1, dur2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(add_overflow(dur1, dur2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_sub_duration(zx_duration_t dur1,
                                                                  zx_duration_t dur2) {
-    zx_duration_t x = 0;
-    if (unlikely(sub_overflow(dur1, dur2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(sub_overflow(dur1, dur2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_mul_int64(zx_duration_t duration,
                                                               int64_t multiplier) {
-    zx_duration_t x = 0;
-    if (unlikely(mul_overflow(duration, multiplier, &x))) {
-        if ((duration > 0 && multiplier > 0) || (duration < 0 && multiplier < 0)) {
-            return ZX_TIME_INFINITE;
-        } else {
-            return ZX_TIME_INFINITE_PAST;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(mul_overflow(duration, multiplier, &x))) {
+    if ((duration > 0 && multiplier > 0) || (duration < 0 && multiplier < 0)) {
+      return ZX_TIME_INFINITE;
+    } else {
+      return ZX_TIME_INFINITE_PAST;
     }
-    return x;
+  }
+  return x;
 }
+
+__CONSTEXPR static inline int64_t zx_nsec_from_duration(zx_duration_t n) { return n; }
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_nsec(int64_t n) {
+  return zx_duration_mul_int64(1, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_usec(int64_t n) {
+  return zx_duration_mul_int64(1000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_msec(int64_t n) {
+  return zx_duration_mul_int64(1000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_sec(int64_t n) {
+  return zx_duration_mul_int64(1000000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_min(int64_t n) {
+  return zx_duration_mul_int64(60000000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_hour(int64_t n) {
+  return zx_duration_mul_int64(3600000000000, n);
+}
+
+#if __has_include(<time.h>)
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_timespec(struct timespec ts) {
+  return zx_duration_add_duration(zx_duration_from_sec(ts.tv_sec),
+                                  zx_duration_from_nsec(ts.tv_nsec));
+}
+
+__CONSTEXPR static inline struct timespec zx_timespec_from_duration(zx_duration_t duration) {
+  const struct timespec ts = {
+      (time_t)(duration / 1000000000),
+      (long int)(duration % 1000000000),
+  };
+  return ts;
+}
+
+__CONSTEXPR static inline zx_time_t zx_time_from_timespec(struct timespec ts) {
+  // implicit converstion of the return type (zx_time_t and zx_duration_t are the same)
+  return zx_duration_from_timespec(ts);
+}
+
+__CONSTEXPR static inline struct timespec zx_timespec_from_time(zx_time_t time) {
+  // implicit conversion of the parameter type (zx_time_t and zx_duration_t are the same)
+  return zx_timespec_from_duration(time);
+}
+
+#endif  // __has_include(<time.h>)
+
+// Similar to the functions above, these macros perform overflow-safe unit conversion. Prefer to use
+// the functions above instead of these macros.
+#define ZX_NSEC(n) (__ISCONSTANT(n) ? ((zx_duration_t)(1LL * (n))) : (zx_duration_from_nsec(n)))
+#define ZX_USEC(n) (__ISCONSTANT(n) ? ((zx_duration_t)(1000LL * (n))) : (zx_duration_from_usec(n)))
+#define ZX_MSEC(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(1000000LL * (n))) : (zx_duration_from_msec(n)))
+#define ZX_SEC(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(1000000000LL * (n))) : (zx_duration_from_sec(n)))
+#define ZX_MIN(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(60LL * 1000000000LL * (n))) : (zx_duration_from_min(n)))
+#define ZX_HOUR(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(3600LL * 1000000000LL * (n))) : (zx_duration_from_hour(n)))
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_TIME_H_
diff --git a/arch/arm64/sysroot/include/zircon/tls.h b/arch/arm64/sysroot/include/zircon/tls.h
index acacef1..91a6f43 100644
--- a/arch/arm64/sysroot/include/zircon/tls.h
+++ b/arch/arm64/sysroot/include/zircon/tls.h
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_TLS_
-#define ZIRCON_TLS_
+#ifndef SYSROOT_ZIRCON_TLS_
+#define SYSROOT_ZIRCON_TLS_
 
 // These constants are part of the C/C++ ABI known to compilers for
 // *-fuchsia targets.  These are offsets from the thread pointer.
 
 // This file must be includable in assembly files.
 
-#if defined(__x86_64__)
+#if defined(__x86_64__) || defined(__i386__)
 
-#define ZX_TLS_STACK_GUARD_OFFSET       0x10
-#define ZX_TLS_UNSAFE_SP_OFFSET         0x18
+#define ZX_TLS_STACK_GUARD_OFFSET 0x10
+#define ZX_TLS_UNSAFE_SP_OFFSET 0x18
 
 #elif defined(__aarch64__)
 
-#define ZX_TLS_STACK_GUARD_OFFSET       (-0x10)
-#define ZX_TLS_UNSAFE_SP_OFFSET         (-0x8)
+#define ZX_TLS_STACK_GUARD_OFFSET (-0x10)
+#define ZX_TLS_UNSAFE_SP_OFFSET (-0x8)
 
 #else
 
@@ -26,4 +26,4 @@
 
 #endif
 
-#endif // ZIRCON_TLS_
+#endif  // SYSROOT_ZIRCON_TLS_
diff --git a/arch/arm64/sysroot/include/zircon/types.h b/arch/arm64/sysroot/include/zircon/types.h
index 6f93626..5832d95 100644
--- a/arch/arm64/sysroot/include/zircon/types.h
+++ b/arch/arm64/sysroot/include/zircon/types.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_TYPES_H_
-#define ZIRCON_TYPES_H_
+#ifndef SYSROOT_ZIRCON_TYPES_H_
+#define SYSROOT_ZIRCON_TYPES_H_
 
 #include <stdbool.h>
 #include <stddef.h>
@@ -12,6 +12,7 @@
 #include <zircon/errors.h>
 #include <zircon/limits.h>
 #include <zircon/rights.h>
+#include <zircon/time.h>
 
 #ifndef __cplusplus
 #ifndef _KERNEL
@@ -33,26 +34,12 @@
 
 typedef uint32_t zx_handle_t;
 
-#define ZX_HANDLE_INVALID         ((zx_handle_t)0)
+#define ZX_HANDLE_INVALID           ((zx_handle_t)0)
+#define ZX_HANDLE_FIXED_BITS_MASK   ((zx_handle_t)0x3)
 
 // See errors.h for the values zx_status_t can take.
 typedef int32_t zx_status_t;
 
-// absolute time in nanoseconds (generally with respect to the monotonic clock)
-typedef int64_t zx_time_t;
-// a duration in nanoseconds
-typedef int64_t zx_duration_t;
-// a duration in hardware ticks
-typedef uint64_t zx_ticks_t;
-#define ZX_TIME_INFINITE INT64_MAX
-#define ZX_TIME_INFINITE_PAST INT64_MIN
-#define ZX_NSEC(n) ((zx_duration_t)(1LL * (n)))
-#define ZX_USEC(n) ((zx_duration_t)(1000LL * (n)))
-#define ZX_MSEC(n) ((zx_duration_t)(1000000LL * (n)))
-#define ZX_SEC(n)  ((zx_duration_t)(1000000000LL * (n)))
-#define ZX_MIN(n)  (ZX_SEC(n) * 60LL)
-#define ZX_HOUR(n) (ZX_MIN(n) * 60LL)
-
 // clock ids
 typedef uint32_t zx_clock_t;
 #define ZX_CLOCK_MONOTONIC        ((zx_clock_t)0)
@@ -107,7 +94,7 @@
 #define ZX_USER_SIGNAL_6            ((zx_signals_t)1u << 30)
 #define ZX_USER_SIGNAL_7            ((zx_signals_t)1u << 31)
 
-// Cancelation (handle was closed while waiting with it)
+// Cancellation (handle was closed while waiting with it)
 #define ZX_SIGNAL_HANDLE_CLOSED     __ZX_OBJECT_HANDLE_CLOSED
 
 // Event
@@ -124,22 +111,18 @@
 #define ZX_CHANNEL_WRITABLE         __ZX_OBJECT_WRITABLE
 #define ZX_CHANNEL_PEER_CLOSED      __ZX_OBJECT_PEER_CLOSED
 
+// Clock
+#define ZX_CLOCK_STARTED            __ZX_OBJECT_SIGNAL_4
+
 // Socket
 #define ZX_SOCKET_READABLE            __ZX_OBJECT_READABLE
 #define ZX_SOCKET_WRITABLE            __ZX_OBJECT_WRITABLE
 #define ZX_SOCKET_PEER_CLOSED         __ZX_OBJECT_PEER_CLOSED
 #define ZX_SOCKET_PEER_WRITE_DISABLED __ZX_OBJECT_SIGNAL_4
 #define ZX_SOCKET_WRITE_DISABLED      __ZX_OBJECT_SIGNAL_5
-#define ZX_SOCKET_CONTROL_READABLE    __ZX_OBJECT_SIGNAL_6
-#define ZX_SOCKET_CONTROL_WRITABLE    __ZX_OBJECT_SIGNAL_7
-#define ZX_SOCKET_ACCEPT              __ZX_OBJECT_SIGNAL_8
-#define ZX_SOCKET_SHARE               __ZX_OBJECT_SIGNAL_9
 #define ZX_SOCKET_READ_THRESHOLD      __ZX_OBJECT_SIGNAL_10
 #define ZX_SOCKET_WRITE_THRESHOLD     __ZX_OBJECT_SIGNAL_11
 
-// Deprecated
-#define ZX_SOCKET_READ_DISABLED       ZX_SOCKET_PEER_WRITE_DISABLED
-
 // Fifo
 #define ZX_FIFO_READABLE            __ZX_OBJECT_READABLE
 #define ZX_FIFO_WRITABLE            __ZX_OBJECT_WRITABLE
@@ -149,8 +132,9 @@
 #define ZX_TASK_TERMINATED          __ZX_OBJECT_SIGNALED
 
 // Job
-#define ZX_JOB_NO_PROCESSES         __ZX_OBJECT_SIGNALED
+#define ZX_JOB_TERMINATED           __ZX_OBJECT_SIGNALED
 #define ZX_JOB_NO_JOBS              __ZX_OBJECT_SIGNAL_4
+#define ZX_JOB_NO_PROCESSES         __ZX_OBJECT_SIGNAL_5
 
 // Process
 #define ZX_PROCESS_TERMINATED       __ZX_OBJECT_SIGNALED
@@ -173,28 +157,15 @@
 // global kernel object id.
 // Note: kernel object ids use 63 bits, with the most significant bit being zero.
 // The remaining values (msb==1) are for use by programs and tools that wish to
-// create koids for artificial objets.
+// create koids for artificial objects.
 typedef uint64_t zx_koid_t;
 #define ZX_KOID_INVALID ((uint64_t) 0)
 #define ZX_KOID_KERNEL  ((uint64_t) 1)
-
-// Transaction ID and argument types for zx_channel_call.
-typedef uint32_t zx_txid_t;
-
-typedef struct zx_channel_call_args {
-    const void* wr_bytes;
-    const zx_handle_t* wr_handles;
-    void *rd_bytes;
-    zx_handle_t* rd_handles;
-    uint32_t wr_num_bytes;
-    uint32_t wr_num_handles;
-    uint32_t rd_num_bytes;
-    uint32_t rd_num_handles;
-} zx_channel_call_args_t;
+// The first non-reserved koid. The first 1024 are reserved.
+#define ZX_KOID_FIRST   ((uint64_t) 1024)
 
 // Maximum number of wait items allowed for zx_object_wait_many()
-// TODO(ZX-1349) Re-lower this.
-#define ZX_WAIT_MANY_MAX_ITEMS ((size_t)16)
+#define ZX_WAIT_MANY_MAX_ITEMS ((size_t)64)
 
 // Structure for zx_object_wait_many():
 typedef struct zx_wait_item {
@@ -204,10 +175,11 @@
 } zx_wait_item_t;
 
 // VM Object creation options
-#define ZX_VMO_NON_RESIZABLE             ((uint32_t)1u)
+#define ZX_VMO_RESIZABLE                 ((uint32_t)1u << 1)
 
 // VM Object opcodes
 #define ZX_VMO_OP_COMMIT                 ((uint32_t)1u)
+// Keep value in sync with ZX_VMAR_OP_DECOMMIT.
 #define ZX_VMO_OP_DECOMMIT               ((uint32_t)2u)
 #define ZX_VMO_OP_LOCK                   ((uint32_t)3u)
 #define ZX_VMO_OP_UNLOCK                 ((uint32_t)4u)
@@ -216,10 +188,26 @@
 #define ZX_VMO_OP_CACHE_INVALIDATE       ((uint32_t)7u)
 #define ZX_VMO_OP_CACHE_CLEAN            ((uint32_t)8u)
 #define ZX_VMO_OP_CACHE_CLEAN_INVALIDATE ((uint32_t)9u)
+#define ZX_VMO_OP_ZERO                   ((uint32_t)10u)
+
+// VMAR opcodes
+// Keep value in sync with ZX_VMO_OP_DECOMMIT.
+#define ZX_VMAR_OP_DECOMMIT              ((uint32_t)2u)
+#define ZX_VMAR_OP_MAP_RANGE             ((uint32_t)3u)
+
+// Pager opcodes
+#define ZX_PAGER_OP_FAIL                 ((uint32_t)1u)
 
 // VM Object clone flags
-#define ZX_VMO_CLONE_COPY_ON_WRITE        ((uint32_t)1u << 0)
-#define ZX_VMO_CLONE_NON_RESIZEABLE       ((uint32_t)1u << 1)
+#define ZX_VMO_CHILD_SNAPSHOT             ((uint32_t)1u << 0)
+#define ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_RESIZABLE            ((uint32_t)1u << 2)
+#define ZX_VMO_CHILD_SLICE                ((uint32_t)1u << 3)
+#define ZX_VMO_CHILD_NO_WRITE             ((uint32_t)1u << 5)
+// Old clone flags that are on the path to deprecation.
+#define ZX_VMO_CLONE_COPY_ON_WRITE        ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_COPY_ON_WRITE        ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_PRIVATE_PAGER_COPY   ((uint32_t)1u << 4)
 
 typedef uint32_t zx_vm_option_t;
 // Mapping flags to vmar routines
@@ -235,7 +223,33 @@
 #define ZX_VM_CAN_MAP_EXECUTE       ((zx_vm_option_t)(1u << 9))
 #define ZX_VM_MAP_RANGE             ((zx_vm_option_t)(1u << 10))
 #define ZX_VM_REQUIRE_NON_RESIZABLE ((zx_vm_option_t)(1u << 11))
+#define ZX_VM_ALLOW_FAULTS          ((zx_vm_option_t)(1u << 12))
+#define ZX_VM_OFFSET_IS_UPPER_LIMIT ((zx_vm_option_t)(1u << 13))
 
+#define ZX_VM_ALIGN_BASE            24
+#define ZX_VM_ALIGN_1KB             ((zx_vm_option_t)(10u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2KB             ((zx_vm_option_t)(11u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4KB             ((zx_vm_option_t)(12u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_8KB             ((zx_vm_option_t)(13u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_16KB            ((zx_vm_option_t)(14u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_32KB            ((zx_vm_option_t)(15u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_64KB            ((zx_vm_option_t)(16u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_128KB           ((zx_vm_option_t)(17u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_256KB           ((zx_vm_option_t)(18u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_512KB           ((zx_vm_option_t)(19u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_1MB             ((zx_vm_option_t)(20u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2MB             ((zx_vm_option_t)(21u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4MB             ((zx_vm_option_t)(22u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_8MB             ((zx_vm_option_t)(23u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_16MB            ((zx_vm_option_t)(24u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_32MB            ((zx_vm_option_t)(25u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_64MB            ((zx_vm_option_t)(26u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_128MB           ((zx_vm_option_t)(27u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_256MB           ((zx_vm_option_t)(28u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_512MB           ((zx_vm_option_t)(29u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_1GB             ((zx_vm_option_t)(30u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2GB             ((zx_vm_option_t)(31u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4GB             ((zx_vm_option_t)(32u << ZX_VM_ALIGN_BASE))
 
 // virtual address
 typedef uintptr_t zx_vaddr_t;
@@ -250,14 +264,22 @@
 // offset
 typedef uint64_t zx_off_t;
 
+// vectorized I/O
+typedef struct zx_iovec {
+  void* buffer;
+  size_t capacity;
+} zx_iovec_t;
+
 // Maximum string length for kernel names (process name, thread name, etc)
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
 #define ZX_MAX_NAME_LEN              ((size_t)32u)
 
 // Buffer size limits on the cprng syscalls
 #define ZX_CPRNG_DRAW_MAX_LEN        ((size_t)256u)
 #define ZX_CPRNG_ADD_ENTROPY_MAX_LEN ((size_t)256u)
 
-// interrupt bind flags
+// interrupt_create flags
 #define ZX_INTERRUPT_REMAP_IRQ       ((uint32_t)0x1u)
 #define ZX_INTERRUPT_MODE_DEFAULT    ((uint32_t)0u << 1)
 #define ZX_INTERRUPT_MODE_EDGE_LOW   ((uint32_t)1u << 1)
@@ -268,35 +290,58 @@
 #define ZX_INTERRUPT_MODE_MASK       ((uint32_t)0xe)
 #define ZX_INTERRUPT_VIRTUAL         ((uint32_t)0x10)
 
+// interrupt_bind flags
+#define ZX_INTERRUPT_BIND            ((uint32_t)0x0u)
+#define ZX_INTERRUPT_UNBIND          ((uint32_t)0x1u)
+
 // Preallocated virtual interrupt slot, typically used for signaling interrupt threads to exit.
 #define ZX_INTERRUPT_SLOT_USER              ((uint32_t)62u)
 // interrupt wait slots must be in the range 0 - 62 inclusive
 #define ZX_INTERRUPT_MAX_SLOTS              ((uint32_t)62u)
 
+// msi_create flags
+#define ZX_MSI_MODE_MSI_X                   ((uint32_t)0x1u)
+
 // PCI interrupt handles use interrupt slot 0 for the PCI hardware interrupt
 #define ZX_PCI_INTERRUPT_SLOT               ((uint32_t)0u)
 
 // Channel options and limits.
 #define ZX_CHANNEL_READ_MAY_DISCARD         ((uint32_t)1u)
 
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
 #define ZX_CHANNEL_MAX_MSG_BYTES            ((uint32_t)65536u)
 #define ZX_CHANNEL_MAX_MSG_HANDLES          ((uint32_t)64u)
 
+// Fifo limits.
+#define ZX_FIFO_MAX_SIZE_BYTES              ZX_PAGE_SIZE
+
 // Socket options and limits.
-// These options can be passed to zx_socket_shutdown()
+// These options can be passed to zx_socket_shutdown().
 #define ZX_SOCKET_SHUTDOWN_WRITE            ((uint32_t)1u << 0)
 #define ZX_SOCKET_SHUTDOWN_READ             ((uint32_t)1u << 1)
 #define ZX_SOCKET_SHUTDOWN_MASK             (ZX_SOCKET_SHUTDOWN_WRITE | ZX_SOCKET_SHUTDOWN_READ)
 
-// These can be passed to zx_socket_create()
+// These can be passed to zx_socket_create().
 #define ZX_SOCKET_STREAM                    ((uint32_t)0u)
 #define ZX_SOCKET_DATAGRAM                  ((uint32_t)1u << 0)
-#define ZX_SOCKET_HAS_CONTROL               ((uint32_t)1u << 1)
-#define ZX_SOCKET_HAS_ACCEPT                ((uint32_t)1u << 2)
-#define ZX_SOCKET_CREATE_MASK               (ZX_SOCKET_DATAGRAM | ZX_SOCKET_HAS_CONTROL | ZX_SOCKET_HAS_ACCEPT)
+#define ZX_SOCKET_CREATE_MASK               (ZX_SOCKET_DATAGRAM)
 
-// These can be passed to zx_socket_read() and zx_socket_write().
-#define ZX_SOCKET_CONTROL                   ((uint32_t)1u << 2)
+// These can be passed to zx_socket_read().
+#define ZX_SOCKET_PEEK                      ((uint32_t)1u << 3)
+
+// These can be passed to zx_stream_create().
+#define ZX_STREAM_MODE_READ                 ((uint32_t)1u << 0)
+#define ZX_STREAM_MODE_WRITE                ((uint32_t)1u << 1)
+#define ZX_STREAM_CREATE_MASK               (ZX_STREAM_MODE_READ | ZX_STREAM_MODE_WRITE)
+
+// These can be passed to zx_stream_writev().
+#define ZX_STREAM_APPEND                    ((uint32_t)1u << 0)
+
+typedef uint32_t zx_stream_seek_origin_t;
+#define ZX_STREAM_SEEK_ORIGIN_START      ((zx_stream_seek_origin_t)0u)
+#define ZX_STREAM_SEEK_ORIGIN_CURRENT    ((zx_stream_seek_origin_t)1u)
+#define ZX_STREAM_SEEK_ORIGIN_END        ((zx_stream_seek_origin_t)2u)
 
 // Flags which can be used to to control cache policy for APIs which map memory.
 #define ZX_CACHE_POLICY_CACHED              ((uint32_t)0u)
@@ -316,11 +361,15 @@
 #define ZX_TIMER_SLACK_LATE         ((uint32_t)2u)
 
 // Bus Transaction Initiator options.
-#define ZX_BTI_PERM_READ          ((uint32_t)1u << 0)
-#define ZX_BTI_PERM_WRITE         ((uint32_t)1u << 1)
-#define ZX_BTI_PERM_EXECUTE       ((uint32_t)1u << 2)
-#define ZX_BTI_COMPRESS           ((uint32_t)1u << 3)
-#define ZX_BTI_CONTIGUOUS         ((uint32_t)1u << 4)
+#define ZX_BTI_PERM_READ            ((uint32_t)1u << 0)
+#define ZX_BTI_PERM_WRITE           ((uint32_t)1u << 1)
+#define ZX_BTI_PERM_EXECUTE         ((uint32_t)1u << 2)
+#define ZX_BTI_COMPRESS             ((uint32_t)1u << 3)
+#define ZX_BTI_CONTIGUOUS           ((uint32_t)1u << 4)
+
+// Job options.
+// These options can be passed to zx_job_set_critical().
+#define ZX_JOB_CRITICAL_PROCESS_RETCODE_NONZERO     ((uint32_t)1u << 0)
 
 typedef uint32_t zx_obj_type_t;
 
@@ -349,8 +398,25 @@
 #define ZX_OBJ_TYPE_PMT             ((zx_obj_type_t)26u)
 #define ZX_OBJ_TYPE_SUSPEND_TOKEN   ((zx_obj_type_t)27u)
 #define ZX_OBJ_TYPE_PAGER           ((zx_obj_type_t)28u)
-#define ZX_OBJ_TYPE_LAST            ((zx_obj_type_t)29u)
+#define ZX_OBJ_TYPE_EXCEPTION       ((zx_obj_type_t)29u)
+#define ZX_OBJ_TYPE_CLOCK           ((zx_obj_type_t)30u)
+#define ZX_OBJ_TYPE_STREAM          ((zx_obj_type_t)31u)
+#define ZX_OBJ_TYPE_MSI_ALLOCATION  ((zx_obj_type_t)32u)
+#define ZX_OBJ_TYPE_MSI_INTERRUPT   ((zx_obj_type_t)33u)
 
+// System ABI commits to having no more than 64 object types.
+//
+// See zx_info_process_handle_stats_t for an example of a binary interface that
+// depends on having an upper bound for the number of object types.
+#define ZX_OBJ_TYPE_UPPER_BOUND     ((zx_obj_type_t)64u)
+
+typedef uint32_t zx_system_event_type_t;
+#define ZX_SYSTEM_EVENT_OUT_OF_MEMORY               ((zx_system_event_type_t)1u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_CRITICAL    ((zx_system_event_type_t)2u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_WARNING     ((zx_system_event_type_t)3u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_NORMAL      ((zx_system_event_type_t)4u)
+
+// Used in channel_read_etc.
 typedef struct zx_handle_info {
     zx_handle_t handle;
     zx_obj_type_t type;
@@ -358,6 +424,45 @@
     uint32_t unused;
 } zx_handle_info_t;
 
+typedef uint32_t zx_handle_op_t;
+
+#define ZX_HANDLE_OP_MOVE           ((zx_handle_op_t)0u)
+#define ZX_HANDLE_OP_DUPLICATE      ((zx_handle_op_t)1u)
+
+// Used in channel_write_etc.
+typedef struct zx_handle_disposition {
+    zx_handle_op_t operation;
+    zx_handle_t handle;
+    zx_obj_type_t type;
+    zx_rights_t rights;
+    zx_status_t result;
+} zx_handle_disposition_t;
+
+// Transaction ID and argument types for zx_channel_call.
+typedef uint32_t zx_txid_t;
+
+typedef struct zx_channel_call_args {
+    const void* wr_bytes;
+    const zx_handle_t* wr_handles;
+    void *rd_bytes;
+    zx_handle_t* rd_handles;
+    uint32_t wr_num_bytes;
+    uint32_t wr_num_handles;
+    uint32_t rd_num_bytes;
+    uint32_t rd_num_handles;
+} zx_channel_call_args_t;
+
+typedef struct zx_channel_call_etc_args {
+    const void* wr_bytes;
+    zx_handle_disposition_t* wr_handles;
+    void *rd_bytes;
+    zx_handle_info_t* rd_handles;
+    uint32_t wr_num_bytes;
+    uint32_t wr_num_handles;
+    uint32_t rd_num_bytes;
+    uint32_t rd_num_handles;
+} zx_channel_call_etc_args_t;
+
 // The ZX_VM_FLAG_* constants are to be deprecated in favor of the ZX_VM_*
 // versions.
 #define ZX_VM_FLAG_PERM_READ              ((uint32_t)1u << 0)
@@ -373,6 +478,24 @@
 #define ZX_VM_FLAG_MAP_RANGE              ((uint32_t)1u << 10)
 #define ZX_VM_FLAG_REQUIRE_NON_RESIZABLE  ((uint32_t)1u << 11)
 
+// CPU masks specifying sets of CPUs.
+//
+// We currently are limited to systems with 512 CPUs or less.
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
+#define ZX_CPU_SET_MAX_CPUS 512
+#define ZX_CPU_SET_BITS_PER_WORD 64
+
+typedef struct zx_cpu_set {
+    // The |N|'th CPU is considered in the CPU set if the bit:
+    //
+    //   cpu_mask[N / ZX_CPU_SET_BITS_PER_WORD]
+    //       & (1 << (N % ZX_CPU_SET_BITS_PER_WORD))
+    //
+    // is set.
+    uint64_t mask[ZX_CPU_SET_MAX_CPUS / ZX_CPU_SET_BITS_PER_WORD];
+} zx_cpu_set_t;
+
 #ifdef __cplusplus
 // We cannot use <stdatomic.h> with C++ code as _Atomic qualifier defined by
 // C11 is not valid in C++11. There is not a single standard name that can
@@ -389,7 +512,8 @@
 typedef atomic_int zx_futex_t;
 #endif
 #endif
+typedef int zx_futex_storage_t;
 
 __END_CDECLS
 
-#endif // ZIRCON_TYPES_H_
+#endif // SYSROOT_ZIRCON_TYPES_H_
diff --git a/arch/arm64/sysroot/include/zircon/utc.h b/arch/arm64/sysroot/include/zircon/utc.h
new file mode 100644
index 0000000..180fd50
--- /dev/null
+++ b/arch/arm64/sysroot/include/zircon/utc.h
@@ -0,0 +1,71 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_UTC_H_
+#define SYSROOT_ZIRCON_UTC_H_
+
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// Accessors for the Zircon-specific UTC clock reference maintained by the
+// language runtime
+
+// zx_utc_reference_get
+//
+// Returns a handle to the currently assigned UTC clock, or ZX_HANDLE_INVALID if
+// no such clock currently exists.  The handle returned has borrow semantics,
+// and should never be directly closed by the user.  If a program wishes to take
+// ownership of the clock, it should do so using |zx_utc_reference_swap|.
+//
+// Thread safety is the responsibility of the user.  In particular, if a clock
+// is fetched by a user using |zx_utc_reference_get|, but then the clock is
+// swapped out using |zx_utc_reference_swap| and the original clock is closed,
+// then the initial clock handle returned is now invalid and could result in a
+// use-after-close situation.  It is the user's responsibility to avoid these
+// situations.
+//
+zx_handle_t _zx_utc_reference_get(void);
+zx_handle_t zx_utc_reference_get(void);
+
+// zx_utc_reference_swap
+//
+// Atomically swap the clock handle provided with the current UTC reference.
+//
+// Upon success, the runtime takes ownership of the handle provided by
+// |new_utc_reference| and returns the previous clock handle to the caller via
+// |prev_utc_reference_out|, or ZX_HANDLE_INVALID if no clock was currently
+// assigned.  The clock returned via swap is now owned by the caller.
+//
+// In the case of failure, the handle passed in by new_utc_reference will be
+// consumed, and the clock held by the runtime will remain unchanged.
+//
+// Clock handles provided to libc via zx_utc_reference_swap must have read rights
+// or they will be rejected.
+//
+// Parameters:
+// new_utc_reference      : A handle to the clock to install as the UTC reference.
+//                          Ownership of this handle will _always_ be consumed
+//                          by zx_utc_reference_swap.
+// prev_utc_reference_out : Either the handle to the previous UTC clock (success
+//                          case), or ZX_HANDLE_INVALID in the case of failure.
+//                          If a valid handle is returned in this out parameter,
+//                          it is _always_ owned by the caller after the call.
+//                          It is illegal to pass NULL for this parameter.
+//
+//
+// Return Values:
+// If a new clock reference is being provided, the return value of
+// |zx_utc_reference_swap| will be the result of a |zx_clock_read| call made to
+// verify the clock.  If ZX_HANDLE_INVALID was passed in order to uninstall a
+// reference clock, the function cannot fail and will always return ZX_OK.
+//
+zx_status_t _zx_utc_reference_swap(zx_handle_t new_utc_reference,
+                                   zx_handle_t* prev_utc_reference_out) __NONNULL((2));
+zx_status_t zx_utc_reference_swap(zx_handle_t new_utc_reference,
+                                  zx_handle_t* prev_utc_reference_out) __NONNULL((2));
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_UTC_H_
diff --git a/arch/arm64/sysroot/lib/Scrt1.o b/arch/arm64/sysroot/lib/Scrt1.o
index ceef414..cbbd2f6 100644
--- a/arch/arm64/sysroot/lib/Scrt1.o
+++ b/arch/arm64/sysroot/lib/Scrt1.o
Binary files differ
diff --git a/arch/arm64/sysroot/lib/libc.so b/arch/arm64/sysroot/lib/libc.so
index aef212b..7a15850 100755
--- a/arch/arm64/sysroot/lib/libc.so
+++ b/arch/arm64/sysroot/lib/libc.so
Binary files differ
diff --git a/arch/arm64/sysroot/lib/libzircon.so b/arch/arm64/sysroot/lib/libzircon.so
index 9985d58..41436d0 100755
--- a/arch/arm64/sysroot/lib/libzircon.so
+++ b/arch/arm64/sysroot/lib/libzircon.so
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_core_validation.so b/arch/x64/dist/libVkLayer_core_validation.so
deleted file mode 100755
index d11db74..0000000
--- a/arch/x64/dist/libVkLayer_core_validation.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_image_pipe_swapchain.so b/arch/x64/dist/libVkLayer_image_pipe_swapchain.so
deleted file mode 100755
index d94a22e..0000000
--- a/arch/x64/dist/libVkLayer_image_pipe_swapchain.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_object_tracker.so b/arch/x64/dist/libVkLayer_object_tracker.so
deleted file mode 100755
index c30fdd4..0000000
--- a/arch/x64/dist/libVkLayer_object_tracker.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_parameter_validation.so b/arch/x64/dist/libVkLayer_parameter_validation.so
deleted file mode 100755
index 5661ecb..0000000
--- a/arch/x64/dist/libVkLayer_parameter_validation.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_threading.so b/arch/x64/dist/libVkLayer_threading.so
deleted file mode 100755
index 4664719..0000000
--- a/arch/x64/dist/libVkLayer_threading.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libVkLayer_unique_objects.so b/arch/x64/dist/libVkLayer_unique_objects.so
deleted file mode 100755
index bcb6c68..0000000
--- a/arch/x64/dist/libVkLayer_unique_objects.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libasync-default.so b/arch/x64/dist/libasync-default.so
deleted file mode 100755
index e57cac5..0000000
--- a/arch/x64/dist/libasync-default.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libfdio.so b/arch/x64/dist/libfdio.so
index e27ae92..163c2e0 100755
--- a/arch/x64/dist/libfdio.so
+++ b/arch/x64/dist/libfdio.so
Binary files differ
diff --git a/arch/x64/dist/libmemfs.so b/arch/x64/dist/libmemfs.so
deleted file mode 100755
index 829662b..0000000
--- a/arch/x64/dist/libmemfs.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libsvc.so b/arch/x64/dist/libsvc.so
deleted file mode 100755
index b1736b0..0000000
--- a/arch/x64/dist/libsvc.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libsyslog.so b/arch/x64/dist/libsyslog.so
deleted file mode 100755
index 990253a..0000000
--- a/arch/x64/dist/libsyslog.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libtrace-engine.so b/arch/x64/dist/libtrace-engine.so
deleted file mode 100755
index 99eddbe..0000000
--- a/arch/x64/dist/libtrace-engine.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/dist/libvulkan.so b/arch/x64/dist/libvulkan.so
deleted file mode 100755
index 001f83a..0000000
--- a/arch/x64/dist/libvulkan.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libasync-default.so b/arch/x64/lib/libasync-default.so
deleted file mode 100755
index b5e0808..0000000
--- a/arch/x64/lib/libasync-default.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libfdio.so b/arch/x64/lib/libfdio.so
index c504a0b..163c2e0 100755
--- a/arch/x64/lib/libfdio.so
+++ b/arch/x64/lib/libfdio.so
Binary files differ
diff --git a/arch/x64/lib/libmemfs.so b/arch/x64/lib/libmemfs.so
deleted file mode 100755
index 1e58f43..0000000
--- a/arch/x64/lib/libmemfs.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libsvc.so b/arch/x64/lib/libsvc.so
deleted file mode 100755
index b1736b0..0000000
--- a/arch/x64/lib/libsvc.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libsync.a b/arch/x64/lib/libsync.a
index c656320..a1a266f 100644
--- a/arch/x64/lib/libsync.a
+++ b/arch/x64/lib/libsync.a
Binary files differ
diff --git a/arch/x64/lib/libsyslog.so b/arch/x64/lib/libsyslog.so
deleted file mode 100755
index 5eab748..0000000
--- a/arch/x64/lib/libsyslog.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libtrace-engine.so b/arch/x64/lib/libtrace-engine.so
deleted file mode 100755
index 2938916..0000000
--- a/arch/x64/lib/libtrace-engine.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/lib/libvulkan.so b/arch/x64/lib/libvulkan.so
deleted file mode 100755
index 001f83a..0000000
--- a/arch/x64/lib/libvulkan.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/sysroot/debug/libc.so b/arch/x64/sysroot/debug/libc.so
deleted file mode 100755
index fa4fc80..0000000
--- a/arch/x64/sysroot/debug/libc.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/sysroot/debug/libzircon.so b/arch/x64/sysroot/debug/libzircon.so
deleted file mode 100755
index 9043c37..0000000
--- a/arch/x64/sysroot/debug/libzircon.so
+++ /dev/null
Binary files differ
diff --git a/arch/x64/sysroot/dist/lib/asan-ubsan/ld.so.1 b/arch/x64/sysroot/dist/lib/asan-ubsan/ld.so.1
new file mode 100755
index 0000000..4af158d
--- /dev/null
+++ b/arch/x64/sysroot/dist/lib/asan-ubsan/ld.so.1
Binary files differ
diff --git a/arch/x64/sysroot/dist/lib/asan/ld.so.1 b/arch/x64/sysroot/dist/lib/asan/ld.so.1
new file mode 100755
index 0000000..1ae8ce7
--- /dev/null
+++ b/arch/x64/sysroot/dist/lib/asan/ld.so.1
Binary files differ
diff --git a/arch/x64/sysroot/dist/lib/ld.so.1 b/arch/x64/sysroot/dist/lib/ld.so.1
index 375c845..2717357 100755
--- a/arch/x64/sysroot/dist/lib/ld.so.1
+++ b/arch/x64/sysroot/dist/lib/ld.so.1
Binary files differ
diff --git a/arch/x64/sysroot/include/alloca.h b/arch/x64/sysroot/include/alloca.h
index c1679dd..7deb5b9 100644
--- a/arch/x64/sysroot/include/alloca.h
+++ b/arch/x64/sysroot/include/alloca.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ALLOCA_H_
+#define SYSROOT_ALLOCA_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,3 +17,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ALLOCA_H_
diff --git a/arch/x64/sysroot/include/ar.h b/arch/x64/sysroot/include/ar.h
index d20348b..d0d4176 100644
--- a/arch/x64/sysroot/include/ar.h
+++ b/arch/x64/sysroot/include/ar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_AR_H_
+#define SYSROOT_AR_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,14 +10,16 @@
 #define ARFMAG "`\n"
 
 struct ar_hdr {
-    char ar_name[16];
-    char ar_date[12];
-    char ar_uid[6], ar_gid[6];
-    char ar_mode[8];
-    char ar_size[10];
-    char ar_fmag[2];
+  char ar_name[16];
+  char ar_date[12];
+  char ar_uid[6], ar_gid[6];
+  char ar_mode[8];
+  char ar_size[10];
+  char ar_fmag[2];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_AR_H_
diff --git a/arch/x64/sysroot/include/arpa/ftp.h b/arch/x64/sysroot/include/arpa/ftp.h
index e1b66d3..7d86bec 100644
--- a/arch/x64/sysroot/include/arpa/ftp.h
+++ b/arch/x64/sysroot/include/arpa/ftp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_FTP_H_
+#define SYSROOT_ARPA_FTP_H_
 
 #define PRELIM 1
 #define COMPLETE 2
@@ -32,3 +33,5 @@
 char* typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local"};
 char* formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control"};
 #endif
+
+#endif  // SYSROOT_ARPA_FTP_H_
diff --git a/arch/x64/sysroot/include/arpa/inet.h b/arch/x64/sysroot/include/arpa/inet.h
index cfb02ea..4fa0af5 100644
--- a/arch/x64/sysroot/include/arpa/inet.h
+++ b/arch/x64/sysroot/include/arpa/inet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_INET_H_
+#define SYSROOT_ARPA_INET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -31,3 +32,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ARPA_INET_H_
diff --git a/arch/x64/sysroot/include/arpa/nameser.h b/arch/x64/sysroot/include/arpa/nameser.h
index 9218a58..734d205 100644
--- a/arch/x64/sysroot/include/arpa/nameser.h
+++ b/arch/x64/sysroot/include/arpa/nameser.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_NAMESER_H_
+#define SYSROOT_ARPA_NAMESER_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,27 +26,27 @@
 #define NS_DEFAULTPORT 53
 
 typedef enum __ns_sect {
-    ns_s_qd = 0,
-    ns_s_zn = 0,
-    ns_s_an = 1,
-    ns_s_pr = 1,
-    ns_s_ns = 2,
-    ns_s_ud = 2,
-    ns_s_ar = 3,
-    ns_s_max = 4
+  ns_s_qd = 0,
+  ns_s_zn = 0,
+  ns_s_an = 1,
+  ns_s_pr = 1,
+  ns_s_ns = 2,
+  ns_s_ud = 2,
+  ns_s_ar = 3,
+  ns_s_max = 4
 } ns_sect;
 
 typedef struct __ns_msg {
-    const unsigned char *_msg, *_eom;
-    uint16_t _id, _flags, _counts[ns_s_max];
-    const unsigned char* _sections[ns_s_max];
-    ns_sect _sect;
-    int _rrnum;
-    const unsigned char* _msg_ptr;
+  const unsigned char *_msg, *_eom;
+  uint16_t _id, _flags, _counts[ns_s_max];
+  const unsigned char* _sections[ns_s_max];
+  ns_sect _sect;
+  int _rrnum;
+  const unsigned char* _msg_ptr;
 } ns_msg;
 
 struct _ns_flagdata {
-    int mask, shift;
+  int mask, shift;
 };
 extern const struct _ns_flagdata _ns_flagdata[];
 
@@ -55,15 +56,15 @@
 #define ns_msg_size(handle) ((handle)._eom - (handle)._msg)
 #define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
 #define ns_msg_getflag(handle, flag) \
-    (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
+  (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift)
 
 typedef struct __ns_rr {
-    char name[NS_MAXDNAME];
-    uint16_t type;
-    uint16_t rr_class;
-    uint32_t ttl;
-    uint16_t rdlength;
-    const unsigned char* rdata;
+  char name[NS_MAXDNAME];
+  uint16_t type;
+  uint16_t rr_class;
+  uint32_t ttl;
+  uint16_t rdlength;
+  const unsigned char* rdata;
 } ns_rr;
 
 #define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
@@ -74,66 +75,66 @@
 #define ns_rr_rdata(rr) ((rr).rdata + 0)
 
 typedef enum __ns_flag {
-    ns_f_qr,
-    ns_f_opcode,
-    ns_f_aa,
-    ns_f_tc,
-    ns_f_rd,
-    ns_f_ra,
-    ns_f_z,
-    ns_f_ad,
-    ns_f_cd,
-    ns_f_rcode,
-    ns_f_max
+  ns_f_qr,
+  ns_f_opcode,
+  ns_f_aa,
+  ns_f_tc,
+  ns_f_rd,
+  ns_f_ra,
+  ns_f_z,
+  ns_f_ad,
+  ns_f_cd,
+  ns_f_rcode,
+  ns_f_max
 } ns_flag;
 
 typedef enum __ns_opcode {
-    ns_o_query = 0,
-    ns_o_iquery = 1,
-    ns_o_status = 2,
-    ns_o_notify = 4,
-    ns_o_update = 5,
-    ns_o_max = 6
+  ns_o_query = 0,
+  ns_o_iquery = 1,
+  ns_o_status = 2,
+  ns_o_notify = 4,
+  ns_o_update = 5,
+  ns_o_max = 6
 } ns_opcode;
 
 typedef enum __ns_rcode {
-    ns_r_noerror = 0,
-    ns_r_formerr = 1,
-    ns_r_servfail = 2,
-    ns_r_nxdomain = 3,
-    ns_r_notimpl = 4,
-    ns_r_refused = 5,
-    ns_r_yxdomain = 6,
-    ns_r_yxrrset = 7,
-    ns_r_nxrrset = 8,
-    ns_r_notauth = 9,
-    ns_r_notzone = 10,
-    ns_r_max = 11,
-    ns_r_badvers = 16,
-    ns_r_badsig = 16,
-    ns_r_badkey = 17,
-    ns_r_badtime = 18
+  ns_r_noerror = 0,
+  ns_r_formerr = 1,
+  ns_r_servfail = 2,
+  ns_r_nxdomain = 3,
+  ns_r_notimpl = 4,
+  ns_r_refused = 5,
+  ns_r_yxdomain = 6,
+  ns_r_yxrrset = 7,
+  ns_r_nxrrset = 8,
+  ns_r_notauth = 9,
+  ns_r_notzone = 10,
+  ns_r_max = 11,
+  ns_r_badvers = 16,
+  ns_r_badsig = 16,
+  ns_r_badkey = 17,
+  ns_r_badtime = 18
 } ns_rcode;
 
 typedef enum __ns_update_operation {
-    ns_uop_delete = 0,
-    ns_uop_add = 1,
-    ns_uop_max = 2
+  ns_uop_delete = 0,
+  ns_uop_add = 1,
+  ns_uop_max = 2
 } ns_update_operation;
 
 struct ns_tsig_key {
-    char name[NS_MAXDNAME], alg[NS_MAXDNAME];
-    unsigned char* data;
-    int len;
+  char name[NS_MAXDNAME], alg[NS_MAXDNAME];
+  unsigned char* data;
+  int len;
 };
 typedef struct ns_tsig_key ns_tsig_key;
 
 struct ns_tcp_tsig_state {
-    int counter;
-    struct dst_key* key;
-    void* ctx;
-    unsigned char sig[NS_PACKETSZ];
-    int siglen;
+  int counter;
+  struct dst_key* key;
+  void* ctx;
+  unsigned char sig[NS_PACKETSZ];
+  int siglen;
 };
 typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
 
@@ -146,58 +147,58 @@
 #define NS_TSIG_ERROR_FORMERR -12
 
 typedef enum __ns_type {
-    ns_t_invalid = 0,
-    ns_t_a = 1,
-    ns_t_ns = 2,
-    ns_t_md = 3,
-    ns_t_mf = 4,
-    ns_t_cname = 5,
-    ns_t_soa = 6,
-    ns_t_mb = 7,
-    ns_t_mg = 8,
-    ns_t_mr = 9,
-    ns_t_null = 10,
-    ns_t_wks = 11,
-    ns_t_ptr = 12,
-    ns_t_hinfo = 13,
-    ns_t_minfo = 14,
-    ns_t_mx = 15,
-    ns_t_txt = 16,
-    ns_t_rp = 17,
-    ns_t_afsdb = 18,
-    ns_t_x25 = 19,
-    ns_t_isdn = 20,
-    ns_t_rt = 21,
-    ns_t_nsap = 22,
-    ns_t_nsap_ptr = 23,
-    ns_t_sig = 24,
-    ns_t_key = 25,
-    ns_t_px = 26,
-    ns_t_gpos = 27,
-    ns_t_aaaa = 28,
-    ns_t_loc = 29,
-    ns_t_nxt = 30,
-    ns_t_eid = 31,
-    ns_t_nimloc = 32,
-    ns_t_srv = 33,
-    ns_t_atma = 34,
-    ns_t_naptr = 35,
-    ns_t_kx = 36,
-    ns_t_cert = 37,
-    ns_t_a6 = 38,
-    ns_t_dname = 39,
-    ns_t_sink = 40,
-    ns_t_opt = 41,
-    ns_t_apl = 42,
-    ns_t_tkey = 249,
-    ns_t_tsig = 250,
-    ns_t_ixfr = 251,
-    ns_t_axfr = 252,
-    ns_t_mailb = 253,
-    ns_t_maila = 254,
-    ns_t_any = 255,
-    ns_t_zxfr = 256,
-    ns_t_max = 65536
+  ns_t_invalid = 0,
+  ns_t_a = 1,
+  ns_t_ns = 2,
+  ns_t_md = 3,
+  ns_t_mf = 4,
+  ns_t_cname = 5,
+  ns_t_soa = 6,
+  ns_t_mb = 7,
+  ns_t_mg = 8,
+  ns_t_mr = 9,
+  ns_t_null = 10,
+  ns_t_wks = 11,
+  ns_t_ptr = 12,
+  ns_t_hinfo = 13,
+  ns_t_minfo = 14,
+  ns_t_mx = 15,
+  ns_t_txt = 16,
+  ns_t_rp = 17,
+  ns_t_afsdb = 18,
+  ns_t_x25 = 19,
+  ns_t_isdn = 20,
+  ns_t_rt = 21,
+  ns_t_nsap = 22,
+  ns_t_nsap_ptr = 23,
+  ns_t_sig = 24,
+  ns_t_key = 25,
+  ns_t_px = 26,
+  ns_t_gpos = 27,
+  ns_t_aaaa = 28,
+  ns_t_loc = 29,
+  ns_t_nxt = 30,
+  ns_t_eid = 31,
+  ns_t_nimloc = 32,
+  ns_t_srv = 33,
+  ns_t_atma = 34,
+  ns_t_naptr = 35,
+  ns_t_kx = 36,
+  ns_t_cert = 37,
+  ns_t_a6 = 38,
+  ns_t_dname = 39,
+  ns_t_sink = 40,
+  ns_t_opt = 41,
+  ns_t_apl = 42,
+  ns_t_tkey = 249,
+  ns_t_tsig = 250,
+  ns_t_ixfr = 251,
+  ns_t_axfr = 252,
+  ns_t_mailb = 253,
+  ns_t_maila = 254,
+  ns_t_any = 255,
+  ns_t_zxfr = 256,
+  ns_t_max = 65536
 } ns_type;
 
 #define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || (t) == ns_t_mailb || (t) == ns_t_maila)
@@ -207,29 +208,29 @@
 #define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || (t) == ns_t_zxfr)
 
 typedef enum __ns_class {
-    ns_c_invalid = 0,
-    ns_c_in = 1,
-    ns_c_2 = 2,
-    ns_c_chaos = 3,
-    ns_c_hs = 4,
-    ns_c_none = 254,
-    ns_c_any = 255,
-    ns_c_max = 65536
+  ns_c_invalid = 0,
+  ns_c_in = 1,
+  ns_c_2 = 2,
+  ns_c_chaos = 3,
+  ns_c_hs = 4,
+  ns_c_none = 254,
+  ns_c_any = 255,
+  ns_c_max = 65536
 } ns_class;
 
 typedef enum __ns_key_types {
-    ns_kt_rsa = 1,
-    ns_kt_dh = 2,
-    ns_kt_dsa = 3,
-    ns_kt_private = 254
+  ns_kt_rsa = 1,
+  ns_kt_dh = 2,
+  ns_kt_dsa = 3,
+  ns_kt_private = 254
 } ns_key_types;
 
 typedef enum __ns_cert_types {
-    cert_t_pkix = 1,
-    cert_t_spki = 2,
-    cert_t_pgp = 3,
-    cert_t_url = 253,
-    cert_t_oid = 254
+  cert_t_pkix = 1,
+  cert_t_spki = 2,
+  cert_t_pgp = 3,
+  cert_t_url = 253,
+  cert_t_oid = 254
 } ns_cert_types;
 
 #define NS_KEY_TYPEMASK 0xC000
@@ -253,9 +254,9 @@
 #define NS_KEY_RESERVED10 0x0020
 #define NS_KEY_RESERVED11 0x0010
 #define NS_KEY_SIGNATORYMASK 0x000F
-#define NS_KEY_RESERVED_BITMASK                                                  \
-    (NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | \
-     NS_KEY_RESERVED9 | NS_KEY_RESERVED10 | NS_KEY_RESERVED11)
+#define NS_KEY_RESERVED_BITMASK                                                                   \
+  (NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | NS_KEY_RESERVED9 | \
+   NS_KEY_RESERVED10 | NS_KEY_RESERVED11)
 #define NS_KEY_RESERVED_BITMASK2 0xFFFF
 #define NS_ALG_MD5RSA 1
 #define NS_ALG_DH 2
@@ -317,34 +318,34 @@
 #define __BIND 19950621
 
 typedef struct {
-    unsigned id : 16;
+  unsigned id : 16;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    unsigned qr : 1;
-    unsigned opcode : 4;
-    unsigned aa : 1;
-    unsigned tc : 1;
-    unsigned rd : 1;
-    unsigned ra : 1;
-    unsigned unused : 1;
-    unsigned ad : 1;
-    unsigned cd : 1;
-    unsigned rcode : 4;
+  unsigned qr : 1;
+  unsigned opcode : 4;
+  unsigned aa : 1;
+  unsigned tc : 1;
+  unsigned rd : 1;
+  unsigned ra : 1;
+  unsigned unused : 1;
+  unsigned ad : 1;
+  unsigned cd : 1;
+  unsigned rcode : 4;
 #else
-    unsigned rd : 1;
-    unsigned tc : 1;
-    unsigned aa : 1;
-    unsigned opcode : 4;
-    unsigned qr : 1;
-    unsigned rcode : 4;
-    unsigned cd : 1;
-    unsigned ad : 1;
-    unsigned unused : 1;
-    unsigned ra : 1;
+  unsigned rd : 1;
+  unsigned tc : 1;
+  unsigned aa : 1;
+  unsigned opcode : 4;
+  unsigned qr : 1;
+  unsigned rcode : 4;
+  unsigned cd : 1;
+  unsigned ad : 1;
+  unsigned unused : 1;
+  unsigned ra : 1;
 #endif
-    unsigned qdcount : 16;
-    unsigned ancount : 16;
-    unsigned nscount : 16;
-    unsigned arcount : 16;
+  unsigned qdcount : 16;
+  unsigned ancount : 16;
+  unsigned nscount : 16;
+  unsigned arcount : 16;
 } HEADER;
 
 #define PACKETSZ NS_PACKETSZ
@@ -446,3 +447,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ARPA_NAMESER_H_
diff --git a/arch/x64/sysroot/include/arpa/telnet.h b/arch/x64/sysroot/include/arpa/telnet.h
index d6880cf..2da3eda 100644
--- a/arch/x64/sysroot/include/arpa/telnet.h
+++ b/arch/x64/sysroot/include/arpa/telnet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_TELNET_H_
+#define SYSROOT_ARPA_TELNET_H_
 
 #define IAC 255
 #define DONT 254
@@ -23,10 +24,9 @@
 
 #define SYNCH 242
 
-#define telcmds                                                                        \
-    ((char[][6]){                                                                      \
-        "EOF", "SUSP", "ABORT", "EOR", "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", \
-        "EC", "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0})
+#define telcmds                                                                                    \
+  ((char[][6]){"EOF", "SUSP", "ABORT", "EOR", "SE",   "NOP",  "DMARK", "BRK",  "IP",  "AO", "AYT", \
+               "EC",  "EL",   "GA",    "SB",  "WILL", "WONT", "DO",    "DONT", "IAC", 0})
 
 #define TELCMD_FIRST xEOF
 #define TELCMD_LAST IAC
@@ -176,9 +176,9 @@
 
 #define NSLC 18
 
-#define SLC_NAMELIST                                                                               \
-    "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
-        "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#define SLC_NAMELIST                                                                             \
+  "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+      "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
 #ifdef SLC_NAMES
 char* slc_names[] = {SLC_NAMELIST};
 #else
@@ -256,11 +256,14 @@
 
 #ifdef ENCRYPT_NAMES
 char* encrypt_names[] = {
-    "IS", "SUPPORT", "REPLY", "START", "END", "REQUEST-START",
+    "IS",          "SUPPORT",   "REPLY",     "START", "END", "REQUEST-START",
     "REQUEST-END", "ENC-KEYID", "DEC-KEYID", 0,
 };
 char* enctype_names[] = {
-    "ANY", "DES_CFB64", "DES_OFB64", 0,
+    "ANY",
+    "DES_CFB64",
+    "DES_OFB64",
+    0,
 };
 #else
 extern char* encrypt_names[];
@@ -272,3 +275,5 @@
 
 #define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
 #define ENCTYPE_NAME(x) enctype_names[x]
+
+#endif  // SYSROOT_ARPA_TELNET_H_
diff --git a/arch/x64/sysroot/include/arpa/tftp.h b/arch/x64/sysroot/include/arpa/tftp.h
index 3a76d2f..e091368 100644
--- a/arch/x64/sysroot/include/arpa/tftp.h
+++ b/arch/x64/sysroot/include/arpa/tftp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ARPA_TFTP_H_
+#define SYSROOT_ARPA_TFTP_H_
 
 #define SEGSIZE 512
 #define RRQ 01
@@ -7,13 +8,13 @@
 #define ACK 04
 #define ERROR 05
 struct tftphdr {
-    short th_opcode;
-    union {
-        unsigned short tu_block;
-        short tu_code;
-        char tu_stuff[1];
-    } th_u;
-    char th_data[1];
+  short th_opcode;
+  union {
+    unsigned short tu_block;
+    short tu_code;
+    char tu_stuff[1];
+  } th_u;
+  char th_data[1];
 };
 #define th_block th_u.tu_block
 #define th_code th_u.tu_code
@@ -27,3 +28,5 @@
 #define EBADID 5
 #define EEXISTS 6
 #define ENOUSER 7
+
+#endif  // SYSROOT_ARPA_TFTP_H_
diff --git a/arch/x64/sysroot/include/bits/aarch64/fenv.h b/arch/x64/sysroot/include/bits/aarch64/fenv.h
index 6bb1f56..a370540 100644
--- a/arch/x64/sysroot/include/bits/aarch64/fenv.h
+++ b/arch/x64/sysroot/include/bits/aarch64/fenv.h
@@ -12,8 +12,8 @@
 typedef unsigned int fexcept_t;
 
 typedef struct {
-    unsigned int __fpcr;
-    unsigned int __fpsr;
+  unsigned int __fpcr;
+  unsigned int __fpsr;
 } fenv_t;
 
 #define FE_DFL_ENV ((const fenv_t*)-1)
diff --git a/arch/x64/sysroot/include/bits/aarch64/float.h b/arch/x64/sysroot/include/bits/aarch64/float.h
deleted file mode 100644
index 719c790..0000000
--- a/arch/x64/sysroot/include/bits/aarch64/float.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#define FLT_EVAL_METHOD 0
-
-#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
-#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
-#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
-#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
-
-#define LDBL_MANT_DIG 113
-#define LDBL_MIN_EXP (-16381)
-#define LDBL_MAX_EXP 16384
-
-#define LDBL_DIG 33
-#define LDBL_MIN_10_EXP (-4931)
-#define LDBL_MAX_10_EXP 4932
-
-#define DECIMAL_DIG 36
diff --git a/arch/x64/sysroot/include/bits/aarch64/ioctl.h b/arch/x64/sysroot/include/bits/aarch64/ioctl.h
index f963024..40835ba 100644
--- a/arch/x64/sysroot/include/bits/aarch64/ioctl.h
+++ b/arch/x64/sysroot/include/bits/aarch64/ioctl.h
@@ -94,10 +94,10 @@
 #define TIOCSER_TEMT 0x01
 
 struct winsize {
-    unsigned short ws_row;
-    unsigned short ws_col;
-    unsigned short ws_xpixel;
-    unsigned short ws_ypixel;
+  unsigned short ws_row;
+  unsigned short ws_col;
+  unsigned short ws_xpixel;
+  unsigned short ws_ypixel;
 };
 
 #define TIOCM_LE 0x001
diff --git a/arch/x64/sysroot/include/bits/aarch64/ipc.h b/arch/x64/sysroot/include/bits/aarch64/ipc.h
index df2ed2b..26161a2 100644
--- a/arch/x64/sysroot/include/bits/aarch64/ipc.h
+++ b/arch/x64/sysroot/include/bits/aarch64/ipc.h
@@ -1,14 +1,14 @@
 struct ipc_perm {
-    key_t __ipc_perm_key;
-    uid_t uid;
-    gid_t gid;
-    uid_t cuid;
-    gid_t cgid;
-    mode_t mode;
-    unsigned short __ipc_perm_seq;
+  key_t __ipc_perm_key;
+  uid_t uid;
+  gid_t gid;
+  uid_t cuid;
+  gid_t cgid;
+  mode_t mode;
+  unsigned short __ipc_perm_seq;
 
-    unsigned long __pad1;
-    unsigned long __pad2;
+  unsigned long __pad1;
+  unsigned long __pad2;
 };
 
 #define IPC_64 0
diff --git a/arch/x64/sysroot/include/bits/aarch64/setjmp.h b/arch/x64/sysroot/include/bits/aarch64/setjmp.h
index e3db976..c37aeb8 100644
--- a/arch/x64/sysroot/include/bits/aarch64/setjmp.h
+++ b/arch/x64/sysroot/include/bits/aarch64/setjmp.h
@@ -1 +1 @@
-typedef unsigned long long int __jmp_buf[22];
+typedef unsigned long long int __jmp_buf[23];
diff --git a/arch/x64/sysroot/include/bits/aarch64/signal.h b/arch/x64/sysroot/include/bits/aarch64/signal.h
index 766d3f9..64e57f3 100644
--- a/arch/x64/sysroot/include/bits/aarch64/signal.h
+++ b/arch/x64/sysroot/include/bits/aarch64/signal.h
@@ -11,49 +11,51 @@
 typedef unsigned long gregset_t[34];
 
 typedef struct {
-    long double vregs[32];
-    unsigned int fpsr;
-    unsigned int fpcr;
+  long double vregs[32];
+  unsigned int fpsr;
+  unsigned int fpcr;
 } fpregset_t;
 typedef struct sigcontext {
-    unsigned long fault_address;
-    unsigned long regs[31];
-    unsigned long sp, pc, pstate;
-    long double __reserved[256];
+  unsigned long fault_address;
+  unsigned long regs[31];
+  unsigned long sp, pc, pstate;
+  long double __reserved[256];
 } mcontext_t;
 
 #define FPSIMD_MAGIC 0x46508001
 #define ESR_MAGIC 0x45535201
 struct _aarch64_ctx {
-    unsigned int magic;
-    unsigned int size;
+  unsigned int magic;
+  unsigned int size;
 };
 struct fpsimd_context {
-    struct _aarch64_ctx head;
-    unsigned int fpsr;
-    unsigned int fpcr;
-    long double vregs[32];
+  struct _aarch64_ctx head;
+  unsigned int fpsr;
+  unsigned int fpcr;
+  long double vregs[32];
 };
 struct esr_context {
-    struct _aarch64_ctx head;
-    unsigned long esr;
+  struct _aarch64_ctx head;
+  unsigned long esr;
 };
 #else
-typedef struct { long double __regs[18 + 256]; } mcontext_t;
+typedef struct {
+  long double __regs[18 + 256];
+} mcontext_t;
 #endif
 
 struct sigaltstack {
-    void* ss_sp;
-    int ss_flags;
-    size_t ss_size;
+  void* ss_sp;
+  int ss_flags;
+  size_t ss_size;
 };
 
 typedef struct __ucontext {
-    unsigned long uc_flags;
-    struct ucontext* uc_link;
-    stack_t uc_stack;
-    sigset_t uc_sigmask;
-    mcontext_t uc_mcontext;
+  unsigned long uc_flags;
+  struct ucontext* uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  mcontext_t uc_mcontext;
 } ucontext_t;
 
 #define SA_NOCLDSTOP 1
diff --git a/arch/x64/sysroot/include/bits/aarch64/stat.h b/arch/x64/sysroot/include/bits/aarch64/stat.h
index 0fe7e69..02102fa 100644
--- a/arch/x64/sysroot/include/bits/aarch64/stat.h
+++ b/arch/x64/sysroot/include/bits/aarch64/stat.h
@@ -1,18 +1,18 @@
 struct stat {
-    dev_t st_dev;
-    ino_t st_ino;
-    mode_t st_mode;
-    nlink_t st_nlink;
-    uid_t st_uid;
-    gid_t st_gid;
-    dev_t st_rdev;
-    unsigned long __pad;
-    off_t st_size;
-    blksize_t st_blksize;
-    int __pad2;
-    blkcnt_t st_blocks;
-    struct timespec st_atim;
-    struct timespec st_mtim;
-    struct timespec st_ctim;
-    unsigned __unused[2];
+  dev_t st_dev;
+  ino_t st_ino;
+  mode_t st_mode;
+  nlink_t st_nlink;
+  uid_t st_uid;
+  gid_t st_gid;
+  dev_t st_rdev;
+  unsigned long __pad;
+  off_t st_size;
+  blksize_t st_blksize;
+  int __pad2;
+  blkcnt_t st_blocks;
+  struct timespec st_atim;
+  struct timespec st_mtim;
+  struct timespec st_ctim;
+  unsigned __unused1[2];
 };
diff --git a/arch/x64/sysroot/include/bits/alltypes.h b/arch/x64/sysroot/include/bits/alltypes.h
index 21fcb7f..95da44c 100644
--- a/arch/x64/sysroot/include/bits/alltypes.h
+++ b/arch/x64/sysroot/include/bits/alltypes.h
@@ -193,8 +193,8 @@
 
 #if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
 typedef struct {
-    long long __ll;
-    long double __ld;
+  long long __ll;
+  long double __ld;
 } max_align_t;
 #define __DEFINED_max_align_t
 #endif
@@ -310,24 +310,24 @@
 
 #if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec)
 struct iovec {
-    void* iov_base;
-    size_t iov_len;
+  void* iov_base;
+  size_t iov_len;
 };
 #define __DEFINED_struct_iovec
 #endif
 
 #if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval)
 struct timeval {
-    time_t tv_sec;
-    suseconds_t tv_usec;
+  time_t tv_sec;
+  suseconds_t tv_usec;
 };
 #define __DEFINED_struct_timeval
 #endif
 
 #if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec)
 struct timespec {
-    time_t tv_sec;
-    long tv_nsec;
+  time_t tv_sec;
+  long tv_nsec;
 };
 #define __DEFINED_struct_timespec
 #endif
@@ -373,7 +373,9 @@
 #endif
 
 #if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t)
-typedef struct __sigset_t { unsigned long __bits[128 / sizeof(long)]; } sigset_t;
+typedef struct __sigset_t {
+  unsigned long __bits[128 / sizeof(long)];
+} sigset_t;
 #define __DEFINED_sigset_t
 #endif
 
@@ -398,22 +400,30 @@
 #endif
 
 #if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t)
-typedef struct { unsigned __attr; } pthread_mutexattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_mutexattr_t;
 #define __DEFINED_pthread_mutexattr_t
 #endif
 
 #if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t)
-typedef struct { unsigned __attr; } pthread_condattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_condattr_t;
 #define __DEFINED_pthread_condattr_t
 #endif
 
 #if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t)
-typedef struct { unsigned __attr; } pthread_barrierattr_t;
+typedef struct {
+  unsigned __attr;
+} pthread_barrierattr_t;
 #define __DEFINED_pthread_barrierattr_t
 #endif
 
 #if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t)
-typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+typedef struct {
+  unsigned __attr[2];
+} pthread_rwlockattr_t;
 #define __DEFINED_pthread_rwlockattr_t
 #endif
 
@@ -432,31 +442,35 @@
 #endif
 
 #if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t)
-typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+typedef struct __mbstate_t {
+  unsigned __opaque1, __opaque2;
+} mbstate_t;
 #define __DEFINED_mbstate_t
 #endif
 
 #if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t)
 typedef struct {
-    const char* __name;
-    int __c11;
-    size_t _a_stacksize;
-    size_t _a_guardsize;
-    void* _a_stackaddr;
-    int _a_detach;
-    int _a_sched;
-    int _a_policy;
-    int _a_prio;
+  const char* __name;
+  int __c11;
+  size_t _a_stacksize;
+  size_t _a_guardsize;
+  void* _a_stackaddr;
+  int _a_detach;
+  int _a_sched;
+  int _a_policy;
+  int _a_prio;
 } pthread_attr_t;
 #define __DEFINED_pthread_attr_t
 #endif
 
 #if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t)
 typedef struct {
-    int _m_type;
-    __C11_ATOMIC(int) _m_lock;
-    __C11_ATOMIC(int) _m_waiters;
-    int _m_count;
+  unsigned _m_attr;
+  __C11_ATOMIC(int)
+  _m_lock;
+  __C11_ATOMIC(int)
+  _m_waiters;
+  int _m_count;
 } pthread_mutex_t;
 #define __DEFINED_pthread_mutex_t
 #endif
@@ -467,55 +481,64 @@
     __attribute__((__capability__("mutex")))
 #endif
 {
-    int __i[1];
+  int __i[1];
 } mtx_t;
 #define __DEFINED_mtx_t
 #endif
 
 #if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t)
 typedef struct {
-    void* _c_head;
-    int _c_clock;
-    void* _c_tail;
-    __C11_ATOMIC(int) _c_lock;
+  void* _c_head;
+  int _c_clock;
+  void* _c_tail;
+  __C11_ATOMIC(int)
+  _c_lock;
 } pthread_cond_t;
 #define __DEFINED_pthread_cond_t
 #endif
 
 #if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t)
 typedef struct {
-    void* _c_head;
-    int _c_clock;
-    void* _c_tail;
-    __C11_ATOMIC(int) _c_lock;
+  void* _c_head;
+  int _c_clock;
+  void* _c_tail;
+  __C11_ATOMIC(int) _c_lock;
 } cnd_t;
 #define __DEFINED_cnd_t
 #endif
 
 #if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t)
 typedef struct {
-    __C11_ATOMIC(int) _rw_lock;
-    __C11_ATOMIC(int) _rw_waiters;
+  __C11_ATOMIC(int)
+  _rw_lock;
+  __C11_ATOMIC(int)
+  _rw_waiters;
 } pthread_rwlock_t;
 #define __DEFINED_pthread_rwlock_t
 #endif
 
 #if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t)
 typedef struct {
-    __C11_ATOMIC(int) _b_lock;
-    __C11_ATOMIC(int) _b_waiters;
-    unsigned int _b_limit;
-    __C11_ATOMIC(int) _b_count;
-    __C11_ATOMIC(int) _b_waiters2;
-    void* _b_inst;
+  __C11_ATOMIC(int)
+  _b_lock;
+  __C11_ATOMIC(int)
+  _b_waiters;
+  unsigned int _b_limit;
+  __C11_ATOMIC(int)
+  _b_count;
+  __C11_ATOMIC(int)
+  _b_waiters2;
+  void* _b_inst;
 } pthread_barrier_t;
 #define __DEFINED_pthread_barrier_t
 #endif
 
 #if defined(__NEED_sem_t) && !defined(__DEFINED_sem_t)
 typedef struct {
-    __C11_ATOMIC(int) _s_value;
-    __C11_ATOMIC(int) _s_waiters;
+  __C11_ATOMIC(int)
+  _s_value;
+  __C11_ATOMIC(int)
+  _s_waiters;
 } sem_t;
 #define __DEFINED_sem_t
 #endif
diff --git a/arch/x64/sysroot/include/bits/float.h b/arch/x64/sysroot/include/bits/float.h
deleted file mode 100644
index 45354da..0000000
--- a/arch/x64/sysroot/include/bits/float.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#if defined(__x86_64__)
-#include "x86_64/float.h"
-#elif defined(__aarch64__)
-#include "aarch64/float.h"
-#else
-#error Unsupported architecture!
-#endif
diff --git a/arch/x64/sysroot/include/bits/msg.h b/arch/x64/sysroot/include/bits/msg.h
index 9b3f7e5..1c8034b 100644
--- a/arch/x64/sysroot/include/bits/msg.h
+++ b/arch/x64/sysroot/include/bits/msg.h
@@ -1,12 +1,12 @@
 struct msqid_ds {
-    struct ipc_perm msg_perm;
-    time_t msg_stime;
-    time_t msg_rtime;
-    time_t msg_ctime;
-    unsigned long msg_cbytes;
-    msgqnum_t msg_qnum;
-    msglen_t msg_qbytes;
-    pid_t msg_lspid;
-    pid_t msg_lrpid;
-    unsigned long __unused[2];
+  struct ipc_perm msg_perm;
+  time_t msg_stime;
+  time_t msg_rtime;
+  time_t msg_ctime;
+  unsigned long msg_cbytes;
+  msgqnum_t msg_qnum;
+  msglen_t msg_qbytes;
+  pid_t msg_lspid;
+  pid_t msg_lrpid;
+  unsigned long __unused[2];
 };
diff --git a/arch/x64/sysroot/include/bits/null.h b/arch/x64/sysroot/include/bits/null.h
index 1788e0c..76e7b77 100644
--- a/arch/x64/sysroot/include/bits/null.h
+++ b/arch/x64/sysroot/include/bits/null.h
@@ -4,9 +4,12 @@
 // license that can be found in the LICENSE file or at
 // https://opensource.org/licenses/MIT
 
-#pragma once
+#ifndef SYSROOT_BITS_NULL_H_
+#define SYSROOT_BITS_NULL_H_
 
 // The compiler's <stddef.h> defines NULL without defining anything
 // else if __need_NULL is defined first.
 #define __need_NULL
 #include <stddef.h>
+
+#endif  // SYSROOT_BITS_NULL_H_
diff --git a/arch/x64/sysroot/include/bits/sem.h b/arch/x64/sysroot/include/bits/sem.h
index d7aa74b..db4102f 100644
--- a/arch/x64/sysroot/include/bits/sem.h
+++ b/arch/x64/sysroot/include/bits/sem.h
@@ -1,14 +1,14 @@
 struct semid_ds {
-    struct ipc_perm sem_perm;
-    time_t sem_otime;
-    time_t sem_ctime;
+  struct ipc_perm sem_perm;
+  time_t sem_otime;
+  time_t sem_ctime;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned short sem_nsems;
-    char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
+  unsigned short sem_nsems;
+  char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
 #else
-    char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
-    unsigned short sem_nsems;
+  char __sem_nsems_pad[sizeof(time_t) - sizeof(short)];
+  unsigned short sem_nsems;
 #endif
-    time_t __unused3;
-    time_t __unused4;
+  time_t __unused3;
+  time_t __unused4;
 };
diff --git a/arch/x64/sysroot/include/bits/shm.h b/arch/x64/sysroot/include/bits/shm.h
index 8bb1c74..a3b9dcc 100644
--- a/arch/x64/sysroot/include/bits/shm.h
+++ b/arch/x64/sysroot/include/bits/shm.h
@@ -1,24 +1,24 @@
 #define SHMLBA 4096
 
 struct shmid_ds {
-    struct ipc_perm shm_perm;
-    size_t shm_segsz;
-    time_t shm_atime;
-    time_t shm_dtime;
-    time_t shm_ctime;
-    pid_t shm_cpid;
-    pid_t shm_lpid;
-    unsigned long shm_nattch;
-    unsigned long __pad1;
-    unsigned long __pad2;
+  struct ipc_perm shm_perm;
+  size_t shm_segsz;
+  time_t shm_atime;
+  time_t shm_dtime;
+  time_t shm_ctime;
+  pid_t shm_cpid;
+  pid_t shm_lpid;
+  unsigned long shm_nattch;
+  unsigned long __pad1;
+  unsigned long __pad2;
 };
 
 struct shminfo {
-    unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
+  unsigned long shmmax, shmmin, shmmni, shmseg, shmall, __unused[4];
 };
 
 struct shm_info {
-    int __used_ids;
-    unsigned long shm_tot, shm_rss, shm_swp;
-    unsigned long __swap_attempts, __swap_successes;
+  int __used_ids;
+  unsigned long shm_tot, shm_rss, shm_swp;
+  unsigned long __swap_attempts, __swap_successes;
 };
diff --git a/arch/x64/sysroot/include/bits/socket.h b/arch/x64/sysroot/include/bits/socket.h
index aad18bf..1127d5b 100644
--- a/arch/x64/sysroot/include/bits/socket.h
+++ b/arch/x64/sysroot/include/bits/socket.h
@@ -1,33 +1,33 @@
 #include <endian.h>
 
 struct msghdr {
-    void* msg_name;
-    socklen_t msg_namelen;
-    struct iovec* msg_iov;
+  void* msg_name;
+  socklen_t msg_namelen;
+  struct iovec* msg_iov;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad1, msg_iovlen;
+  int __pad1, msg_iovlen;
 #else
-    int msg_iovlen, __pad1;
+  int msg_iovlen, __pad1;
 #endif
-    void* msg_control;
+  void* msg_control;
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad2;
-    socklen_t msg_controllen;
+  int __pad2;
+  socklen_t msg_controllen;
 #else
-    socklen_t msg_controllen;
-    int __pad2;
+  socklen_t msg_controllen;
+  int __pad2;
 #endif
-    int msg_flags;
+  int msg_flags;
 };
 
 struct cmsghdr {
 #if __BYTE_ORDER == __BIG_ENDIAN
-    int __pad1;
-    socklen_t cmsg_len;
+  int __pad1;
+  socklen_t cmsg_len;
 #else
-    socklen_t cmsg_len;
-    int __pad1;
+  socklen_t cmsg_len;
+  int __pad1;
 #endif
-    int cmsg_level;
-    int cmsg_type;
+  int cmsg_level;
+  int cmsg_type;
 };
diff --git a/arch/x64/sysroot/include/bits/statfs.h b/arch/x64/sysroot/include/bits/statfs.h
index 656aa8d..ef2bbe3 100644
--- a/arch/x64/sysroot/include/bits/statfs.h
+++ b/arch/x64/sysroot/include/bits/statfs.h
@@ -1,7 +1,7 @@
 struct statfs {
-    unsigned long f_type, f_bsize;
-    fsblkcnt_t f_blocks, f_bfree, f_bavail;
-    fsfilcnt_t f_files, f_ffree;
-    fsid_t f_fsid;
-    unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
+  unsigned long f_type, f_bsize;
+  fsblkcnt_t f_blocks, f_bfree, f_bavail;
+  fsfilcnt_t f_files, f_ffree;
+  fsid_t f_fsid;
+  unsigned long f_namelen, f_frsize, f_flags, f_spare[4];
 };
diff --git a/arch/x64/sysroot/include/bits/termios.h b/arch/x64/sysroot/include/bits/termios.h
index 1a06f76..d9a7359 100644
--- a/arch/x64/sysroot/include/bits/termios.h
+++ b/arch/x64/sysroot/include/bits/termios.h
@@ -1,12 +1,12 @@
 struct termios {
-    tcflag_t c_iflag;
-    tcflag_t c_oflag;
-    tcflag_t c_cflag;
-    tcflag_t c_lflag;
-    cc_t c_line;
-    cc_t c_cc[NCCS];
-    speed_t __c_ispeed;
-    speed_t __c_ospeed;
+  tcflag_t c_iflag;
+  tcflag_t c_oflag;
+  tcflag_t c_cflag;
+  tcflag_t c_lflag;
+  cc_t c_line;
+  cc_t c_cc[NCCS];
+  speed_t __c_ispeed;
+  speed_t __c_ospeed;
 };
 
 #define VINTR 0
diff --git a/arch/x64/sysroot/include/bits/x86_64/fenv.h b/arch/x64/sysroot/include/bits/x86_64/fenv.h
index 5cea203..32e7dbf 100644
--- a/arch/x64/sysroot/include/bits/x86_64/fenv.h
+++ b/arch/x64/sysroot/include/bits/x86_64/fenv.h
@@ -15,20 +15,20 @@
 typedef unsigned short fexcept_t;
 
 typedef struct {
-    unsigned short __control_word;
-    unsigned short __unused1;
-    unsigned short __status_word;
-    unsigned short __unused2;
-    unsigned short __tags;
-    unsigned short __unused3;
-    unsigned int __eip;
-    unsigned short __cs_selector;
-    unsigned int __opcode : 11;
-    unsigned int __unused4 : 5;
-    unsigned int __data_offset;
-    unsigned short __data_selector;
-    unsigned short __unused5;
-    unsigned int __mxcsr;
+  unsigned short __control_word;
+  unsigned short __unused1;
+  unsigned short __status_word;
+  unsigned short __unused2;
+  unsigned short __tags;
+  unsigned short __unused3;
+  unsigned int __eip;
+  unsigned short __cs_selector;
+  unsigned int __opcode : 11;
+  unsigned int __unused4 : 5;
+  unsigned int __data_offset;
+  unsigned short __data_selector;
+  unsigned short __unused5;
+  unsigned int __mxcsr;
 } fenv_t;
 
 #define FE_DFL_ENV ((const fenv_t*)-1)
diff --git a/arch/x64/sysroot/include/bits/x86_64/float.h b/arch/x64/sysroot/include/bits/x86_64/float.h
deleted file mode 100644
index f935e34..0000000
--- a/arch/x64/sysroot/include/bits/x86_64/float.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifdef __FLT_EVAL_METHOD__
-#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#else
-#define FLT_EVAL_METHOD 0
-#endif
-
-#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
-#define LDBL_MIN 3.3621031431120935063e-4932L
-#define LDBL_MAX 1.1897314953572317650e+4932L
-#define LDBL_EPSILON 1.0842021724855044340e-19L
-
-#define LDBL_MANT_DIG 64
-#define LDBL_MIN_EXP (-16381)
-#define LDBL_MAX_EXP 16384
-
-#define LDBL_DIG 18
-#define LDBL_MIN_10_EXP (-4931)
-#define LDBL_MAX_10_EXP 4932
-
-#define DECIMAL_DIG 21
diff --git a/arch/x64/sysroot/include/bits/x86_64/io.h b/arch/x64/sysroot/include/bits/x86_64/io.h
index bbfb2e6..7234422 100644
--- a/arch/x64/sysroot/include/bits/x86_64/io.h
+++ b/arch/x64/sysroot/include/bits/x86_64/io.h
@@ -1,77 +1,53 @@
 static __inline void outb(unsigned char __val, unsigned short __port) {
-    __asm__ volatile("outb %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outb %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline void outw(unsigned short __val, unsigned short __port) {
-    __asm__ volatile("outw %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outw %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline void outl(unsigned int __val, unsigned short __port) {
-    __asm__ volatile("outl %0,%1"
-                     :
-                     : "a"(__val), "dN"(__port));
+  __asm__ volatile("outl %0,%1" : : "a"(__val), "dN"(__port));
 }
 
 static __inline unsigned char inb(unsigned short __port) {
-    unsigned char __val;
-    __asm__ volatile("inb %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned char __val;
+  __asm__ volatile("inb %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline unsigned short inw(unsigned short __port) {
-    unsigned short __val;
-    __asm__ volatile("inw %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned short __val;
+  __asm__ volatile("inw %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline unsigned int inl(unsigned short __port) {
-    unsigned int __val;
-    __asm__ volatile("inl %1,%0"
-                     : "=a"(__val)
-                     : "dN"(__port));
-    return __val;
+  unsigned int __val;
+  __asm__ volatile("inl %1,%0" : "=a"(__val) : "dN"(__port));
+  return __val;
 }
 
 static __inline void outsb(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsb"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsb" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void outsw(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsw"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsw" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void outsl(unsigned short __port, const void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; outsl"
-                     : "+S"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; outsl" : "+S"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insb(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insb"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insb" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insw(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insw"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insw" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
 
 static __inline void insl(unsigned short __port, void* __buf, unsigned long __n) {
-    __asm__ volatile("cld; rep; insl"
-                     : "+D"(__buf), "+c"(__n)
-                     : "d"(__port));
+  __asm__ volatile("cld; rep; insl" : "+D"(__buf), "+c"(__n) : "d"(__port));
 }
diff --git a/arch/x64/sysroot/include/bits/x86_64/ioctl.h b/arch/x64/sysroot/include/bits/x86_64/ioctl.h
index 66525bf..bc8d16a 100644
--- a/arch/x64/sysroot/include/bits/x86_64/ioctl.h
+++ b/arch/x64/sysroot/include/bits/x86_64/ioctl.h
@@ -88,10 +88,10 @@
 #define TIOCSER_TEMT 0x01
 
 struct winsize {
-    unsigned short ws_row;
-    unsigned short ws_col;
-    unsigned short ws_xpixel;
-    unsigned short ws_ypixel;
+  unsigned short ws_row;
+  unsigned short ws_col;
+  unsigned short ws_xpixel;
+  unsigned short ws_ypixel;
 };
 
 #define TIOCM_LE 0x001
diff --git a/arch/x64/sysroot/include/bits/x86_64/ipc.h b/arch/x64/sysroot/include/bits/x86_64/ipc.h
index b563143..c66f9ed 100644
--- a/arch/x64/sysroot/include/bits/x86_64/ipc.h
+++ b/arch/x64/sysroot/include/bits/x86_64/ipc.h
@@ -1,13 +1,13 @@
 struct ipc_perm {
-    key_t __ipc_perm_key;
-    uid_t uid;
-    gid_t gid;
-    uid_t cuid;
-    gid_t cgid;
-    mode_t mode;
-    int __ipc_perm_seq;
-    long __pad1;
-    long __pad2;
+  key_t __ipc_perm_key;
+  uid_t uid;
+  gid_t gid;
+  uid_t cuid;
+  gid_t cgid;
+  mode_t mode;
+  int __ipc_perm_seq;
+  long __pad1;
+  long __pad2;
 };
 
 #define IPC_64 0
diff --git a/arch/x64/sysroot/include/bits/x86_64/signal.h b/arch/x64/sysroot/include/bits/x86_64/signal.h
index 529bbc4..26095e9 100644
--- a/arch/x64/sysroot/include/bits/x86_64/signal.h
+++ b/arch/x64/sysroot/include/bits/x86_64/signal.h
@@ -35,47 +35,49 @@
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 typedef long long greg_t, gregset_t[23];
 typedef struct _fpstate {
-    unsigned short cwd, swd, ftw, fop;
-    unsigned long long rip, rdp;
-    unsigned mxcsr, mxcr_mask;
-    struct {
-        unsigned short significand[4], exponent, padding[3];
-    } _st[8];
-    struct {
-        unsigned element[4];
-    } _xmm[16];
-    unsigned padding[24];
+  unsigned short cwd, swd, ftw, fop;
+  unsigned long long rip, rdp;
+  unsigned mxcsr, mxcr_mask;
+  struct {
+    unsigned short significand[4], exponent, padding[3];
+  } _st[8];
+  struct {
+    unsigned element[4];
+  } _xmm[16];
+  unsigned padding[24];
 } * fpregset_t;
 struct sigcontext {
-    unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
-    unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
-    unsigned short cs, gs, fs, __pad0;
-    unsigned long err, trapno, oldmask, cr2;
-    struct _fpstate* fpstate;
-    unsigned long __reserved1[8];
+  unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
+  unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
+  unsigned short cs, gs, fs, __pad0;
+  unsigned long err, trapno, oldmask, cr2;
+  struct _fpstate* fpstate;
+  unsigned long __reserved1[8];
 };
 typedef struct {
-    gregset_t gregs;
-    fpregset_t fpregs;
-    unsigned long long __reserved1[8];
+  gregset_t gregs;
+  fpregset_t fpregs;
+  unsigned long long __reserved1[8];
 } mcontext_t;
 #else
-typedef struct { unsigned long __space[32]; } mcontext_t;
+typedef struct {
+  unsigned long __space[32];
+} mcontext_t;
 #endif
 
 struct sigaltstack {
-    void* ss_sp;
-    int ss_flags;
-    size_t ss_size;
+  void* ss_sp;
+  int ss_flags;
+  size_t ss_size;
 };
 
 typedef struct __ucontext {
-    unsigned long uc_flags;
-    struct __ucontext* uc_link;
-    stack_t uc_stack;
-    mcontext_t uc_mcontext;
-    sigset_t uc_sigmask;
-    unsigned long __fpregs_mem[64];
+  unsigned long uc_flags;
+  struct __ucontext* uc_link;
+  stack_t uc_stack;
+  mcontext_t uc_mcontext;
+  sigset_t uc_sigmask;
+  unsigned long __fpregs_mem[64];
 } ucontext_t;
 
 #define SA_NOCLDSTOP 1
diff --git a/arch/x64/sysroot/include/bits/x86_64/stat.h b/arch/x64/sysroot/include/bits/x86_64/stat.h
index d3b3447..9533ce5 100644
--- a/arch/x64/sysroot/include/bits/x86_64/stat.h
+++ b/arch/x64/sysroot/include/bits/x86_64/stat.h
@@ -2,21 +2,21 @@
  * by the corresponding correctly-sized userspace types. */
 
 struct stat {
-    dev_t st_dev;
-    ino_t st_ino;
-    nlink_t st_nlink;
+  dev_t st_dev;
+  ino_t st_ino;
+  nlink_t st_nlink;
 
-    mode_t st_mode;
-    uid_t st_uid;
-    gid_t st_gid;
-    unsigned int __pad0;
-    dev_t st_rdev;
-    off_t st_size;
-    blksize_t st_blksize;
-    blkcnt_t st_blocks;
+  mode_t st_mode;
+  uid_t st_uid;
+  gid_t st_gid;
+  unsigned int __pad0;
+  dev_t st_rdev;
+  off_t st_size;
+  blksize_t st_blksize;
+  blkcnt_t st_blocks;
 
-    struct timespec st_atim;
-    struct timespec st_mtim;
-    struct timespec st_ctim;
-    long __unused[3];
+  struct timespec st_atim;
+  struct timespec st_mtim;
+  struct timespec st_ctim;
+  long __unused1[3];
 };
diff --git a/arch/x64/sysroot/include/byteswap.h b/arch/x64/sysroot/include/byteswap.h
index 6350775..54d1c36 100644
--- a/arch/x64/sysroot/include/byteswap.h
+++ b/arch/x64/sysroot/include/byteswap.h
@@ -1,21 +1,21 @@
-#pragma once
+#ifndef SYSROOT_BYTESWAP_H_
+#define SYSROOT_BYTESWAP_H_
 
 #include <features.h>
 #include <stdint.h>
 
-static __inline uint16_t __bswap_16(uint16_t __x) {
-    return __x << 8 | __x >> 8;
-}
+static __inline uint16_t __bswap_16(uint16_t __x) { return (uint16_t)(__x << 8 | __x >> 8); }
 
 static __inline uint32_t __bswap_32(uint32_t __x) {
-    return __x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) |
-           __x << 24;
+  return __x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24;
 }
 
 static __inline uint64_t __bswap_64(uint64_t __x) {
-    return ((uint64_t)__bswap_32(__x)) << 32 | __bswap_32(__x >> 32);
+  return ((uint64_t)__bswap_32((uint32_t)__x)) << 32 | __bswap_32((uint32_t)(__x >> 32));
 }
 
 #define bswap_16(x) __bswap_16(x)
 #define bswap_32(x) __bswap_32(x)
 #define bswap_64(x) __bswap_64(x)
+
+#endif  // SYSROOT_BYTESWAP_H_
diff --git a/arch/x64/sysroot/include/complex.h b/arch/x64/sysroot/include/complex.h
index 9761553..c4bb294 100644
--- a/arch/x64/sysroot/include/complex.h
+++ b/arch/x64/sysroot/include/complex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_COMPLEX_H_
+#define SYSROOT_COMPLEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -101,12 +102,12 @@
 long double creall(long double complex);
 
 #ifndef __cplusplus
-#define __CIMAG(x, t)     \
-    (+(union {            \
-          _Complex t __z; \
-          t __xy[2];      \
-      }){(_Complex t)(x)} \
-          .__xy[1])
+#define __CIMAG(x, t)   \
+  (+(union {            \
+      _Complex t __z;   \
+      t __xy[2];        \
+    }){(_Complex t)(x)} \
+        .__xy[1])
 
 #define creal(x) ((double)(x))
 #define crealf(x) ((float)(x))
@@ -133,3 +134,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_COMPLEX_H_
diff --git a/arch/x64/sysroot/include/cpio.h b/arch/x64/sysroot/include/cpio.h
index f921413..21d069e 100644
--- a/arch/x64/sysroot/include/cpio.h
+++ b/arch/x64/sysroot/include/cpio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_CPIO_H_
+#define SYSROOT_CPIO_H_
 
 #define MAGIC "070707"
 
@@ -24,3 +25,5 @@
 #define C_ISLNK 0120000
 #define C_ISCTG 0110000
 #define C_ISREG 0100000
+
+#endif  // SYSROOT_CPIO_H_
diff --git a/arch/x64/sysroot/include/crypt.h b/arch/x64/sysroot/include/crypt.h
deleted file mode 100644
index 029698c..0000000
--- a/arch/x64/sysroot/include/crypt.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct crypt_data {
-    int initialized;
-    char __buf[256];
-};
-
-char* crypt(const char*, const char*);
-char* crypt_r(const char*, const char*, struct crypt_data*);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/x64/sysroot/include/ctype.h b/arch/x64/sysroot/include/ctype.h
index f4cd85b..12be80d 100644
--- a/arch/x64/sysroot/include/ctype.h
+++ b/arch/x64/sysroot/include/ctype.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_CTYPE_H_
+#define SYSROOT_CTYPE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,9 +23,7 @@
 int toupper(int);
 
 #ifndef __cplusplus
-static __inline int __isspace(int _c) {
-    return _c == ' ' || (unsigned)_c - '\t' < 5;
-}
+static __inline int __isspace(int _c) { return _c == ' ' || (unsigned)_c - '\t' < 5; }
 
 #define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a) | 32) - 'a') < 26)
 #define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a) - '0') < 10)
@@ -49,3 +48,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_CTYPE_H_
diff --git a/arch/x64/sysroot/include/dirent.h b/arch/x64/sysroot/include/dirent.h
index 0c463c4..4542825 100644
--- a/arch/x64/sysroot/include/dirent.h
+++ b/arch/x64/sysroot/include/dirent.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_DIRENT_H_
+#define SYSROOT_DIRENT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,11 +18,11 @@
 typedef struct __dirstream DIR;
 
 struct dirent {
-    ino_t d_ino;
-    off_t d_off;
-    unsigned short d_reclen;
-    unsigned char d_type;
-    char d_name[256];
+  ino_t d_ino;
+  off_t d_off;
+  unsigned short d_reclen;
+  unsigned char d_type;
+  char d_name[256];
 };
 
 #define d_fileno d_ino
@@ -62,3 +63,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_DIRENT_H_
diff --git a/arch/x64/sysroot/include/dlfcn.h b/arch/x64/sysroot/include/dlfcn.h
index 04cc834..ff069c9 100644
--- a/arch/x64/sysroot/include/dlfcn.h
+++ b/arch/x64/sysroot/include/dlfcn.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_DLFCN_H_
+#define SYSROOT_DLFCN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,10 +26,10 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 typedef struct {
-    const char* dli_fname;
-    void* dli_fbase;
-    const char* dli_sname;
-    void* dli_saddr;
+  const char* dli_fname;
+  void* dli_fbase;
+  const char* dli_sname;
+  void* dli_saddr;
 } Dl_info;
 int dladdr(const void*, Dl_info*);
 int dlinfo(void*, int, void*);
@@ -37,3 +38,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_DLFCN_H_
diff --git a/arch/x64/sysroot/include/elf.h b/arch/x64/sysroot/include/elf.h
index a5efbda..88a35f0 100644
--- a/arch/x64/sysroot/include/elf.h
+++ b/arch/x64/sysroot/include/elf.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ELF_H_
+#define SYSROOT_ELF_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -34,37 +35,37 @@
 #define EI_NIDENT (16)
 
 typedef struct {
-    unsigned char e_ident[EI_NIDENT];
-    Elf32_Half e_type;
-    Elf32_Half e_machine;
-    Elf32_Word e_version;
-    Elf32_Addr e_entry;
-    Elf32_Off e_phoff;
-    Elf32_Off e_shoff;
-    Elf32_Word e_flags;
-    Elf32_Half e_ehsize;
-    Elf32_Half e_phentsize;
-    Elf32_Half e_phnum;
-    Elf32_Half e_shentsize;
-    Elf32_Half e_shnum;
-    Elf32_Half e_shstrndx;
+  unsigned char e_ident[EI_NIDENT];
+  Elf32_Half e_type;
+  Elf32_Half e_machine;
+  Elf32_Word e_version;
+  Elf32_Addr e_entry;
+  Elf32_Off e_phoff;
+  Elf32_Off e_shoff;
+  Elf32_Word e_flags;
+  Elf32_Half e_ehsize;
+  Elf32_Half e_phentsize;
+  Elf32_Half e_phnum;
+  Elf32_Half e_shentsize;
+  Elf32_Half e_shnum;
+  Elf32_Half e_shstrndx;
 } Elf32_Ehdr;
 
 typedef struct {
-    unsigned char e_ident[EI_NIDENT];
-    Elf64_Half e_type;
-    Elf64_Half e_machine;
-    Elf64_Word e_version;
-    Elf64_Addr e_entry;
-    Elf64_Off e_phoff;
-    Elf64_Off e_shoff;
-    Elf64_Word e_flags;
-    Elf64_Half e_ehsize;
-    Elf64_Half e_phentsize;
-    Elf64_Half e_phnum;
-    Elf64_Half e_shentsize;
-    Elf64_Half e_shnum;
-    Elf64_Half e_shstrndx;
+  unsigned char e_ident[EI_NIDENT];
+  Elf64_Half e_type;
+  Elf64_Half e_machine;
+  Elf64_Word e_version;
+  Elf64_Addr e_entry;
+  Elf64_Off e_phoff;
+  Elf64_Off e_shoff;
+  Elf64_Word e_flags;
+  Elf64_Half e_ehsize;
+  Elf64_Half e_phentsize;
+  Elf64_Half e_phnum;
+  Elf64_Half e_shentsize;
+  Elf64_Half e_shnum;
+  Elf64_Half e_shstrndx;
 } Elf64_Ehdr;
 
 #define EI_MAG0 0
@@ -217,29 +218,29 @@
 #define EV_NUM 2
 
 typedef struct {
-    Elf32_Word sh_name;
-    Elf32_Word sh_type;
-    Elf32_Word sh_flags;
-    Elf32_Addr sh_addr;
-    Elf32_Off sh_offset;
-    Elf32_Word sh_size;
-    Elf32_Word sh_link;
-    Elf32_Word sh_info;
-    Elf32_Word sh_addralign;
-    Elf32_Word sh_entsize;
+  Elf32_Word sh_name;
+  Elf32_Word sh_type;
+  Elf32_Word sh_flags;
+  Elf32_Addr sh_addr;
+  Elf32_Off sh_offset;
+  Elf32_Word sh_size;
+  Elf32_Word sh_link;
+  Elf32_Word sh_info;
+  Elf32_Word sh_addralign;
+  Elf32_Word sh_entsize;
 } Elf32_Shdr;
 
 typedef struct {
-    Elf64_Word sh_name;
-    Elf64_Word sh_type;
-    Elf64_Xword sh_flags;
-    Elf64_Addr sh_addr;
-    Elf64_Off sh_offset;
-    Elf64_Xword sh_size;
-    Elf64_Word sh_link;
-    Elf64_Word sh_info;
-    Elf64_Xword sh_addralign;
-    Elf64_Xword sh_entsize;
+  Elf64_Word sh_name;
+  Elf64_Word sh_type;
+  Elf64_Xword sh_flags;
+  Elf64_Addr sh_addr;
+  Elf64_Off sh_offset;
+  Elf64_Xword sh_size;
+  Elf64_Word sh_link;
+  Elf64_Word sh_info;
+  Elf64_Xword sh_addralign;
+  Elf64_Xword sh_entsize;
 } Elf64_Shdr;
 
 #define SHN_UNDEF 0
@@ -313,31 +314,31 @@
 #define GRP_COMDAT 0x1
 
 typedef struct {
-    Elf32_Word st_name;
-    Elf32_Addr st_value;
-    Elf32_Word st_size;
-    unsigned char st_info;
-    unsigned char st_other;
-    Elf32_Section st_shndx;
+  Elf32_Word st_name;
+  Elf32_Addr st_value;
+  Elf32_Word st_size;
+  unsigned char st_info;
+  unsigned char st_other;
+  Elf32_Section st_shndx;
 } Elf32_Sym;
 
 typedef struct {
-    Elf64_Word st_name;
-    unsigned char st_info;
-    unsigned char st_other;
-    Elf64_Section st_shndx;
-    Elf64_Addr st_value;
-    Elf64_Xword st_size;
+  Elf64_Word st_name;
+  unsigned char st_info;
+  unsigned char st_other;
+  Elf64_Section st_shndx;
+  Elf64_Addr st_value;
+  Elf64_Xword st_size;
 } Elf64_Sym;
 
 typedef struct {
-    Elf32_Half si_boundto;
-    Elf32_Half si_flags;
+  Elf32_Half si_boundto;
+  Elf32_Half si_flags;
 } Elf32_Syminfo;
 
 typedef struct {
-    Elf64_Half si_boundto;
-    Elf64_Half si_flags;
+  Elf64_Half si_boundto;
+  Elf64_Half si_flags;
 } Elf64_Syminfo;
 
 #define SYMINFO_BT_SELF 0xffff
@@ -396,25 +397,25 @@
 #define STV_PROTECTED 3
 
 typedef struct {
-    Elf32_Addr r_offset;
-    Elf32_Word r_info;
+  Elf32_Addr r_offset;
+  Elf32_Word r_info;
 } Elf32_Rel;
 
 typedef struct {
-    Elf64_Addr r_offset;
-    Elf64_Xword r_info;
+  Elf64_Addr r_offset;
+  Elf64_Xword r_info;
 } Elf64_Rel;
 
 typedef struct {
-    Elf32_Addr r_offset;
-    Elf32_Word r_info;
-    Elf32_Sword r_addend;
+  Elf32_Addr r_offset;
+  Elf32_Word r_info;
+  Elf32_Sword r_addend;
 } Elf32_Rela;
 
 typedef struct {
-    Elf64_Addr r_offset;
-    Elf64_Xword r_info;
-    Elf64_Sxword r_addend;
+  Elf64_Addr r_offset;
+  Elf64_Xword r_info;
+  Elf64_Sxword r_addend;
 } Elf64_Rela;
 
 #define ELF32_R_SYM(val) ((val) >> 8)
@@ -426,25 +427,25 @@
 #define ELF64_R_INFO(sym, type) ((((Elf64_Xword)(sym)) << 32) + (type))
 
 typedef struct {
-    Elf32_Word p_type;
-    Elf32_Off p_offset;
-    Elf32_Addr p_vaddr;
-    Elf32_Addr p_paddr;
-    Elf32_Word p_filesz;
-    Elf32_Word p_memsz;
-    Elf32_Word p_flags;
-    Elf32_Word p_align;
+  Elf32_Word p_type;
+  Elf32_Off p_offset;
+  Elf32_Addr p_vaddr;
+  Elf32_Addr p_paddr;
+  Elf32_Word p_filesz;
+  Elf32_Word p_memsz;
+  Elf32_Word p_flags;
+  Elf32_Word p_align;
 } Elf32_Phdr;
 
 typedef struct {
-    Elf64_Word p_type;
-    Elf64_Word p_flags;
-    Elf64_Off p_offset;
-    Elf64_Addr p_vaddr;
-    Elf64_Addr p_paddr;
-    Elf64_Xword p_filesz;
-    Elf64_Xword p_memsz;
-    Elf64_Xword p_align;
+  Elf64_Word p_type;
+  Elf64_Word p_flags;
+  Elf64_Off p_offset;
+  Elf64_Addr p_vaddr;
+  Elf64_Addr p_paddr;
+  Elf64_Xword p_filesz;
+  Elf64_Xword p_memsz;
+  Elf64_Xword p_align;
 } Elf64_Phdr;
 
 #define PT_NULL 0
@@ -520,19 +521,19 @@
 #define NT_VERSION 1
 
 typedef struct {
-    Elf32_Sword d_tag;
-    union {
-        Elf32_Word d_val;
-        Elf32_Addr d_ptr;
-    } d_un;
+  Elf32_Sword d_tag;
+  union {
+    Elf32_Word d_val;
+    Elf32_Addr d_ptr;
+  } d_un;
 } Elf32_Dyn;
 
 typedef struct {
-    Elf64_Sxword d_tag;
-    union {
-        Elf64_Xword d_val;
-        Elf64_Addr d_ptr;
-    } d_un;
+  Elf64_Sxword d_tag;
+  union {
+    Elf64_Xword d_val;
+    Elf64_Addr d_ptr;
+  } d_un;
 } Elf64_Dyn;
 
 #define DT_NULL 0
@@ -672,23 +673,23 @@
 #define DF_P1_GROUPPERM 0x00000002
 
 typedef struct {
-    Elf32_Half vd_version;
-    Elf32_Half vd_flags;
-    Elf32_Half vd_ndx;
-    Elf32_Half vd_cnt;
-    Elf32_Word vd_hash;
-    Elf32_Word vd_aux;
-    Elf32_Word vd_next;
+  Elf32_Half vd_version;
+  Elf32_Half vd_flags;
+  Elf32_Half vd_ndx;
+  Elf32_Half vd_cnt;
+  Elf32_Word vd_hash;
+  Elf32_Word vd_aux;
+  Elf32_Word vd_next;
 } Elf32_Verdef;
 
 typedef struct {
-    Elf64_Half vd_version;
-    Elf64_Half vd_flags;
-    Elf64_Half vd_ndx;
-    Elf64_Half vd_cnt;
-    Elf64_Word vd_hash;
-    Elf64_Word vd_aux;
-    Elf64_Word vd_next;
+  Elf64_Half vd_version;
+  Elf64_Half vd_flags;
+  Elf64_Half vd_ndx;
+  Elf64_Half vd_cnt;
+  Elf64_Word vd_hash;
+  Elf64_Word vd_aux;
+  Elf64_Word vd_next;
 } Elf64_Verdef;
 
 #define VER_DEF_NONE 0
@@ -704,29 +705,29 @@
 #define VER_NDX_ELIMINATE 0xff01
 
 typedef struct {
-    Elf32_Word vda_name;
-    Elf32_Word vda_next;
+  Elf32_Word vda_name;
+  Elf32_Word vda_next;
 } Elf32_Verdaux;
 
 typedef struct {
-    Elf64_Word vda_name;
-    Elf64_Word vda_next;
+  Elf64_Word vda_name;
+  Elf64_Word vda_next;
 } Elf64_Verdaux;
 
 typedef struct {
-    Elf32_Half vn_version;
-    Elf32_Half vn_cnt;
-    Elf32_Word vn_file;
-    Elf32_Word vn_aux;
-    Elf32_Word vn_next;
+  Elf32_Half vn_version;
+  Elf32_Half vn_cnt;
+  Elf32_Word vn_file;
+  Elf32_Word vn_aux;
+  Elf32_Word vn_next;
 } Elf32_Verneed;
 
 typedef struct {
-    Elf64_Half vn_version;
-    Elf64_Half vn_cnt;
-    Elf64_Word vn_file;
-    Elf64_Word vn_aux;
-    Elf64_Word vn_next;
+  Elf64_Half vn_version;
+  Elf64_Half vn_cnt;
+  Elf64_Word vn_file;
+  Elf64_Word vn_aux;
+  Elf64_Word vn_next;
 } Elf64_Verneed;
 
 #define VER_NEED_NONE 0
@@ -734,35 +735,35 @@
 #define VER_NEED_NUM 2
 
 typedef struct {
-    Elf32_Word vna_hash;
-    Elf32_Half vna_flags;
-    Elf32_Half vna_other;
-    Elf32_Word vna_name;
-    Elf32_Word vna_next;
+  Elf32_Word vna_hash;
+  Elf32_Half vna_flags;
+  Elf32_Half vna_other;
+  Elf32_Word vna_name;
+  Elf32_Word vna_next;
 } Elf32_Vernaux;
 
 typedef struct {
-    Elf64_Word vna_hash;
-    Elf64_Half vna_flags;
-    Elf64_Half vna_other;
-    Elf64_Word vna_name;
-    Elf64_Word vna_next;
+  Elf64_Word vna_hash;
+  Elf64_Half vna_flags;
+  Elf64_Half vna_other;
+  Elf64_Word vna_name;
+  Elf64_Word vna_next;
 } Elf64_Vernaux;
 
 #define VER_FLG_WEAK 0x2
 
 typedef struct {
-    uint32_t a_type;
-    union {
-        uint32_t a_val;
-    } a_un;
+  uint32_t a_type;
+  union {
+    uint32_t a_val;
+  } a_un;
 } Elf32_auxv_t;
 
 typedef struct {
-    uint64_t a_type;
-    union {
-        uint64_t a_val;
-    } a_un;
+  uint64_t a_type;
+  union {
+    uint64_t a_val;
+  } a_un;
 } Elf64_auxv_t;
 
 #define AT_NULL 0
@@ -812,15 +813,15 @@
 #define AT_L3_CACHESHAPE 37
 
 typedef struct {
-    Elf32_Word n_namesz;
-    Elf32_Word n_descsz;
-    Elf32_Word n_type;
+  Elf32_Word n_namesz;
+  Elf32_Word n_descsz;
+  Elf32_Word n_type;
 } Elf32_Nhdr;
 
 typedef struct {
-    Elf64_Word n_namesz;
-    Elf64_Word n_descsz;
-    Elf64_Word n_type;
+  Elf64_Word n_namesz;
+  Elf64_Word n_descsz;
+  Elf64_Word n_type;
 } Elf64_Nhdr;
 
 #define ELF_NOTE_SOLARIS "SUNW Solaris"
@@ -841,19 +842,19 @@
 #define NT_GNU_GOLD_VERSION 4
 
 typedef struct {
-    Elf32_Xword m_value;
-    Elf32_Word m_info;
-    Elf32_Word m_poffset;
-    Elf32_Half m_repeat;
-    Elf32_Half m_stride;
+  Elf32_Xword m_value;
+  Elf32_Word m_info;
+  Elf32_Word m_poffset;
+  Elf32_Half m_repeat;
+  Elf32_Half m_stride;
 } Elf32_Move;
 
 typedef struct {
-    Elf64_Xword m_value;
-    Elf64_Xword m_info;
-    Elf64_Xword m_poffset;
-    Elf64_Half m_repeat;
-    Elf64_Half m_stride;
+  Elf64_Xword m_value;
+  Elf64_Xword m_info;
+  Elf64_Xword m_poffset;
+  Elf64_Half m_repeat;
+  Elf64_Half m_stride;
 } Elf64_Move;
 
 #define ELF32_M_SYM(info) ((info) >> 8)
@@ -1138,29 +1139,29 @@
 #define STB_MIPS_SPLIT_COMMON 13
 
 typedef union {
-    struct {
-        Elf32_Word gt_current_g_value;
-        Elf32_Word gt_unused;
-    } gt_header;
-    struct {
-        Elf32_Word gt_g_value;
-        Elf32_Word gt_bytes;
-    } gt_entry;
+  struct {
+    Elf32_Word gt_current_g_value;
+    Elf32_Word gt_unused;
+  } gt_header;
+  struct {
+    Elf32_Word gt_g_value;
+    Elf32_Word gt_bytes;
+  } gt_entry;
 } Elf32_gptab;
 
 typedef struct {
-    Elf32_Word ri_gprmask;
-    Elf32_Word ri_cprmask[4];
-    Elf32_Sword ri_gp_value;
+  Elf32_Word ri_gprmask;
+  Elf32_Word ri_cprmask[4];
+  Elf32_Sword ri_gp_value;
 } Elf32_RegInfo;
 
 typedef struct {
-    unsigned char kind;
+  unsigned char kind;
 
-    unsigned char size;
-    Elf32_Section section;
+  unsigned char size;
+  Elf32_Section section;
 
-    Elf32_Word info;
+  Elf32_Word info;
 } Elf_Options;
 
 #define ODK_NULL 0
@@ -1197,8 +1198,8 @@
 #define OPAD_SYMBOL 0x4
 
 typedef struct {
-    Elf32_Word hwp_flags1;
-    Elf32_Word hwp_flags2;
+  Elf32_Word hwp_flags1;
+  Elf32_Word hwp_flags2;
 } Elf_Options_Hw;
 
 #define OHWA0_R4KEOP_CHECKED 0x00000001
@@ -1341,19 +1342,19 @@
 #define RHF_RLD_ORDER_SAFE (1 << 14)
 
 typedef struct {
-    Elf32_Word l_name;
-    Elf32_Word l_time_stamp;
-    Elf32_Word l_checksum;
-    Elf32_Word l_version;
-    Elf32_Word l_flags;
+  Elf32_Word l_name;
+  Elf32_Word l_time_stamp;
+  Elf32_Word l_checksum;
+  Elf32_Word l_version;
+  Elf32_Word l_flags;
 } Elf32_Lib;
 
 typedef struct {
-    Elf64_Word l_name;
-    Elf64_Word l_time_stamp;
-    Elf64_Word l_checksum;
-    Elf64_Word l_version;
-    Elf64_Word l_flags;
+  Elf64_Word l_name;
+  Elf64_Word l_time_stamp;
+  Elf64_Word l_checksum;
+  Elf64_Word l_version;
+  Elf64_Word l_flags;
 } Elf64_Lib;
 
 #define LL_NONE 0
@@ -2580,3 +2581,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ELF_H_
diff --git a/arch/x64/sysroot/include/endian.h b/arch/x64/sysroot/include/endian.h
index 499f985..5ca6625 100644
--- a/arch/x64/sysroot/include/endian.h
+++ b/arch/x64/sysroot/include/endian.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ENDIAN_H_
+#define SYSROOT_ENDIAN_H_
 
 #include <features.h>
 
@@ -21,16 +22,14 @@
 
 #include <stdint.h>
 
-static __inline uint16_t __bswap16(uint16_t __x) {
-    return (uint16_t)(__x << 8 | __x >> 8);
-}
+static __inline uint16_t __bswap16(uint16_t __x) { return (uint16_t)(__x << 8 | __x >> 8); }
 
 static __inline uint32_t __bswap32(uint32_t __x) {
-    return (uint32_t)(__x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24);
+  return (uint32_t)(__x >> 24 | ((__x >> 8) & 0xff00) | ((__x << 8) & 0xff0000) | __x << 24);
 }
 
 static __inline uint64_t __bswap64(uint64_t __x) {
-    return ((uint64_t)__bswap32((uint32_t)__x)) << 32 | (uint64_t)__bswap32((uint32_t)(__x >> 32));
+  return ((uint64_t)__bswap32((uint32_t)__x)) << 32 | (uint64_t)__bswap32((uint32_t)(__x >> 32));
 }
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -74,3 +73,5 @@
 #endif
 
 #endif
+
+#endif  // SYSROOT_ENDIAN_H_
diff --git a/arch/x64/sysroot/include/err.h b/arch/x64/sysroot/include/err.h
index 3ed5f7f..29842fe 100644
--- a/arch/x64/sysroot/include/err.h
+++ b/arch/x64/sysroot/include/err.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ERR_H_
+#define SYSROOT_ERR_H_
 
 #include <features.h>
 #include <stdarg.h>
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ERR_H_
diff --git a/arch/x64/sysroot/include/errno.h b/arch/x64/sysroot/include/errno.h
index 4d3b968..af13f58 100644
--- a/arch/x64/sysroot/include/errno.h
+++ b/arch/x64/sysroot/include/errno.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ERRNO_H_
+#define SYSROOT_ERRNO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ERRNO_H_
diff --git a/arch/x64/sysroot/include/fcntl.h b/arch/x64/sysroot/include/fcntl.h
index f045529..e5e47bd 100644
--- a/arch/x64/sysroot/include/fcntl.h
+++ b/arch/x64/sysroot/include/fcntl.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FCNTL_H_
+#define SYSROOT_FCNTL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,11 +20,11 @@
 #include <bits/alltypes.h>
 
 struct flock {
-    short l_type;
-    short l_whence;
-    off_t l_start;
-    off_t l_len;
-    pid_t l_pid;
+  short l_type;
+  short l_whence;
+  off_t l_start;
+  off_t l_len;
+  pid_t l_pid;
 };
 
 int creat(const char*, mode_t);
@@ -54,7 +55,6 @@
 #ifdef _ALL_SOURCE
 #define O_NOREMOTE  0x00200000
 #define O_ADMIN     0x00000004
-#define O_PIPELINE  0x80000000
 #endif
 
 // Flags which do not align with ZXIO_FS_*
@@ -195,8 +195,8 @@
 #define F_OWNER_PGRP 2
 #define F_OWNER_GID 2
 struct f_owner_ex {
-    int type;
-    pid_t pid;
+  int type;
+  pid_t pid;
 };
 #define FALLOC_FL_KEEP_SIZE 1
 #define FALLOC_FL_PUNCH_HOLE 2
@@ -220,3 +220,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FCNTL_H_
diff --git a/arch/x64/sysroot/include/features.h b/arch/x64/sysroot/include/features.h
index 7bd75ad..1520efb 100644
--- a/arch/x64/sysroot/include/features.h
+++ b/arch/x64/sysroot/include/features.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FEATURES_H_
+#define SYSROOT_FEATURES_H_
 
 #if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE)
 #define _GNU_SOURCE 1
@@ -30,3 +31,5 @@
 #else
 #define _Noreturn
 #endif
+
+#endif  // SYSROOT_FEATURES_H_
diff --git a/arch/x64/sysroot/include/fenv.h b/arch/x64/sysroot/include/fenv.h
index 42508ac..391f59f 100644
--- a/arch/x64/sysroot/include/fenv.h
+++ b/arch/x64/sysroot/include/fenv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FENV_H_
+#define SYSROOT_FENV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -23,3 +24,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FENV_H_
diff --git a/arch/x64/sysroot/include/float.h b/arch/x64/sysroot/include/float.h
deleted file mode 100644
index 691c4fc..0000000
--- a/arch/x64/sysroot/include/float.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int __flt_rounds(void);
-#define FLT_ROUNDS (__flt_rounds())
-
-#define FLT_RADIX 2
-
-#define FLT_TRUE_MIN 1.40129846432481707092e-45F
-#define FLT_MIN 1.17549435082228750797e-38F
-#define FLT_MAX 3.40282346638528859812e+38F
-#define FLT_EPSILON 1.1920928955078125e-07F
-
-#define FLT_MANT_DIG 24
-#define FLT_MIN_EXP (-125)
-#define FLT_MAX_EXP 128
-#define FLT_HAS_SUBNORM 1
-
-#define FLT_DIG 6
-#define FLT_DECIMAL_DIG 9
-#define FLT_MIN_10_EXP (-37)
-#define FLT_MAX_10_EXP 38
-
-#define DBL_TRUE_MIN 4.94065645841246544177e-324
-#define DBL_MIN 2.22507385850720138309e-308
-#define DBL_MAX 1.79769313486231570815e+308
-#define DBL_EPSILON 2.22044604925031308085e-16
-
-#define DBL_MANT_DIG 53
-#define DBL_MIN_EXP (-1021)
-#define DBL_MAX_EXP 1024
-#define DBL_HAS_SUBNORM 1
-
-#define DBL_DIG 15
-#define DBL_DECIMAL_DIG 17
-#define DBL_MIN_10_EXP (-307)
-#define DBL_MAX_10_EXP 308
-
-#define LDBL_HAS_SUBNORM 1
-#define LDBL_DECIMAL_DIG DECIMAL_DIG
-
-#include <bits/float.h>
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/x64/sysroot/include/fmtmsg.h b/arch/x64/sysroot/include/fmtmsg.h
index e6b0923..51abcc5 100644
--- a/arch/x64/sysroot/include/fmtmsg.h
+++ b/arch/x64/sysroot/include/fmtmsg.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FMTMSG_H_
+#define SYSROOT_FMTMSG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,3 +43,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FMTMSG_H_
diff --git a/arch/x64/sysroot/include/fnmatch.h b/arch/x64/sysroot/include/fnmatch.h
index ea277a4..2e0f6cc 100644
--- a/arch/x64/sysroot/include/fnmatch.h
+++ b/arch/x64/sysroot/include/fnmatch.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_FNMATCH_H_
+#define SYSROOT_FNMATCH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_FNMATCH_H_
diff --git a/arch/x64/sysroot/include/ftw.h b/arch/x64/sysroot/include/ftw.h
deleted file mode 100644
index 1c282aa..0000000
--- a/arch/x64/sysroot/include/ftw.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <features.h>
-#include <sys/stat.h>
-
-#define FTW_F 1
-#define FTW_D 2
-#define FTW_DNR 3
-#define FTW_NS 4
-#define FTW_SL 5
-#define FTW_DP 6
-#define FTW_SLN 7
-
-#define FTW_PHYS 1
-#define FTW_MOUNT 2
-#define FTW_CHDIR 4
-#define FTW_DEPTH 8
-
-struct FTW {
-    int base;
-    int level;
-};
-
-int ftw(const char*, int (*)(const char*, const struct stat*, int), int);
-int nftw(const char*, int (*)(const char*, const struct stat*, int, struct FTW*), int, int);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/x64/sysroot/include/getopt.h b/arch/x64/sysroot/include/getopt.h
index 8019e90..bcc632d 100644
--- a/arch/x64/sysroot/include/getopt.h
+++ b/arch/x64/sysroot/include/getopt.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GETOPT_H_
+#define SYSROOT_GETOPT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,10 +10,10 @@
 extern int optind, opterr, optopt, optreset;
 
 struct option {
-    const char* name;
-    int has_arg;
-    int* flag;
-    int val;
+  const char* name;
+  int has_arg;
+  int* flag;
+  int val;
 };
 
 int getopt_long(int, char* const*, const char*, const struct option*, int*);
@@ -25,3 +26,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GETOPT_H_
diff --git a/arch/x64/sysroot/include/glob.h b/arch/x64/sysroot/include/glob.h
index 580ffe1..98ff3f6 100644
--- a/arch/x64/sysroot/include/glob.h
+++ b/arch/x64/sysroot/include/glob.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GLOB_H_
+#define SYSROOT_GLOB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,11 +12,11 @@
 #include <bits/alltypes.h>
 
 typedef struct {
-    size_t gl_pathc;
-    char** gl_pathv;
-    size_t gl_offs;
-    int __dummy1;
-    void* __dummy2[5];
+  size_t gl_pathc;
+  char** gl_pathv;
+  size_t gl_offs;
+  int __dummy1;
+  void* __dummy2[5];
 } glob_t;
 
 int glob(const char* __restrict, int, int (*)(const char*, int), glob_t* __restrict);
@@ -38,3 +39,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GLOB_H_
diff --git a/arch/x64/sysroot/include/grp.h b/arch/x64/sysroot/include/grp.h
index 5e0dd0a..4cfdd08 100644
--- a/arch/x64/sysroot/include/grp.h
+++ b/arch/x64/sysroot/include/grp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_GRP_H_
+#define SYSROOT_GRP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,10 +17,10 @@
 #include <bits/alltypes.h>
 
 struct group {
-    char* gr_name;
-    char* gr_passwd;
-    gid_t gr_gid;
-    char** gr_mem;
+  char* gr_name;
+  char* gr_passwd;
+  gid_t gr_gid;
+  char** gr_mem;
 };
 
 struct group* getgrgid(gid_t);
@@ -46,3 +47,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_GRP_H_
diff --git a/arch/x64/sysroot/include/iconv.h b/arch/x64/sysroot/include/iconv.h
index 4fee288..c0c056b 100644
--- a/arch/x64/sysroot/include/iconv.h
+++ b/arch/x64/sysroot/include/iconv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_ICONV_H_
+#define SYSROOT_ICONV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_ICONV_H_
diff --git a/arch/x64/sysroot/include/ifaddrs.h b/arch/x64/sysroot/include/ifaddrs.h
index 912a2b6..908945e 100644
--- a/arch/x64/sysroot/include/ifaddrs.h
+++ b/arch/x64/sysroot/include/ifaddrs.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_IFADDRS_H_
+#define SYSROOT_IFADDRS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,16 +10,16 @@
 #include <sys/socket.h>
 
 struct ifaddrs {
-    struct ifaddrs* ifa_next;
-    char* ifa_name;
-    unsigned ifa_flags;
-    struct sockaddr* ifa_addr;
-    struct sockaddr* ifa_netmask;
-    union {
-        struct sockaddr* ifu_broadaddr;
-        struct sockaddr* ifu_dstaddr;
-    } ifa_ifu;
-    void* ifa_data;
+  struct ifaddrs* ifa_next;
+  char* ifa_name;
+  unsigned ifa_flags;
+  struct sockaddr* ifa_addr;
+  struct sockaddr* ifa_netmask;
+  union {
+    struct sockaddr* ifu_broadaddr;
+    struct sockaddr* ifu_dstaddr;
+  } ifa_ifu;
+  void* ifa_data;
 };
 #define ifa_broadaddr ifa_ifu.ifu_broadaddr
 #define ifa_dstaddr ifa_ifu.ifu_dstaddr
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_IFADDRS_H_
diff --git a/arch/x64/sysroot/include/inttypes.h b/arch/x64/sysroot/include/inttypes.h
index db1b4d3..43bf604 100644
--- a/arch/x64/sysroot/include/inttypes.h
+++ b/arch/x64/sysroot/include/inttypes.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_INTTYPES_H_
+#define SYSROOT_INTTYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,7 +10,9 @@
 #define __NEED_wchar_t
 #include <bits/alltypes.h>
 
-typedef struct { intmax_t quot, rem; } imaxdiv_t;
+typedef struct {
+  intmax_t quot, rem;
+} imaxdiv_t;
 
 intmax_t imaxabs(intmax_t);
 imaxdiv_t imaxdiv(intmax_t, intmax_t);
@@ -138,7 +141,6 @@
 
 #endif
 
-
 #define PRId8 __INT8_FMTd__
 #define PRId16 __INT16_FMTd__
 #define PRId32 __INT32_FMTd__
@@ -350,3 +352,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_INTTYPES_H_
diff --git a/arch/x64/sysroot/include/iso646.h b/arch/x64/sysroot/include/iso646.h
index 59e7e16..8b7dda8 100644
--- a/arch/x64/sysroot/include/iso646.h
+++ b/arch/x64/sysroot/include/iso646.h
@@ -1,13 +1,14 @@
-#pragma once
+#ifndef SYSROOT_ISO646_H_
+#define SYSROOT_ISO646_H_
 
 #ifndef __cplusplus
 
-#define and&&
+#define and &&
 #define and_eq &=
-#define bitand&
+#define bitand &
 #define bitor |
-#define compl~
-#define not!
+#define compl ~
+#define not !
 #define not_eq !=
 #define or ||
 #define or_eq |=
@@ -15,3 +16,5 @@
 #define xor_eq ^=
 
 #endif
+
+#endif  // SYSROOT_ISO646_H_
diff --git a/arch/x64/sysroot/include/langinfo.h b/arch/x64/sysroot/include/langinfo.h
index 0ee81bb..a14fcfd 100644
--- a/arch/x64/sysroot/include/langinfo.h
+++ b/arch/x64/sysroot/include/langinfo.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LANGINFO_H_
+#define SYSROOT_LANGINFO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -87,3 +88,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LANGINFO_H_
diff --git a/arch/x64/sysroot/include/libgen.h b/arch/x64/sysroot/include/libgen.h
index 546dce0..f7f79b6 100644
--- a/arch/x64/sysroot/include/libgen.h
+++ b/arch/x64/sysroot/include/libgen.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LIBGEN_H_
+#define SYSROOT_LIBGEN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,3 +11,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LIBGEN_H_
diff --git a/arch/x64/sysroot/include/limits.h b/arch/x64/sysroot/include/limits.h
index 290ef73..cf60386 100644
--- a/arch/x64/sysroot/include/limits.h
+++ b/arch/x64/sysroot/include/limits.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LIMITS_H_
+#define SYSROOT_LIMITS_H_
 
 #include <features.h>
 
@@ -48,7 +49,6 @@
 #define PATH_MAX 4096
 #define NZERO 20
 #define NGROUPS_MAX 32
-#define ARG_MAX 131072
 #define IOV_MAX 1024
 #define SYMLOOP_MAX 40
 #define WORD_BIT 32
@@ -149,3 +149,5 @@
 #define _XOPEN_IOV_MAX 16
 #define _XOPEN_NAME_MAX 255
 #define _XOPEN_PATH_MAX 1024
+
+#endif  // SYSROOT_LIMITS_H_
diff --git a/arch/x64/sysroot/include/link.h b/arch/x64/sysroot/include/link.h
index 657e9a0..78ebd48 100644
--- a/arch/x64/sysroot/include/link.h
+++ b/arch/x64/sysroot/include/link.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_LINK_H_
+#define SYSROOT_LINK_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,31 +16,40 @@
 typedef uint32_t Elf_Symndx;
 
 struct dl_phdr_info {
-    ElfW(Addr) dlpi_addr;
-    const char* dlpi_name;
-    const ElfW(Phdr) * dlpi_phdr;
-    ElfW(Half) dlpi_phnum;
-    unsigned long long int dlpi_adds;
-    unsigned long long int dlpi_subs;
-    size_t dlpi_tls_modid;
-    void* dlpi_tls_data;
+  ElfW(Addr) dlpi_addr;
+  const char* dlpi_name;
+  const ElfW(Phdr) * dlpi_phdr;
+  ElfW(Half) dlpi_phnum;
+  unsigned long long int dlpi_adds;
+  unsigned long long int dlpi_subs;
+  size_t dlpi_tls_modid;
+  void* dlpi_tls_data;
 };
 
 struct link_map {
-    ElfW(Addr) l_addr;
-    char* l_name;
-    ElfW(Dyn) * l_ld;
-    struct link_map *l_next, *l_prev;
+  ElfW(Addr) l_addr;
+  char* l_name;
+  ElfW(Dyn) * l_ld;
+  struct link_map *l_next, *l_prev;
 };
 
 struct r_debug {
-    int r_version;
-    struct link_map* r_map;
-    ElfW(Addr) r_brk;
-    enum { RT_CONSISTENT,
-           RT_ADD,
-           RT_DELETE } r_state;
-    ElfW(Addr) r_ldbase;
+  int r_version;
+  struct link_map* r_map;
+  ElfW(Addr) r_brk;
+
+  /* This is the address of a function internal to the run-time linker
+     that triggers a debug trap. This function will always be called
+     when the linker begins to map in a library or unmap it, and again
+     when the mapping change is complete.
+
+     The debugger can compare the address of a sw exception to this value
+     to determine whether the debug trap was triggered by the run-time
+     linker. */
+  ElfW(Addr) r_brk_on_load;
+
+  enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
+  ElfW(Addr) r_ldbase;
 };
 
 int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*);
@@ -47,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LINK_H_
diff --git a/arch/x64/sysroot/include/locale.h b/arch/x64/sysroot/include/locale.h
index 44f8d0b..ce78a02 100644
--- a/arch/x64/sysroot/include/locale.h
+++ b/arch/x64/sysroot/include/locale.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_LOCALE_H_
+#define SYSROOT_LOCALE_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define LC_CTYPE 0
@@ -16,31 +18,31 @@
 #define LC_ALL 6
 
 struct lconv {
-    char* decimal_point;
-    char* thousands_sep;
-    char* grouping;
+  char* decimal_point;
+  char* thousands_sep;
+  char* grouping;
 
-    char* int_curr_symbol;
-    char* currency_symbol;
-    char* mon_decimal_point;
-    char* mon_thousands_sep;
-    char* mon_grouping;
-    char* positive_sign;
-    char* negative_sign;
-    char int_frac_digits;
-    char frac_digits;
-    char p_cs_precedes;
-    char p_sep_by_space;
-    char n_cs_precedes;
-    char n_sep_by_space;
-    char p_sign_posn;
-    char n_sign_posn;
-    char int_p_cs_precedes;
-    char int_p_sep_by_space;
-    char int_n_cs_precedes;
-    char int_n_sep_by_space;
-    char int_p_sign_posn;
-    char int_n_sign_posn;
+  char* int_curr_symbol;
+  char* currency_symbol;
+  char* mon_decimal_point;
+  char* mon_thousands_sep;
+  char* mon_grouping;
+  char* positive_sign;
+  char* negative_sign;
+  char int_frac_digits;
+  char frac_digits;
+  char p_cs_precedes;
+  char p_sep_by_space;
+  char n_cs_precedes;
+  char n_sep_by_space;
+  char p_sign_posn;
+  char n_sign_posn;
+  char int_p_cs_precedes;
+  char int_p_sep_by_space;
+  char int_n_cs_precedes;
+  char int_n_sep_by_space;
+  char int_p_sign_posn;
+  char int_n_sign_posn;
 };
 
 char* setlocale(int, const char*);
@@ -73,3 +75,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_LOCALE_H_
diff --git a/arch/x64/sysroot/include/malloc.h b/arch/x64/sysroot/include/malloc.h
index d057b89..6abb854 100644
--- a/arch/x64/sysroot/include/malloc.h
+++ b/arch/x64/sysroot/include/malloc.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MALLOC_H_
+#define SYSROOT_MALLOC_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MALLOC_H_
diff --git a/arch/x64/sysroot/include/math.h b/arch/x64/sysroot/include/math.h
index a32ec07..089c266 100644
--- a/arch/x64/sysroot/include/math.h
+++ b/arch/x64/sysroot/include/math.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MATH_H_
+#define SYSROOT_MATH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,67 +41,63 @@
 int __fpclassifyl(long double);
 
 static __inline unsigned __FLOAT_BITS(float __f) {
-    union {
-        float __f;
-        unsigned __i;
-    } __u;
-    __u.__f = __f;
-    return __u.__i;
+  union {
+    float __f;
+    unsigned __i;
+  } __u;
+  __u.__f = __f;
+  return __u.__i;
 }
 static __inline unsigned long long __DOUBLE_BITS(double __f) {
-    union {
-        double __f;
-        unsigned long long __i;
-    } __u;
-    __u.__f = __f;
-    return __u.__i;
+  union {
+    double __f;
+    unsigned long long __i;
+  } __u;
+  __u.__f = __f;
+  return __u.__i;
 }
 
-#define fpclassify(x)                                                            \
-    (sizeof(x) == sizeof(float) ? __fpclassifyf(x) : sizeof(x) == sizeof(double) \
-                                                         ? __fpclassify(x)       \
-                                                         : __fpclassifyl(x))
+#define fpclassify(x)                            \
+  (sizeof(x) == sizeof(float) ? __fpclassifyf(x) \
+                              : sizeof(x) == sizeof(double) ? __fpclassify(x) : __fpclassifyl(x))
 
-#define isinf(x)                                                                           \
-    (sizeof(x) == sizeof(float)                                                            \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) == 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) == FP_INFINITE)
+#define isinf(x)                                                                         \
+  (sizeof(x) == sizeof(float)                                                            \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) == 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) == FP_INFINITE)
 
-#define isnan(x)                                                                          \
-    (sizeof(x) == sizeof(float)                                                           \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) > 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) == FP_NAN)
+#define isnan(x)                                                                        \
+  (sizeof(x) == sizeof(float)                                                           \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) > 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) == FP_NAN)
 
-#define isnormal(x)                                                             \
-    (sizeof(x) == sizeof(float)                                                 \
-         ? ((__FLOAT_BITS(x) + 0x00800000) & 0x7fffffff) >= 0x01000000          \
-         : sizeof(x) == sizeof(double)                                          \
-               ? ((__DOUBLE_BITS(x) + (1ULL << 52)) & -1ULL >> 1) >= 1ULL << 53 \
-               : __fpclassifyl(x) == FP_NORMAL)
+#define isnormal(x)                                                                                \
+  (sizeof(x) == sizeof(float) ? ((__FLOAT_BITS(x) + 0x00800000) & 0x7fffffff) >= 0x01000000        \
+                              : sizeof(x) == sizeof(double) ? ((__DOUBLE_BITS(x) + (1ULL << 52)) & \
+                                                               -1ULL >> 1) >= 1ULL << 53           \
+                                                            : __fpclassifyl(x) == FP_NORMAL)
 
-#define isfinite(x)                                                                       \
-    (sizeof(x) == sizeof(float)                                                           \
-         ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000                                    \
-         : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) < 0x7ffULL << 52 \
-                                       : __fpclassifyl(x) > FP_INFINITE)
+#define isfinite(x)                                                                     \
+  (sizeof(x) == sizeof(float)                                                           \
+       ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000                                    \
+       : sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL >> 1) < 0x7ffULL << 52 \
+                                     : __fpclassifyl(x) > FP_INFINITE)
 
 int __signbit(double);
 int __signbitf(float);
 int __signbitl(long double);
 
-#define signbit(x)                      \
-    (sizeof(x) == sizeof(float)         \
-         ? (int)(__FLOAT_BITS(x) >> 31) \
-         : sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x) >> 63) : __signbitl(x))
+#define signbit(x)                    \
+  (sizeof(x) == sizeof(float)         \
+       ? (int)(__FLOAT_BITS(x) >> 31) \
+       : sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x) >> 63) : __signbitl(x))
 
 #define isunordered(x, y) __builtin_isunordered(x, y)
 
-#define __ISREL_DEF(rel, op, type)                      \
-    static __inline int __is##rel(type __x, type __y) { \
-        return !isunordered(__x, __y) && __x op __y;    \
-    }
+#define __ISREL_DEF(rel, op, type) \
+  static __inline int __is##rel(type __x, type __y) { return !isunordered(__x, __y) && __x op __y; }
 
 __ISREL_DEF(lessf, <, float_t)
 __ISREL_DEF(less, <, double_t)
@@ -429,3 +426,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MATH_H_
diff --git a/arch/x64/sysroot/include/monetary.h b/arch/x64/sysroot/include/monetary.h
index b6081b9..d1955fa 100644
--- a/arch/x64/sysroot/include/monetary.h
+++ b/arch/x64/sysroot/include/monetary.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_MONETARY_H_
+#define SYSROOT_MONETARY_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_MONETARY_H_
diff --git a/arch/x64/sysroot/include/net/ethernet.h b/arch/x64/sysroot/include/net/ethernet.h
index 41dab8b..9cee87d 100644
--- a/arch/x64/sysroot/include/net/ethernet.h
+++ b/arch/x64/sysroot/include/net/ethernet.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_ETHERNET_H_
+#define SYSROOT_NET_ETHERNET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,13 +10,13 @@
 #include <sys/types.h>
 
 struct ether_addr {
-    uint8_t ether_addr_octet[ETH_ALEN];
+  uint8_t ether_addr_octet[ETH_ALEN];
 };
 
 struct ether_header {
-    uint8_t ether_dhost[ETH_ALEN];
-    uint8_t ether_shost[ETH_ALEN];
-    uint16_t ether_type;
+  uint8_t ether_dhost[ETH_ALEN];
+  uint8_t ether_shost[ETH_ALEN];
+  uint16_t ether_type;
 };
 
 #define ETHERTYPE_PUP 0x0200
@@ -48,3 +49,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_ETHERNET_H_
diff --git a/arch/x64/sysroot/include/net/if.h b/arch/x64/sysroot/include/net/if.h
index 687175b..e97c3ee 100644
--- a/arch/x64/sysroot/include/net/if.h
+++ b/arch/x64/sysroot/include/net/if.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_IF_H_
+#define SYSROOT_NET_IF_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,8 +10,8 @@
 #define IF_NAMESIZE 16
 
 struct if_nameindex {
-    unsigned int if_index;
-    char* if_name;
+  unsigned int if_index;
+  char* if_name;
 };
 
 unsigned int if_nametoindex(const char*);
@@ -41,53 +42,53 @@
 #define IFF_LOWER_UP 0x10000
 #define IFF_DORMANT 0x20000
 #define IFF_ECHO 0x40000
-#define IFF_VOLATILE                                                                      \
-    (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST | IFF_ECHO | IFF_MASTER | IFF_SLAVE | \
-     IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)
+#define IFF_VOLATILE                                                                    \
+  (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST | IFF_ECHO | IFF_MASTER | IFF_SLAVE | \
+   IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)
 
 struct ifaddr {
-    struct sockaddr ifa_addr;
-    union {
-        struct sockaddr ifu_broadaddr;
-        struct sockaddr ifu_dstaddr;
-    } ifa_ifu;
-    struct iface* ifa_ifp;
-    struct ifaddr* ifa_next;
+  struct sockaddr ifa_addr;
+  union {
+    struct sockaddr ifu_broadaddr;
+    struct sockaddr ifu_dstaddr;
+  } ifa_ifu;
+  struct iface* ifa_ifp;
+  struct ifaddr* ifa_next;
 };
 
 #define ifa_broadaddr ifa_ifu.ifu_broadaddr
 #define ifa_dstaddr ifa_ifu.ifu_dstaddr
 
 struct ifmap {
-    unsigned long int mem_start;
-    unsigned long int mem_end;
-    unsigned short int base_addr;
-    unsigned char irq;
-    unsigned char dma;
-    unsigned char port;
+  unsigned long int mem_start;
+  unsigned long int mem_end;
+  unsigned short int base_addr;
+  unsigned char irq;
+  unsigned char dma;
+  unsigned char port;
 };
 
 #define IFHWADDRLEN 6
 #define IFNAMSIZ IF_NAMESIZE
 
 struct ifreq {
-    union {
-        char ifrn_name[IFNAMSIZ];
-    } ifr_ifrn;
-    union {
-        struct sockaddr ifru_addr;
-        struct sockaddr ifru_dstaddr;
-        struct sockaddr ifru_broadaddr;
-        struct sockaddr ifru_netmask;
-        struct sockaddr ifru_hwaddr;
-        short int ifru_flags;
-        int ifru_ivalue;
-        int ifru_mtu;
-        struct ifmap ifru_map;
-        char ifru_slave[IFNAMSIZ];
-        char ifru_newname[IFNAMSIZ];
-        void* ifru_data;
-    } ifr_ifru;
+  union {
+    char ifrn_name[IFNAMSIZ];
+  } ifr_ifrn;
+  union {
+    struct sockaddr ifru_addr;
+    struct sockaddr ifru_dstaddr;
+    struct sockaddr ifru_broadaddr;
+    struct sockaddr ifru_netmask;
+    struct sockaddr ifru_hwaddr;
+    short int ifru_flags;
+    int ifru_ivalue;
+    int ifru_mtu;
+    struct ifmap ifru_map;
+    char ifru_slave[IFNAMSIZ];
+    char ifru_newname[IFNAMSIZ];
+    void* ifru_data;
+  } ifr_ifru;
 };
 
 #define ifr_name ifr_ifrn.ifrn_name
@@ -111,11 +112,11 @@
 #define _IOT_ifreq_int _IOT(_IOTS(char), IFNAMSIZ, _IOTS(int), 1, 0, 0)
 
 struct ifconf {
-    int ifc_len;
-    union {
-        void* ifcu_buf;
-        struct ifreq* ifcu_req;
-    } ifc_ifcu;
+  int ifc_len;
+  union {
+    void* ifcu_buf;
+    struct ifreq* ifcu_req;
+  } ifc_ifcu;
 };
 
 #define ifc_buf ifc_ifcu.ifcu_buf
@@ -127,3 +128,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_IF_H_
diff --git a/arch/x64/sysroot/include/net/if_arp.h b/arch/x64/sysroot/include/net/if_arp.h
index 6da9341..40b902d 100644
--- a/arch/x64/sysroot/include/net/if_arp.h
+++ b/arch/x64/sysroot/include/net/if_arp.h
@@ -1,6 +1,7 @@
 /* Nonstandard header */
 
-#pragma once
+#ifndef SYSROOT_NET_IF_ARP_H_
+#define SYSROOT_NET_IF_ARP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -21,11 +22,11 @@
 #define ARPOP_NAK 10
 
 struct arphdr {
-    uint16_t ar_hrd;
-    uint16_t ar_pro;
-    uint8_t ar_hln;
-    uint8_t ar_pln;
-    uint16_t ar_op;
+  uint16_t ar_hrd;
+  uint16_t ar_pro;
+  uint8_t ar_hln;
+  uint8_t ar_pln;
+  uint16_t ar_op;
 };
 
 #define ARPHRD_NETROM 0
@@ -96,18 +97,18 @@
 #define ARPHRD_NONE 0xFFFE
 
 struct arpreq {
-    struct sockaddr arp_pa;
-    struct sockaddr arp_ha;
-    int arp_flags;
-    struct sockaddr arp_netmask;
-    char arp_dev[16];
+  struct sockaddr arp_pa;
+  struct sockaddr arp_ha;
+  int arp_flags;
+  struct sockaddr arp_netmask;
+  char arp_dev[16];
 };
 
 struct arpreq_old {
-    struct sockaddr arp_pa;
-    struct sockaddr arp_ha;
-    int arp_flags;
-    struct sockaddr arp_netmask;
+  struct sockaddr arp_pa;
+  struct sockaddr arp_ha;
+  int arp_flags;
+  struct sockaddr arp_netmask;
 };
 
 #define ATF_COM 0x02
@@ -123,14 +124,16 @@
 #define ARPD_FLUSH 0x03
 
 struct arpd_request {
-    unsigned short req;
-    uint32_t ip;
-    unsigned long dev;
-    unsigned long stamp;
-    unsigned long updated;
-    unsigned char ha[MAX_ADDR_LEN];
+  unsigned short req;
+  uint32_t ip;
+  unsigned long dev;
+  unsigned long stamp;
+  unsigned long updated;
+  unsigned char ha[MAX_ADDR_LEN];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_IF_ARP_H_
diff --git a/arch/x64/sysroot/include/net/route.h b/arch/x64/sysroot/include/net/route.h
index 5d2d3d0..dc5960b 100644
--- a/arch/x64/sysroot/include/net/route.h
+++ b/arch/x64/sysroot/include/net/route.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NET_ROUTE_H_
+#define SYSROOT_NET_ROUTE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,36 +11,36 @@
 #include <sys/types.h>
 
 struct rtentry {
-    unsigned long int rt_pad1;
-    struct sockaddr rt_dst;
-    struct sockaddr rt_gateway;
-    struct sockaddr rt_genmask;
-    unsigned short int rt_flags;
-    short int rt_pad2;
-    unsigned long int rt_pad3;
-    unsigned char rt_tos;
-    unsigned char rt_class;
-    short int rt_pad4[sizeof(long) / 2 - 1];
-    short int rt_metric;
-    char* rt_dev;
-    unsigned long int rt_mtu;
-    unsigned long int rt_window;
-    unsigned short int rt_irtt;
+  unsigned long int rt_pad1;
+  struct sockaddr rt_dst;
+  struct sockaddr rt_gateway;
+  struct sockaddr rt_genmask;
+  unsigned short int rt_flags;
+  short int rt_pad2;
+  unsigned long int rt_pad3;
+  unsigned char rt_tos;
+  unsigned char rt_class;
+  short int rt_pad4[sizeof(long) / 2 - 1];
+  short int rt_metric;
+  char* rt_dev;
+  unsigned long int rt_mtu;
+  unsigned long int rt_window;
+  unsigned short int rt_irtt;
 };
 
 #define rt_mss rt_mtu
 
 struct in6_rtmsg {
-    struct in6_addr rtmsg_dst;
-    struct in6_addr rtmsg_src;
-    struct in6_addr rtmsg_gateway;
-    uint32_t rtmsg_type;
-    uint16_t rtmsg_dst_len;
-    uint16_t rtmsg_src_len;
-    uint32_t rtmsg_metric;
-    unsigned long int rtmsg_info;
-    uint32_t rtmsg_flags;
-    int rtmsg_ifindex;
+  struct in6_addr rtmsg_dst;
+  struct in6_addr rtmsg_src;
+  struct in6_addr rtmsg_gateway;
+  uint32_t rtmsg_type;
+  uint16_t rtmsg_dst_len;
+  uint16_t rtmsg_src_len;
+  uint32_t rtmsg_metric;
+  unsigned long int rtmsg_info;
+  uint32_t rtmsg_flags;
+  int rtmsg_ifindex;
 };
 
 #define RTF_UP 0x0001
@@ -114,3 +115,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NET_ROUTE_H_
diff --git a/arch/x64/sysroot/include/netdb.h b/arch/x64/sysroot/include/netdb.h
index 5b8ab72..d5bb5ef 100644
--- a/arch/x64/sysroot/include/netdb.h
+++ b/arch/x64/sysroot/include/netdb.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETDB_H_
+#define SYSROOT_NETDB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -13,14 +14,14 @@
 #endif
 
 struct addrinfo {
-    int ai_flags;
-    int ai_family;
-    int ai_socktype;
-    int ai_protocol;
-    socklen_t ai_addrlen;
-    struct sockaddr* ai_addr;
-    char* ai_canonname;
-    struct addrinfo* ai_next;
+  int ai_flags;
+  int ai_family;
+  int ai_socktype;
+  int ai_protocol;
+  socklen_t ai_addrlen;
+  struct sockaddr* ai_addr;
+  char* ai_canonname;
+  struct addrinfo* ai_next;
 };
 
 #define IPPORT_RESERVED 1024
@@ -61,32 +62,32 @@
 /* Legacy functions follow (marked OBsolete in SUS) */
 
 struct netent {
-    char* n_name;
-    char** n_aliases;
-    int n_addrtype;
-    uint32_t n_net;
+  char* n_name;
+  char** n_aliases;
+  int n_addrtype;
+  uint32_t n_net;
 };
 
 struct hostent {
-    char* h_name;
-    char** h_aliases;
-    int h_addrtype;
-    int h_length;
-    char** h_addr_list;
+  char* h_name;
+  char** h_aliases;
+  int h_addrtype;
+  int h_length;
+  char** h_addr_list;
 };
 #define h_addr h_addr_list[0]
 
 struct servent {
-    char* s_name;
-    char** s_aliases;
-    int s_port;
-    char* s_proto;
+  char* s_name;
+  char** s_aliases;
+  int s_port;
+  char* s_proto;
 };
 
 struct protoent {
-    char* p_name;
-    char** p_aliases;
-    int p_proto;
+  char* p_name;
+  char** p_aliases;
+  int p_proto;
 };
 
 void sethostent(int);
@@ -150,3 +151,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETDB_H_
diff --git a/arch/x64/sysroot/include/netinet/ether.h b/arch/x64/sysroot/include/netinet/ether.h
index 0a65077..74668fb 100644
--- a/arch/x64/sysroot/include/netinet/ether.h
+++ b/arch/x64/sysroot/include/netinet/ether.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_ETHER_H_
+#define SYSROOT_NETINET_ETHER_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_ETHER_H_
diff --git a/arch/x64/sysroot/include/netinet/icmp6.h b/arch/x64/sysroot/include/netinet/icmp6.h
index 9a50bcd..dde64cb 100644
--- a/arch/x64/sysroot/include/netinet/icmp6.h
+++ b/arch/x64/sysroot/include/netinet/icmp6.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_ICMP6_H_
+#define SYSROOT_NETINET_ICMP6_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,18 +18,18 @@
 #define ICMP6_FILTER_PASSONLY 4
 
 struct icmp6_filter {
-    uint32_t icmp6_filt[8];
+  uint32_t icmp6_filt[8];
 };
 
 struct icmp6_hdr {
-    uint8_t icmp6_type;
-    uint8_t icmp6_code;
-    uint16_t icmp6_cksum;
-    union {
-        uint32_t icmp6_un_data32[1];
-        uint16_t icmp6_un_data16[2];
-        uint8_t icmp6_un_data8[4];
-    } icmp6_dataun;
+  uint8_t icmp6_type;
+  uint8_t icmp6_code;
+  uint16_t icmp6_cksum;
+  union {
+    uint32_t icmp6_un_data32[1];
+    uint16_t icmp6_un_data16[2];
+    uint8_t icmp6_un_data8[4];
+  } icmp6_dataun;
 };
 
 #define icmp6_data32 icmp6_dataun.icmp6_un_data32
@@ -67,16 +68,16 @@
 #define ICMP6_PARAMPROB_OPTION 2
 
 #define ICMP6_FILTER_WILLPASS(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) == 0)
+  ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) == 0)
 
 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) != 0)
+  ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type)&31))) != 0)
 
 #define ICMP6_FILTER_SETPASS(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type)&31))))
+  ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type)&31))))
 
 #define ICMP6_FILTER_SETBLOCK(type, filterp) \
-    ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type)&31))))
+  ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type)&31))))
 
 #define ICMP6_FILTER_SETPASSALL(filterp) memset(filterp, 0, sizeof(struct icmp6_filter));
 
@@ -89,7 +90,7 @@
 #define ND_REDIRECT 137
 
 struct nd_router_solicit {
-    struct icmp6_hdr nd_rs_hdr;
+  struct icmp6_hdr nd_rs_hdr;
 };
 
 #define nd_rs_type nd_rs_hdr.icmp6_type
@@ -98,9 +99,9 @@
 #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
 
 struct nd_router_advert {
-    struct icmp6_hdr nd_ra_hdr;
-    uint32_t nd_ra_reachable;
-    uint32_t nd_ra_retransmit;
+  struct icmp6_hdr nd_ra_hdr;
+  uint32_t nd_ra_reachable;
+  uint32_t nd_ra_retransmit;
 };
 
 #define nd_ra_type nd_ra_hdr.icmp6_type
@@ -114,8 +115,8 @@
 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
 
 struct nd_neighbor_solicit {
-    struct icmp6_hdr nd_ns_hdr;
-    struct in6_addr nd_ns_target;
+  struct icmp6_hdr nd_ns_hdr;
+  struct in6_addr nd_ns_target;
 };
 
 #define nd_ns_type nd_ns_hdr.icmp6_type
@@ -124,8 +125,8 @@
 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
 
 struct nd_neighbor_advert {
-    struct icmp6_hdr nd_na_hdr;
-    struct in6_addr nd_na_target;
+  struct icmp6_hdr nd_na_hdr;
+  struct in6_addr nd_na_target;
 };
 
 #define nd_na_type nd_na_hdr.icmp6_type
@@ -143,9 +144,9 @@
 #endif
 
 struct nd_redirect {
-    struct icmp6_hdr nd_rd_hdr;
-    struct in6_addr nd_rd_target;
-    struct in6_addr nd_rd_dst;
+  struct icmp6_hdr nd_rd_hdr;
+  struct in6_addr nd_rd_target;
+  struct in6_addr nd_rd_dst;
 };
 
 #define nd_rd_type nd_rd_hdr.icmp6_type
@@ -154,8 +155,8 @@
 #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
 
 struct nd_opt_hdr {
-    uint8_t nd_opt_type;
-    uint8_t nd_opt_len;
+  uint8_t nd_opt_type;
+  uint8_t nd_opt_len;
 };
 
 #define ND_OPT_SOURCE_LINKADDR 1
@@ -167,14 +168,14 @@
 #define ND_OPT_HOME_AGENT_INFO 8
 
 struct nd_opt_prefix_info {
-    uint8_t nd_opt_pi_type;
-    uint8_t nd_opt_pi_len;
-    uint8_t nd_opt_pi_prefix_len;
-    uint8_t nd_opt_pi_flags_reserved;
-    uint32_t nd_opt_pi_valid_time;
-    uint32_t nd_opt_pi_preferred_time;
-    uint32_t nd_opt_pi_reserved2;
-    struct in6_addr nd_opt_pi_prefix;
+  uint8_t nd_opt_pi_type;
+  uint8_t nd_opt_pi_len;
+  uint8_t nd_opt_pi_prefix_len;
+  uint8_t nd_opt_pi_flags_reserved;
+  uint32_t nd_opt_pi_valid_time;
+  uint32_t nd_opt_pi_preferred_time;
+  uint32_t nd_opt_pi_reserved2;
+  struct in6_addr nd_opt_pi_prefix;
 };
 
 #define ND_OPT_PI_FLAG_ONLINK 0x80
@@ -182,22 +183,22 @@
 #define ND_OPT_PI_FLAG_RADDR 0x20
 
 struct nd_opt_rd_hdr {
-    uint8_t nd_opt_rh_type;
-    uint8_t nd_opt_rh_len;
-    uint16_t nd_opt_rh_reserved1;
-    uint32_t nd_opt_rh_reserved2;
+  uint8_t nd_opt_rh_type;
+  uint8_t nd_opt_rh_len;
+  uint16_t nd_opt_rh_reserved1;
+  uint32_t nd_opt_rh_reserved2;
 };
 
 struct nd_opt_mtu {
-    uint8_t nd_opt_mtu_type;
-    uint8_t nd_opt_mtu_len;
-    uint16_t nd_opt_mtu_reserved;
-    uint32_t nd_opt_mtu_mtu;
+  uint8_t nd_opt_mtu_type;
+  uint8_t nd_opt_mtu_len;
+  uint16_t nd_opt_mtu_reserved;
+  uint32_t nd_opt_mtu_mtu;
 };
 
 struct mld_hdr {
-    struct icmp6_hdr mld_icmp6_hdr;
-    struct in6_addr mld_addr;
+  struct icmp6_hdr mld_icmp6_hdr;
+  struct in6_addr mld_addr;
 };
 
 #define mld_type mld_icmp6_hdr.icmp6_type
@@ -209,11 +210,11 @@
 #define ICMP6_ROUTER_RENUMBERING 138
 
 struct icmp6_router_renum {
-    struct icmp6_hdr rr_hdr;
-    uint8_t rr_segnum;
-    uint8_t rr_flags;
-    uint16_t rr_maxdelay;
-    uint32_t rr_reserved;
+  struct icmp6_hdr rr_hdr;
+  uint8_t rr_segnum;
+  uint8_t rr_flags;
+  uint16_t rr_maxdelay;
+  uint32_t rr_reserved;
 };
 
 #define rr_type rr_hdr.icmp6_type
@@ -228,14 +229,14 @@
 #define ICMP6_RR_FLAGS_PREVDONE 0x08
 
 struct rr_pco_match {
-    uint8_t rpm_code;
-    uint8_t rpm_len;
-    uint8_t rpm_ordinal;
-    uint8_t rpm_matchlen;
-    uint8_t rpm_minlen;
-    uint8_t rpm_maxlen;
-    uint16_t rpm_reserved;
-    struct in6_addr rpm_prefix;
+  uint8_t rpm_code;
+  uint8_t rpm_len;
+  uint8_t rpm_ordinal;
+  uint8_t rpm_matchlen;
+  uint8_t rpm_minlen;
+  uint8_t rpm_maxlen;
+  uint16_t rpm_reserved;
+  struct in6_addr rpm_prefix;
 };
 
 #define RPM_PCO_ADD 1
@@ -243,14 +244,14 @@
 #define RPM_PCO_SETGLOBAL 3
 
 struct rr_pco_use {
-    uint8_t rpu_uselen;
-    uint8_t rpu_keeplen;
-    uint8_t rpu_ramask;
-    uint8_t rpu_raflags;
-    uint32_t rpu_vltime;
-    uint32_t rpu_pltime;
-    uint32_t rpu_flags;
-    struct in6_addr rpu_prefix;
+  uint8_t rpu_uselen;
+  uint8_t rpu_keeplen;
+  uint8_t rpu_ramask;
+  uint8_t rpu_raflags;
+  uint32_t rpu_vltime;
+  uint32_t rpu_pltime;
+  uint32_t rpu_flags;
+  struct in6_addr rpu_prefix;
 };
 
 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
@@ -265,11 +266,11 @@
 #endif
 
 struct rr_result {
-    uint16_t rrr_flags;
-    uint8_t rrr_ordinal;
-    uint8_t rrr_matchedlen;
-    uint32_t rrr_ifid;
-    struct in6_addr rrr_prefix;
+  uint16_t rrr_flags;
+  uint8_t rrr_ordinal;
+  uint8_t rrr_matchedlen;
+  uint32_t rrr_ifid;
+  struct in6_addr rrr_prefix;
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -281,20 +282,22 @@
 #endif
 
 struct nd_opt_adv_interval {
-    uint8_t nd_opt_adv_interval_type;
-    uint8_t nd_opt_adv_interval_len;
-    uint16_t nd_opt_adv_interval_reserved;
-    uint32_t nd_opt_adv_interval_ival;
+  uint8_t nd_opt_adv_interval_type;
+  uint8_t nd_opt_adv_interval_len;
+  uint16_t nd_opt_adv_interval_reserved;
+  uint32_t nd_opt_adv_interval_ival;
 };
 
 struct nd_opt_home_agent_info {
-    uint8_t nd_opt_home_agent_info_type;
-    uint8_t nd_opt_home_agent_info_len;
-    uint16_t nd_opt_home_agent_info_reserved;
-    uint16_t nd_opt_home_agent_info_preference;
-    uint16_t nd_opt_home_agent_info_lifetime;
+  uint8_t nd_opt_home_agent_info_type;
+  uint8_t nd_opt_home_agent_info_len;
+  uint16_t nd_opt_home_agent_info_reserved;
+  uint16_t nd_opt_home_agent_info_preference;
+  uint16_t nd_opt_home_agent_info_lifetime;
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_ICMP6_H_
diff --git a/arch/x64/sysroot/include/netinet/if_ether.h b/arch/x64/sysroot/include/netinet/if_ether.h
index ee7d38e..f826e96 100644
--- a/arch/x64/sysroot/include/netinet/if_ether.h
+++ b/arch/x64/sysroot/include/netinet/if_ether.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IF_ETHER_H_
+#define SYSROOT_NETINET_IF_ETHER_H_
 
 #include <stdint.h>
 #include <sys/types.h>
@@ -93,20 +94,20 @@
 #define ETH_P_CAIF 0x00F7
 
 struct ethhdr {
-    uint8_t h_dest[ETH_ALEN];
-    uint8_t h_source[ETH_ALEN];
-    uint16_t h_proto;
+  uint8_t h_dest[ETH_ALEN];
+  uint8_t h_source[ETH_ALEN];
+  uint16_t h_proto;
 };
 
 #include <net/ethernet.h>
 #include <net/if_arp.h>
 
 struct ether_arp {
-    struct arphdr ea_hdr;
-    uint8_t arp_sha[ETH_ALEN];
-    uint8_t arp_spa[4];
-    uint8_t arp_tha[ETH_ALEN];
-    uint8_t arp_tpa[4];
+  struct arphdr ea_hdr;
+  uint8_t arp_sha[ETH_ALEN];
+  uint8_t arp_spa[4];
+  uint8_t arp_tha[ETH_ALEN];
+  uint8_t arp_tpa[4];
 };
 #define arp_hrd ea_hdr.ar_hrd
 #define arp_pro ea_hdr.ar_pro
@@ -114,12 +115,14 @@
 #define arp_pln ea_hdr.ar_pln
 #define arp_op ea_hdr.ar_op
 
-#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)      \
-    do {                                            \
-        (enaddr)[0] = 0x01;                         \
-        (enaddr)[1] = 0x00;                         \
-        (enaddr)[2] = 0x5e;                         \
-        (enaddr)[3] = ((uint8_t*)ipaddr)[1] & 0x7f; \
-        (enaddr)[4] = ((uint8_t*)ipaddr)[2];        \
-        (enaddr)[5] = ((uint8_t*)ipaddr)[3];        \
-    } while (0)
+#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr)  \
+  do {                                          \
+    (enaddr)[0] = 0x01;                         \
+    (enaddr)[1] = 0x00;                         \
+    (enaddr)[2] = 0x5e;                         \
+    (enaddr)[3] = ((uint8_t*)ipaddr)[1] & 0x7f; \
+    (enaddr)[4] = ((uint8_t*)ipaddr)[2];        \
+    (enaddr)[5] = ((uint8_t*)ipaddr)[3];        \
+  } while (0)
+
+#endif  // SYSROOT_NETINET_IF_ETHER_H_
diff --git a/arch/x64/sysroot/include/netinet/igmp.h b/arch/x64/sysroot/include/netinet/igmp.h
index a59a1cc..99eb989 100644
--- a/arch/x64/sysroot/include/netinet/igmp.h
+++ b/arch/x64/sysroot/include/netinet/igmp.h
@@ -1,13 +1,14 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IGMP_H_
+#define SYSROOT_NETINET_IGMP_H_
 
 #include <netinet/in.h>
 #include <stdint.h>
 
 struct igmp {
-    uint8_t igmp_type;
-    uint8_t igmp_code;
-    uint16_t igmp_cksum;
-    struct in_addr igmp_group;
+  uint8_t igmp_type;
+  uint8_t igmp_code;
+  uint16_t igmp_cksum;
+  struct in_addr igmp_group;
 };
 
 #define IGMP_MINLEN 8
@@ -40,3 +41,5 @@
 #define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
 #define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
 #define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+
+#endif  // SYSROOT_NETINET_IGMP_H_
diff --git a/arch/x64/sysroot/include/netinet/in.h b/arch/x64/sysroot/include/netinet/in.h
index e626a93..6d18e44 100644
--- a/arch/x64/sysroot/include/netinet/in.h
+++ b/arch/x64/sysroot/include/netinet/in.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IN_H_
+#define SYSROOT_NETINET_IN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,38 +12,38 @@
 typedef uint16_t in_port_t;
 typedef uint32_t in_addr_t;
 struct in_addr {
-    in_addr_t s_addr;
+  in_addr_t s_addr;
 };
 
 struct sockaddr_in {
-    sa_family_t sin_family;
-    in_port_t sin_port;
-    struct in_addr sin_addr;
-    uint8_t sin_zero[8];
+  sa_family_t sin_family;
+  in_port_t sin_port;
+  struct in_addr sin_addr;
+  uint8_t sin_zero[8];
 };
 
 struct in6_addr {
-    union {
-        uint8_t __s6_addr[16];
-        uint16_t __s6_addr16[8];
-        uint32_t __s6_addr32[4];
-    } __in6_union;
+  union {
+    uint8_t __s6_addr[16];
+    uint16_t __s6_addr16[8];
+    uint32_t __s6_addr32[4];
+  } __in6_union;
 };
 #define s6_addr __in6_union.__s6_addr
 #define s6_addr16 __in6_union.__s6_addr16
 #define s6_addr32 __in6_union.__s6_addr32
 
 struct sockaddr_in6 {
-    sa_family_t sin6_family;
-    in_port_t sin6_port;
-    uint32_t sin6_flowinfo;
-    struct in6_addr sin6_addr;
-    uint32_t sin6_scope_id;
+  sa_family_t sin6_family;
+  in_port_t sin6_port;
+  uint32_t sin6_flowinfo;
+  struct in6_addr sin6_addr;
+  uint32_t sin6_scope_id;
 };
 
 struct ipv6_mreq {
-    struct in6_addr ipv6mr_multiaddr;
-    unsigned ipv6mr_interface;
+  struct in6_addr ipv6mr_multiaddr;
+  unsigned ipv6mr_interface;
 };
 
 #define INADDR_ANY ((in_addr_t)0x00000000)
@@ -55,18 +56,18 @@
 #define INADDR_ALLRTRS_GROUP ((in_addr_t)0xe0000002)
 #define INADDR_MAX_LOCAL_GROUP ((in_addr_t)0xe00000ff)
 
-#define IN6ADDR_ANY_INIT                                       \
-    {                                                          \
-        {                                                      \
-            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } \
-        }                                                      \
-    }
-#define IN6ADDR_LOOPBACK_INIT                                  \
-    {                                                          \
-        {                                                      \
-            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } \
-        }                                                      \
-    }
+#define IN6ADDR_ANY_INIT                                 \
+  {                                                      \
+    {                                                    \
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } \
+    }                                                    \
+  }
+#define IN6ADDR_LOOPBACK_INIT                            \
+  {                                                      \
+    {                                                    \
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } \
+    }                                                    \
+  }
 
 extern const struct in6_addr in6addr_any, in6addr_loopback;
 
@@ -114,46 +115,46 @@
 #define IPPROTO_RAW 255
 #define IPPROTO_MAX 256
 
-#define IN6_IS_ADDR_UNSPECIFIED(a)                                                       \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint32_t*)(a))[3] == 0)
+#define IN6_IS_ADDR_UNSPECIFIED(a)                                                     \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint32_t*)(a))[3] == 0)
 
-#define IN6_IS_ADDR_LOOPBACK(a)                                                          \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint8_t*)(a))[12] == 0 && ((uint8_t*)(a))[13] == 0 && ((uint8_t*)(a))[14] == 0 && \
-     ((uint8_t*)(a))[15] == 1)
+#define IN6_IS_ADDR_LOOPBACK(a)                                                        \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint8_t*)(a))[12] == 0 && ((uint8_t*)(a))[13] == 0 && ((uint8_t*)(a))[14] == 0 && \
+   ((uint8_t*)(a))[15] == 1)
 
 #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t*)(a))[0] == 0xff)
 
 #define IN6_IS_ADDR_LINKLOCAL(a) \
-    ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0x80)
+  ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0x80)
 
 #define IN6_IS_ADDR_SITELOCAL(a) \
-    ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0xc0)
+  ((((uint8_t*)(a))[0]) == 0xfe && (((uint8_t*)(a))[1] & 0xc0) == 0xc0)
 
-#define IN6_IS_ADDR_V4MAPPED(a)                                                         \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint8_t*)(a))[8] == 0 && \
-     ((uint8_t*)(a))[9] == 0 && ((uint8_t*)(a))[10] == 0xff && ((uint8_t*)(a))[11] == 0xff)
+#define IN6_IS_ADDR_V4MAPPED(a)                                                       \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint8_t*)(a))[8] == 0 && \
+   ((uint8_t*)(a))[9] == 0 && ((uint8_t*)(a))[10] == 0xff && ((uint8_t*)(a))[11] == 0xff)
 
-#define IN6_IS_ADDR_V4COMPAT(a)                                                          \
-    (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
-     ((uint8_t*)(a))[15] > 1)
+#define IN6_IS_ADDR_V4COMPAT(a)                                                        \
+  (((uint32_t*)(a))[0] == 0 && ((uint32_t*)(a))[1] == 0 && ((uint32_t*)(a))[2] == 0 && \
+   ((uint8_t*)(a))[15] > 1)
 
 #define IN6_IS_ADDR_MC_NODELOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x1))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x1))
 
 #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x2))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x2))
 
 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
-    (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x5))
+  (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x5))
 
 #define IN6_IS_ADDR_MC_ORGLOCAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0x8))
 
 #define IN6_IS_ADDR_MC_GLOBAL(a) (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*)(a))[1] & 0xf) == 0xe))
 
 #define __ARE_4_EQUAL(a, b) \
-    (!((0 [a] - 0 [b]) | (1 [a] - 1 [b]) | (2 [a] - 2 [b]) | (3 [a] - 3 [b])))
+  (!((0 [a] - 0 [b]) | (1 [a] - 1 [b]) | (2 [a] - 2 [b]) | (3 [a] - 3 [b])))
 #define IN6_ARE_ADDR_EQUAL(a, b) __ARE_4_EQUAL((const uint32_t*)(a), (const uint32_t*)(b))
 
 #define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
@@ -230,8 +231,8 @@
 #define IP_MAX_MEMBERSHIPS 20
 
 struct ip_opts {
-    struct in_addr ip_dst;
-    char ip_opts[40];
+  struct in_addr ip_dst;
+  char ip_opts[40];
 };
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -248,68 +249,68 @@
 #define MCAST_INCLUDE 1
 
 struct ip_mreq {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_interface;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_interface;
 };
 
 struct ip_mreqn {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_address;
-    int imr_ifindex;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_address;
+  int imr_ifindex;
 };
 
 struct ip_mreq_source {
-    struct in_addr imr_multiaddr;
-    struct in_addr imr_interface;
-    struct in_addr imr_sourceaddr;
+  struct in_addr imr_multiaddr;
+  struct in_addr imr_interface;
+  struct in_addr imr_sourceaddr;
 };
 
 struct ip_msfilter {
-    struct in_addr imsf_multiaddr;
-    struct in_addr imsf_interface;
-    uint32_t imsf_fmode;
-    uint32_t imsf_numsrc;
-    struct in_addr imsf_slist[1];
+  struct in_addr imsf_multiaddr;
+  struct in_addr imsf_interface;
+  uint32_t imsf_fmode;
+  uint32_t imsf_numsrc;
+  struct in_addr imsf_slist[1];
 };
 #define IP_MSFILTER_SIZE(numsrc) \
-    (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
+  (sizeof(struct ip_msfilter) - sizeof(struct in_addr) + (numsrc) * sizeof(struct in_addr))
 
 struct group_req {
-    uint32_t gr_interface;
-    struct sockaddr_storage gr_group;
+  uint32_t gr_interface;
+  struct sockaddr_storage gr_group;
 };
 
 struct group_source_req {
-    uint32_t gsr_interface;
-    struct sockaddr_storage gsr_group;
-    struct sockaddr_storage gsr_source;
+  uint32_t gsr_interface;
+  struct sockaddr_storage gsr_group;
+  struct sockaddr_storage gsr_source;
 };
 
 struct group_filter {
-    uint32_t gf_interface;
-    struct sockaddr_storage gf_group;
-    uint32_t gf_fmode;
-    uint32_t gf_numsrc;
-    struct sockaddr_storage gf_slist[1];
+  uint32_t gf_interface;
+  struct sockaddr_storage gf_group;
+  uint32_t gf_fmode;
+  uint32_t gf_numsrc;
+  struct sockaddr_storage gf_slist[1];
 };
-#define GROUP_FILTER_SIZE(numsrc)                                    \
-    (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + \
-     (numsrc) * sizeof(struct sockaddr_storage))
+#define GROUP_FILTER_SIZE(numsrc)                                  \
+  (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) + \
+   (numsrc) * sizeof(struct sockaddr_storage))
 
 struct in_pktinfo {
-    int ipi_ifindex;
-    struct in_addr ipi_spec_dst;
-    struct in_addr ipi_addr;
+  int ipi_ifindex;
+  struct in_addr ipi_spec_dst;
+  struct in_addr ipi_addr;
 };
 
 struct in6_pktinfo {
-    struct in6_addr ipi6_addr;
-    unsigned ipi6_ifindex;
+  struct in6_addr ipi6_addr;
+  unsigned ipi6_ifindex;
 };
 
 struct ip6_mtuinfo {
-    struct sockaddr_in6 ip6m_addr;
-    uint32_t ip6m_mtu;
+  struct sockaddr_in6 ip6m_addr;
+  uint32_t ip6m_mtu;
 };
 #endif
 
@@ -392,3 +393,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IN_H_
diff --git a/arch/x64/sysroot/include/netinet/in_systm.h b/arch/x64/sysroot/include/netinet/in_systm.h
index ea7ed91..8e688ab 100644
--- a/arch/x64/sysroot/include/netinet/in_systm.h
+++ b/arch/x64/sysroot/include/netinet/in_systm.h
@@ -1,6 +1,9 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IN_SYSTM_H_
+#define SYSROOT_NETINET_IN_SYSTM_H_
 
 #include <stdint.h>
 
 typedef uint16_t n_short;
 typedef uint32_t n_long, n_time;
+
+#endif  // SYSROOT_NETINET_IN_SYSTM_H_
diff --git a/arch/x64/sysroot/include/netinet/ip.h b/arch/x64/sysroot/include/netinet/ip.h
index 1c0978a..c795ef0 100644
--- a/arch/x64/sysroot/include/netinet/ip.h
+++ b/arch/x64/sysroot/include/netinet/ip.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP_H_
+#define SYSROOT_NETINET_IP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,53 +10,53 @@
 #include <stdint.h>
 
 struct timestamp {
-    uint8_t len;
-    uint8_t ptr;
+  uint8_t len;
+  uint8_t ptr;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int flags : 4;
-    unsigned int overflow : 4;
+  unsigned int flags : 4;
+  unsigned int overflow : 4;
 #else
-    unsigned int overflow : 4;
-    unsigned int flags : 4;
+  unsigned int overflow : 4;
+  unsigned int flags : 4;
 #endif
-    uint32_t data[9];
+  uint32_t data[9];
 };
 
 struct iphdr {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ihl : 4;
-    unsigned int version : 4;
+  unsigned int ihl : 4;
+  unsigned int version : 4;
 #else
-    unsigned int version : 4;
-    unsigned int ihl : 4;
+  unsigned int version : 4;
+  unsigned int ihl : 4;
 #endif
-    uint8_t tos;
-    uint16_t tot_len;
-    uint16_t id;
-    uint16_t frag_off;
-    uint8_t ttl;
-    uint8_t protocol;
-    uint16_t check;
-    uint32_t saddr;
-    uint32_t daddr;
+  uint8_t tos;
+  uint16_t tot_len;
+  uint16_t id;
+  uint16_t frag_off;
+  uint8_t ttl;
+  uint8_t protocol;
+  uint16_t check;
+  uint32_t saddr;
+  uint32_t daddr;
 };
 
 struct ip {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ip_hl : 4;
-    unsigned int ip_v : 4;
+  unsigned int ip_hl : 4;
+  unsigned int ip_v : 4;
 #else
-    unsigned int ip_v : 4;
-    unsigned int ip_hl : 4;
+  unsigned int ip_v : 4;
+  unsigned int ip_hl : 4;
 #endif
-    uint8_t ip_tos;
-    uint16_t ip_len;
-    uint16_t ip_id;
-    uint16_t ip_off;
-    uint8_t ip_ttl;
-    uint8_t ip_p;
-    uint16_t ip_sum;
-    struct in_addr ip_src, ip_dst;
+  uint8_t ip_tos;
+  uint16_t ip_len;
+  uint16_t ip_id;
+  uint16_t ip_off;
+  uint8_t ip_ttl;
+  uint8_t ip_p;
+  uint16_t ip_sum;
+  struct in_addr ip_src, ip_dst;
 };
 
 #define IP_RF 0x8000
@@ -64,17 +65,17 @@
 #define IP_OFFMASK 0x1fff
 
 struct ip_timestamp {
-    uint8_t ipt_code;
-    uint8_t ipt_len;
-    uint8_t ipt_ptr;
+  uint8_t ipt_code;
+  uint8_t ipt_len;
+  uint8_t ipt_ptr;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned int ipt_flg : 4;
-    unsigned int ipt_oflw : 4;
+  unsigned int ipt_flg : 4;
+  unsigned int ipt_oflw : 4;
 #else
-    unsigned int ipt_oflw : 4;
-    unsigned int ipt_flg : 4;
+  unsigned int ipt_oflw : 4;
+  unsigned int ipt_flg : 4;
 #endif
-    uint32_t data[9];
+  uint32_t data[9];
 };
 
 #define IPVERSION 4
@@ -193,3 +194,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP_H_
diff --git a/arch/x64/sysroot/include/netinet/ip6.h b/arch/x64/sysroot/include/netinet/ip6.h
index e809200..45f1c68 100644
--- a/arch/x64/sysroot/include/netinet/ip6.h
+++ b/arch/x64/sysroot/include/netinet/ip6.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP6_H_
+#define SYSROOT_NETINET_IP6_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,17 +10,17 @@
 #include <stdint.h>
 
 struct ip6_hdr {
-    union {
-        struct ip6_hdrctl {
-            uint32_t ip6_un1_flow;
-            uint16_t ip6_un1_plen;
-            uint8_t ip6_un1_nxt;
-            uint8_t ip6_un1_hlim;
-        } ip6_un1;
-        uint8_t ip6_un2_vfc;
-    } ip6_ctlun;
-    struct in6_addr ip6_src;
-    struct in6_addr ip6_dst;
+  union {
+    struct ip6_hdrctl {
+      uint32_t ip6_un1_flow;
+      uint16_t ip6_un1_plen;
+      uint8_t ip6_un1_nxt;
+      uint8_t ip6_un1_hlim;
+    } ip6_un1;
+    uint8_t ip6_un2_vfc;
+  } ip6_ctlun;
+  struct in6_addr ip6_src;
+  struct in6_addr ip6_dst;
 };
 
 #define ip6_vfc ip6_ctlun.ip6_un2_vfc
@@ -30,42 +31,42 @@
 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
 
 struct ip6_ext {
-    uint8_t ip6e_nxt;
-    uint8_t ip6e_len;
+  uint8_t ip6e_nxt;
+  uint8_t ip6e_len;
 };
 
 struct ip6_hbh {
-    uint8_t ip6h_nxt;
-    uint8_t ip6h_len;
+  uint8_t ip6h_nxt;
+  uint8_t ip6h_len;
 };
 
 struct ip6_dest {
-    uint8_t ip6d_nxt;
-    uint8_t ip6d_len;
+  uint8_t ip6d_nxt;
+  uint8_t ip6d_len;
 };
 
 struct ip6_rthdr {
-    uint8_t ip6r_nxt;
-    uint8_t ip6r_len;
-    uint8_t ip6r_type;
-    uint8_t ip6r_segleft;
+  uint8_t ip6r_nxt;
+  uint8_t ip6r_len;
+  uint8_t ip6r_type;
+  uint8_t ip6r_segleft;
 };
 
 struct ip6_rthdr0 {
-    uint8_t ip6r0_nxt;
-    uint8_t ip6r0_len;
-    uint8_t ip6r0_type;
-    uint8_t ip6r0_segleft;
-    uint8_t ip6r0_reserved;
-    uint8_t ip6r0_slmap[3];
-    struct in6_addr ip6r0_addr[];
+  uint8_t ip6r0_nxt;
+  uint8_t ip6r0_len;
+  uint8_t ip6r0_type;
+  uint8_t ip6r0_segleft;
+  uint8_t ip6r0_reserved;
+  uint8_t ip6r0_slmap[3];
+  struct in6_addr ip6r0_addr[];
 };
 
 struct ip6_frag {
-    uint8_t ip6f_nxt;
-    uint8_t ip6f_reserved;
-    uint16_t ip6f_offlg;
-    uint32_t ip6f_ident;
+  uint8_t ip6f_nxt;
+  uint8_t ip6f_reserved;
+  uint16_t ip6f_offlg;
+  uint32_t ip6f_ident;
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -79,8 +80,8 @@
 #endif
 
 struct ip6_opt {
-    uint8_t ip6o_type;
-    uint8_t ip6o_len;
+  uint8_t ip6o_type;
+  uint8_t ip6o_len;
 };
 
 #define IP6OPT_TYPE(o) ((o)&0xc0)
@@ -99,29 +100,29 @@
 #define IP6OPT_ROUTER_ALERT 0x05
 
 struct ip6_opt_jumbo {
-    uint8_t ip6oj_type;
-    uint8_t ip6oj_len;
-    uint8_t ip6oj_jumbo_len[4];
+  uint8_t ip6oj_type;
+  uint8_t ip6oj_len;
+  uint8_t ip6oj_jumbo_len[4];
 };
 #define IP6OPT_JUMBO_LEN 6
 
 struct ip6_opt_nsap {
-    uint8_t ip6on_type;
-    uint8_t ip6on_len;
-    uint8_t ip6on_src_nsap_len;
-    uint8_t ip6on_dst_nsap_len;
+  uint8_t ip6on_type;
+  uint8_t ip6on_len;
+  uint8_t ip6on_src_nsap_len;
+  uint8_t ip6on_dst_nsap_len;
 };
 
 struct ip6_opt_tunnel {
-    uint8_t ip6ot_type;
-    uint8_t ip6ot_len;
-    uint8_t ip6ot_encap_limit;
+  uint8_t ip6ot_type;
+  uint8_t ip6ot_len;
+  uint8_t ip6ot_encap_limit;
 };
 
 struct ip6_opt_router {
-    uint8_t ip6or_type;
-    uint8_t ip6or_len;
-    uint8_t ip6or_value[2];
+  uint8_t ip6or_type;
+  uint8_t ip6or_len;
+  uint8_t ip6or_value[2];
 };
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -137,3 +138,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP6_H_
diff --git a/arch/x64/sysroot/include/netinet/ip_icmp.h b/arch/x64/sysroot/include/netinet/ip_icmp.h
index 4c1c322..c239456 100644
--- a/arch/x64/sysroot/include/netinet/ip_icmp.h
+++ b/arch/x64/sysroot/include/netinet/ip_icmp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_IP_ICMP_H_
+#define SYSROOT_NETINET_IP_ICMP_H_
 
 #include <netinet/in.h>
 #include <netinet/ip.h>
@@ -9,20 +10,20 @@
 #endif
 
 struct icmphdr {
-    uint8_t type;
-    uint8_t code;
-    uint16_t checksum;
-    union {
-        struct {
-            uint16_t id;
-            uint16_t sequence;
-        } echo;
-        uint32_t gateway;
-        struct {
-            uint16_t __unused;
-            uint16_t mtu;
-        } frag;
-    } un;
+  uint8_t type;
+  uint8_t code;
+  uint16_t checksum;
+  union {
+    struct {
+      uint16_t id;
+      uint16_t sequence;
+    } echo;
+    uint32_t gateway;
+    struct {
+      uint16_t __unused;
+      uint16_t mtu;
+    } frag;
+  } un;
 };
 
 #define ICMP_ECHOREPLY 0
@@ -67,47 +68,47 @@
 #define ICMP_EXC_FRAGTIME 1
 
 struct icmp_ra_addr {
-    uint32_t ira_addr;
-    uint32_t ira_preference;
+  uint32_t ira_addr;
+  uint32_t ira_preference;
 };
 
 struct icmp {
-    uint8_t icmp_type;
-    uint8_t icmp_code;
-    uint16_t icmp_cksum;
-    union {
-        uint8_t ih_pptr;
-        struct in_addr ih_gwaddr;
-        struct ih_idseq {
-            uint16_t icd_id;
-            uint16_t icd_seq;
-        } ih_idseq;
-        uint32_t ih_void;
+  uint8_t icmp_type;
+  uint8_t icmp_code;
+  uint16_t icmp_cksum;
+  union {
+    uint8_t ih_pptr;
+    struct in_addr ih_gwaddr;
+    struct ih_idseq {
+      uint16_t icd_id;
+      uint16_t icd_seq;
+    } ih_idseq;
+    uint32_t ih_void;
 
-        struct ih_pmtu {
-            uint16_t ipm_void;
-            uint16_t ipm_nextmtu;
-        } ih_pmtu;
+    struct ih_pmtu {
+      uint16_t ipm_void;
+      uint16_t ipm_nextmtu;
+    } ih_pmtu;
 
-        struct ih_rtradv {
-            uint8_t irt_num_addrs;
-            uint8_t irt_wpa;
-            uint16_t irt_lifetime;
-        } ih_rtradv;
-    } icmp_hun;
-    union {
-        struct {
-            uint32_t its_otime;
-            uint32_t its_rtime;
-            uint32_t its_ttime;
-        } id_ts;
-        struct {
-            struct ip idi_ip;
-        } id_ip;
-        struct icmp_ra_addr id_radv;
-        uint32_t id_mask;
-        uint8_t id_data[1];
-    } icmp_dun;
+    struct ih_rtradv {
+      uint8_t irt_num_addrs;
+      uint8_t irt_wpa;
+      uint16_t irt_lifetime;
+    } ih_rtradv;
+  } icmp_hun;
+  union {
+    struct {
+      uint32_t its_otime;
+      uint32_t its_rtime;
+      uint32_t its_ttime;
+    } id_ts;
+    struct {
+      struct ip idi_ip;
+    } id_ip;
+    struct icmp_ra_addr id_radv;
+    uint32_t id_mask;
+    uint8_t id_data[1];
+  } icmp_dun;
 };
 
 #define icmp_pptr icmp_hun.ih_pptr
@@ -175,12 +176,14 @@
 
 #define ICMP_PARAMPROB_OPTABSENT 1
 
-#define ICMP_INFOTYPE(type)                                                                 \
-    ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT ||      \
-     (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
-     (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ ||           \
-     (type) == ICMP_MASKREPLY)
+#define ICMP_INFOTYPE(type)                                                               \
+  ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || (type) == ICMP_ROUTERADVERT ||      \
+   (type) == ICMP_ROUTERSOLICIT || (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
+   (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || (type) == ICMP_MASKREQ ||           \
+   (type) == ICMP_MASKREPLY)
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_IP_ICMP_H_
diff --git a/arch/x64/sysroot/include/netinet/tcp.h b/arch/x64/sysroot/include/netinet/tcp.h
index 9274ba5..e892dd2 100644
--- a/arch/x64/sysroot/include/netinet/tcp.h
+++ b/arch/x64/sysroot/include/netinet/tcp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_TCP_H_
+#define SYSROOT_NETINET_TCP_H_
 
 #include <features.h>
 
@@ -74,62 +75,61 @@
 struct tcphdr {
 #ifdef _GNU_SOURCE
 #ifdef __GNUC__
-    __extension__
+  __extension__
 #endif
-        union {
-        struct {
-
-            uint16_t source;
-            uint16_t dest;
-            uint32_t seq;
-            uint32_t ack_seq;
+      union {
+    struct {
+      uint16_t source;
+      uint16_t dest;
+      uint32_t seq;
+      uint32_t ack_seq;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-            uint16_t res1 : 4;
-            uint16_t doff : 4;
-            uint16_t fin : 1;
-            uint16_t syn : 1;
-            uint16_t rst : 1;
-            uint16_t psh : 1;
-            uint16_t ack : 1;
-            uint16_t urg : 1;
-            uint16_t res2 : 2;
+      uint16_t res1 : 4;
+      uint16_t doff : 4;
+      uint16_t fin : 1;
+      uint16_t syn : 1;
+      uint16_t rst : 1;
+      uint16_t psh : 1;
+      uint16_t ack : 1;
+      uint16_t urg : 1;
+      uint16_t res2 : 2;
 #else
-            uint16_t doff : 4;
-            uint16_t res1 : 4;
-            uint16_t res2 : 2;
-            uint16_t urg : 1;
-            uint16_t ack : 1;
-            uint16_t psh : 1;
-            uint16_t rst : 1;
-            uint16_t syn : 1;
-            uint16_t fin : 1;
+      uint16_t doff : 4;
+      uint16_t res1 : 4;
+      uint16_t res2 : 2;
+      uint16_t urg : 1;
+      uint16_t ack : 1;
+      uint16_t psh : 1;
+      uint16_t rst : 1;
+      uint16_t syn : 1;
+      uint16_t fin : 1;
 #endif
-            uint16_t window;
-            uint16_t check;
-            uint16_t urg_ptr;
-        };
-        struct {
+      uint16_t window;
+      uint16_t check;
+      uint16_t urg_ptr;
+    };
+    struct {
 #endif
 
-            uint16_t th_sport;
-            uint16_t th_dport;
-            uint32_t th_seq;
-            uint32_t th_ack;
+      uint16_t th_sport;
+      uint16_t th_dport;
+      uint32_t th_seq;
+      uint32_t th_ack;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-            uint8_t th_x2 : 4;
-            uint8_t th_off : 4;
+      uint8_t th_x2 : 4;
+      uint8_t th_off : 4;
 #else
-    uint8_t th_off : 4;
-    uint8_t th_x2 : 4;
+  uint8_t th_off : 4;
+  uint8_t th_x2 : 4;
 #endif
-            uint8_t th_flags;
-            uint16_t th_win;
-            uint16_t th_sum;
-            uint16_t th_urp;
+      uint8_t th_flags;
+      uint16_t th_win;
+      uint16_t th_sum;
+      uint16_t th_urp;
 
 #ifdef _GNU_SOURCE
-        };
     };
+  };
 #endif
 };
 #endif
@@ -147,53 +147,55 @@
 #define TCP_CA_Loss 4
 
 struct tcp_info {
-    uint8_t tcpi_state;
-    uint8_t tcpi_ca_state;
-    uint8_t tcpi_retransmits;
-    uint8_t tcpi_probes;
-    uint8_t tcpi_backoff;
-    uint8_t tcpi_options;
-    uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
-    uint32_t tcpi_rto;
-    uint32_t tcpi_ato;
-    uint32_t tcpi_snd_mss;
-    uint32_t tcpi_rcv_mss;
-    uint32_t tcpi_unacked;
-    uint32_t tcpi_sacked;
-    uint32_t tcpi_lost;
-    uint32_t tcpi_retrans;
-    uint32_t tcpi_fackets;
-    uint32_t tcpi_last_data_sent;
-    uint32_t tcpi_last_ack_sent;
-    uint32_t tcpi_last_data_recv;
-    uint32_t tcpi_last_ack_recv;
-    uint32_t tcpi_pmtu;
-    uint32_t tcpi_rcv_ssthresh;
-    uint32_t tcpi_rtt;
-    uint32_t tcpi_rttvar;
-    uint32_t tcpi_snd_ssthresh;
-    uint32_t tcpi_snd_cwnd;
-    uint32_t tcpi_advmss;
-    uint32_t tcpi_reordering;
-    uint32_t tcpi_rcv_rtt;
-    uint32_t tcpi_rcv_space;
-    uint32_t tcpi_total_retrans;
-    uint64_t tcpi_pacing_rate;
-    uint64_t tcpi_max_pacing_rate;
-    uint64_t tcpi_bytes_acked;
-    uint64_t tcpi_bytes_received;
-    uint32_t tcpi_segs_out;
-    uint32_t tcpi_segs_in;
+  uint8_t tcpi_state;
+  uint8_t tcpi_ca_state;
+  uint8_t tcpi_retransmits;
+  uint8_t tcpi_probes;
+  uint8_t tcpi_backoff;
+  uint8_t tcpi_options;
+  uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
+  uint32_t tcpi_rto;
+  uint32_t tcpi_ato;
+  uint32_t tcpi_snd_mss;
+  uint32_t tcpi_rcv_mss;
+  uint32_t tcpi_unacked;
+  uint32_t tcpi_sacked;
+  uint32_t tcpi_lost;
+  uint32_t tcpi_retrans;
+  uint32_t tcpi_fackets;
+  uint32_t tcpi_last_data_sent;
+  uint32_t tcpi_last_ack_sent;
+  uint32_t tcpi_last_data_recv;
+  uint32_t tcpi_last_ack_recv;
+  uint32_t tcpi_pmtu;
+  uint32_t tcpi_rcv_ssthresh;
+  uint32_t tcpi_rtt;
+  uint32_t tcpi_rttvar;
+  uint32_t tcpi_snd_ssthresh;
+  uint32_t tcpi_snd_cwnd;
+  uint32_t tcpi_advmss;
+  uint32_t tcpi_reordering;
+  uint32_t tcpi_rcv_rtt;
+  uint32_t tcpi_rcv_space;
+  uint32_t tcpi_total_retrans;
+  uint64_t tcpi_pacing_rate;
+  uint64_t tcpi_max_pacing_rate;
+  uint64_t tcpi_bytes_acked;
+  uint64_t tcpi_bytes_received;
+  uint32_t tcpi_segs_out;
+  uint32_t tcpi_segs_in;
 };
 
 #define TCP_MD5SIG_MAXKEYLEN 80
 
 struct tcp_md5sig {
-    struct sockaddr_storage tcpm_addr;
-    uint16_t __tcpm_pad1;
-    uint16_t tcpm_keylen;
-    uint32_t __tcpm_pad2;
-    uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+  struct sockaddr_storage tcpm_addr;
+  uint16_t __tcpm_pad1;
+  uint16_t tcpm_keylen;
+  uint32_t __tcpm_pad2;
+  uint8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
 };
 
 #endif
+
+#endif  // SYSROOT_NETINET_TCP_H_
diff --git a/arch/x64/sysroot/include/netinet/udp.h b/arch/x64/sysroot/include/netinet/udp.h
index ddde1c7..1a0fba7 100644
--- a/arch/x64/sysroot/include/netinet/udp.h
+++ b/arch/x64/sysroot/include/netinet/udp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NETINET_UDP_H_
+#define SYSROOT_NETINET_UDP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,10 +16,10 @@
 #endif
 
 struct udphdr {
-    uint16_t uh_sport;
-    uint16_t uh_dport;
-    uint16_t uh_ulen;
-    uint16_t uh_sum;
+  uint16_t uh_sport;
+  uint16_t uh_dport;
+  uint16_t uh_ulen;
+  uint16_t uh_sum;
 };
 
 #define UDP_CORK 1
@@ -33,3 +34,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETINET_UDP_H_
diff --git a/arch/x64/sysroot/include/netpacket/packet.h b/arch/x64/sysroot/include/netpacket/packet.h
index 3e35676..3066046 100644
--- a/arch/x64/sysroot/include/netpacket/packet.h
+++ b/arch/x64/sysroot/include/netpacket/packet.h
@@ -1,21 +1,22 @@
-#pragma once
+#ifndef SYSROOT_NETPACKET_PACKET_H_
+#define SYSROOT_NETPACKET_PACKET_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 struct sockaddr_ll {
-    unsigned short sll_family, sll_protocol;
-    int sll_ifindex;
-    unsigned short sll_hatype;
-    unsigned char sll_pkttype, sll_halen;
-    unsigned char sll_addr[8];
+  unsigned short sll_family, sll_protocol;
+  int sll_ifindex;
+  unsigned short sll_hatype;
+  unsigned char sll_pkttype, sll_halen;
+  unsigned char sll_addr[8];
 };
 
 struct packet_mreq {
-    int mr_ifindex;
-    unsigned short int mr_type, mr_alen;
-    unsigned char mr_address[8];
+  int mr_ifindex;
+  unsigned short int mr_type, mr_alen;
+  unsigned char mr_address[8];
 };
 
 #define PACKET_HOST 0
@@ -56,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NETPACKET_PACKET_H_
diff --git a/arch/x64/sysroot/include/nl_types.h b/arch/x64/sysroot/include/nl_types.h
index 570224d..e30f86e 100644
--- a/arch/x64/sysroot/include/nl_types.h
+++ b/arch/x64/sysroot/include/nl_types.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_NL_TYPES_H_
+#define SYSROOT_NL_TYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_NL_TYPES_H_
diff --git a/arch/x64/sysroot/include/paths.h b/arch/x64/sysroot/include/paths.h
index 36b6127..0ff06aa 100644
--- a/arch/x64/sysroot/include/paths.h
+++ b/arch/x64/sysroot/include/paths.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PATHS_H_
+#define SYSROOT_PATHS_H_
 
 #define _PATH_DEFPATH "/usr/local/bin:/bin:/usr/bin"
 #define _PATH_STDPATH "/bin:/usr/bin:/sbin:/usr/sbin"
@@ -23,3 +24,5 @@
 #define _PATH_VARDB "/var/lib/misc/"
 #define _PATH_VARRUN "/var/run/"
 #define _PATH_VARTMP "/var/tmp/"
+
+#endif  // SYSROOT_PATHS_H_
diff --git a/arch/x64/sysroot/include/poll.h b/arch/x64/sysroot/include/poll.h
index d8b3726..4c7c800 100644
--- a/arch/x64/sysroot/include/poll.h
+++ b/arch/x64/sysroot/include/poll.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_POLL_H_
+#define SYSROOT_POLL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -28,9 +29,9 @@
 typedef unsigned long nfds_t;
 
 struct pollfd {
-    int fd;
-    short events;
-    short revents;
+  int fd;
+  short events;
+  short revents;
 };
 
 int poll(struct pollfd*, nfds_t, int);
@@ -46,3 +47,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_POLL_H_
diff --git a/arch/x64/sysroot/include/pthread.h b/arch/x64/sysroot/include/pthread.h
index 07576e5..d4b9f00 100644
--- a/arch/x64/sysroot/include/pthread.h
+++ b/arch/x64/sysroot/include/pthread.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PTHREAD_H_
+#define SYSROOT_PTHREAD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -25,11 +26,11 @@
 #define __NEED_pthread_once_t
 #define __NEED_size_t
 
-#include <bits/alltypes.h>
-
 #include <sched.h>
 #include <time.h>
 
+#include <bits/alltypes.h>
+
 #define PTHREAD_CREATE_JOINABLE 0
 #define PTHREAD_CREATE_DETACHED 1
 
@@ -54,11 +55,11 @@
 #define PTHREAD_PROCESS_PRIVATE 0
 
 #define PTHREAD_MUTEX_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_RWLOCK_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_COND_INITIALIZER \
-    {}
+  {}
 #define PTHREAD_ONCE_INIT 0
 
 #define PTHREAD_CANCEL_ENABLE 0
@@ -147,8 +148,9 @@
 int pthread_attr_getdetachstate(const pthread_attr_t*, int*);
 int pthread_attr_setdetachstate(pthread_attr_t*, int);
 int pthread_attr_getstack(const pthread_attr_t* __restrict, void** __restrict, size_t* __restrict);
-int pthread_attr_setstack(pthread_attr_t*, void*, size_t)
-    __attribute__((__deprecated__("pthread_attr_setstack is not available in Fuchsia; perhaps pthread_attr_setstacksize and/or pthread_attr_setguardsize is sufficient for your needs?")));
+int pthread_attr_setstack(pthread_attr_t*, void*, size_t) __attribute__((__deprecated__(
+    "pthread_attr_setstack is not available in Fuchsia; perhaps pthread_attr_setstacksize and/or "
+    "pthread_attr_setguardsize is sufficient for your needs?")));
 int pthread_attr_getschedparam(const pthread_attr_t* __restrict, struct sched_param* __restrict);
 int pthread_attr_setschedparam(pthread_attr_t* __restrict, const struct sched_param* __restrict);
 
@@ -194,3 +196,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_PTHREAD_H_
diff --git a/arch/x64/sysroot/include/pty.h b/arch/x64/sysroot/include/pty.h
deleted file mode 100644
index 943a6a8..0000000
--- a/arch/x64/sysroot/include/pty.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/ioctl.h>
-#include <termios.h>
-
-int openpty(int*, int*, char*, const struct termios*, const struct winsize*);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/x64/sysroot/include/pwd.h b/arch/x64/sysroot/include/pwd.h
index 1d63e72..213eefa 100644
--- a/arch/x64/sysroot/include/pwd.h
+++ b/arch/x64/sysroot/include/pwd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_PWD_H_
+#define SYSROOT_PWD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,13 +18,13 @@
 #include <bits/alltypes.h>
 
 struct passwd {
-    char* pw_name;
-    char* pw_passwd;
-    uid_t pw_uid;
-    gid_t pw_gid;
-    char* pw_gecos;
-    char* pw_dir;
-    char* pw_shell;
+  char* pw_name;
+  char* pw_passwd;
+  uid_t pw_uid;
+  gid_t pw_gid;
+  char* pw_gecos;
+  char* pw_dir;
+  char* pw_shell;
 };
 
 void setpwent(void);
@@ -43,3 +44,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_PWD_H_
diff --git a/arch/x64/sysroot/include/regex.h b/arch/x64/sysroot/include/regex.h
index 70c4613..53fac22 100644
--- a/arch/x64/sysroot/include/regex.h
+++ b/arch/x64/sysroot/include/regex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_REGEX_H_
+#define SYSROOT_REGEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -12,15 +13,15 @@
 #include <bits/alltypes.h>
 
 typedef struct re_pattern_buffer {
-    size_t re_nsub;
-    void *__opaque, *__padding[4];
-    size_t __nsub2;
-    char __padding2;
+  size_t re_nsub;
+  void *__opaque, *__padding[4];
+  size_t __nsub2;
+  char __padding2;
 } regex_t;
 
 typedef struct {
-    regoff_t rm_so;
-    regoff_t rm_eo;
+  regoff_t rm_so;
+  regoff_t rm_eo;
 } regmatch_t;
 
 #define REG_EXTENDED 1
@@ -57,3 +58,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_REGEX_H_
diff --git a/arch/x64/sysroot/include/resolv.h b/arch/x64/sysroot/include/resolv.h
index 7efcd49..a90e0e8 100644
--- a/arch/x64/sysroot/include/resolv.h
+++ b/arch/x64/sysroot/include/resolv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_RESOLV_H_
+#define SYSROOT_RESOLV_H_
 
 #include <arpa/nameser.h>
 #include <netinet/in.h>
@@ -23,41 +24,41 @@
 
 /* unused; purely for broken apps */
 typedef struct __res_state {
-    int retrans;
-    int retry;
-    unsigned long options;
-    int nscount;
-    struct sockaddr_in nsaddr_list[MAXNS];
+  int retrans;
+  int retry;
+  unsigned long options;
+  int nscount;
+  struct sockaddr_in nsaddr_list[MAXNS];
 #define nsaddr nsaddr_list[0]
-    unsigned short id;
-    char* dnsrch[MAXDNSRCH + 1];
-    char defdname[256];
-    unsigned long pfcode;
-    unsigned ndots : 4;
-    unsigned nsort : 4;
-    unsigned ipv6_unavail : 1;
-    unsigned unused : 23;
+  unsigned short id;
+  char* dnsrch[MAXDNSRCH + 1];
+  char defdname[256];
+  unsigned long pfcode;
+  unsigned ndots : 4;
+  unsigned nsort : 4;
+  unsigned ipv6_unavail : 1;
+  unsigned unused : 23;
+  struct {
+    struct in_addr addr;
+    uint32_t mask;
+  } sort_list[MAXRESOLVSORT];
+  void* qhook;
+  void* rhook;
+  int res_h_errno;
+  int _vcsock;
+  unsigned _flags;
+  union {
+    char pad[52];
     struct {
-        struct in_addr addr;
-        uint32_t mask;
-    } sort_list[MAXRESOLVSORT];
-    void* qhook;
-    void* rhook;
-    int res_h_errno;
-    int _vcsock;
-    unsigned _flags;
-    union {
-        char pad[52];
-        struct {
-            uint16_t nscount;
-            uint16_t nsmap[MAXNS];
-            int nssocks[MAXNS];
-            uint16_t nscount6;
-            uint16_t nsinit;
-            struct sockaddr_in6* nsaddrs[MAXNS];
-            unsigned int _initstamp[2];
-        } _ext;
-    } _u;
+      uint16_t nscount;
+      uint16_t nsmap[MAXNS];
+      int nssocks[MAXNS];
+      uint16_t nscount6;
+      uint16_t nsinit;
+      struct sockaddr_in6* nsaddrs[MAXNS];
+      unsigned int _initstamp[2];
+    } _ext;
+  } _u;
 } * res_state;
 
 #define __RES 19991006
@@ -67,9 +68,9 @@
 #endif
 
 struct res_sym {
-    int number;
-    char* name;
-    char* humanname;
+  int number;
+  char* name;
+  char* humanname;
 };
 
 #define RES_F_VC 0x00000001
@@ -138,3 +139,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_RESOLV_H_
diff --git a/arch/x64/sysroot/include/sched.h b/arch/x64/sysroot/include/sched.h
index f77dff7..ac06166 100644
--- a/arch/x64/sysroot/include/sched.h
+++ b/arch/x64/sysroot/include/sched.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SCHED_H_
+#define SYSROOT_SCHED_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,11 +18,11 @@
 #include <bits/alltypes.h>
 
 struct sched_param {
-    int sched_priority;
-    int sched_ss_low_priority;
-    struct timespec sched_ss_repl_period;
-    struct timespec sched_ss_init_budget;
-    int sched_ss_max_repl;
+  int sched_priority;
+  int sched_ss_low_priority;
+  struct timespec sched_ss_repl_period;
+  struct timespec sched_ss_init_budget;
+  int sched_ss_max_repl;
 };
 
 int sched_get_priority_max(int);
@@ -47,28 +48,30 @@
 void* calloc(size_t, size_t);
 void free(void*);
 
-typedef struct cpu_set_t { unsigned long __bits[128 / sizeof(long)]; } cpu_set_t;
+typedef struct cpu_set_t {
+  unsigned long __bits[128 / sizeof(long)];
+} cpu_set_t;
 int __sched_cpucount(size_t, const cpu_set_t*);
 int sched_getcpu(void);
 int sched_getaffinity(pid_t, size_t, cpu_set_t*);
 int sched_setaffinity(pid_t, size_t, const cpu_set_t*);
 
 #define __CPU_op_S(i, size, set, op) \
-    ((i) / 8U >= (size)              \
-         ? 0                         \
-         : ((set)->__bits[(i) / 8 / sizeof(long)] op(1UL << ((i) % (8 * sizeof(long))))))
+  ((i) / 8U >= (size)                \
+       ? 0                           \
+       : ((set)->__bits[(i) / 8 / sizeof(long)] op(1UL << ((i) % (8 * sizeof(long))))))
 
 #define CPU_SET_S(i, size, set) __CPU_op_S(i, size, set, |=)
 #define CPU_CLR_S(i, size, set) __CPU_op_S(i, size, set, &= ~)
 #define CPU_ISSET_S(i, size, set) __CPU_op_S(i, size, set, &)
 
-#define __CPU_op_func_S(func, op)                                                             \
-    static __inline void __CPU_##func##_S(size_t __size, cpu_set_t* __dest,                   \
-                                          const cpu_set_t* __src1, const cpu_set_t* __src2) { \
-        size_t __i;                                                                           \
-        for (__i = 0; __i < __size / sizeof(long); __i++)                                     \
-            __dest->__bits[__i] = __src1->__bits[__i] op __src2->__bits[__i];                 \
-    }
+#define __CPU_op_func_S(func, op)                                                                  \
+  static __inline void __CPU_##func##_S(size_t __size, cpu_set_t* __dest, const cpu_set_t* __src1, \
+                                        const cpu_set_t* __src2) {                                 \
+    size_t __i;                                                                                    \
+    for (__i = 0; __i < __size / sizeof(long); __i++)                                              \
+      __dest->__bits[__i] = __src1->__bits[__i] op __src2->__bits[__i];                            \
+  }
 
 __CPU_op_func_S(AND, &) __CPU_op_func_S(OR, |) __CPU_op_func_S(XOR, ^)
 
@@ -80,9 +83,9 @@
 #define CPU_ZERO_S(size, set) memset(set, 0, size)
 #define CPU_EQUAL_S(size, set1, set2) (!memcmp(set1, set2, size))
 
-#define CPU_ALLOC_SIZE(n)                       \
-    (sizeof(long) * ((n) / (8 * sizeof(long)) + \
-                     ((n) % (8 * sizeof(long)) + 8 * sizeof(long) - 1) / (8 * sizeof(long))))
+#define CPU_ALLOC_SIZE(n)                     \
+  (sizeof(long) * ((n) / (8 * sizeof(long)) + \
+                   ((n) % (8 * sizeof(long)) + 8 * sizeof(long) - 1) / (8 * sizeof(long))))
 #define CPU_ALLOC(n) ((cpu_set_t*)calloc(1, CPU_ALLOC_SIZE(n)))
 #define CPU_FREE(set) free(set)
 
@@ -103,3 +106,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SCHED_H_
diff --git a/arch/x64/sysroot/include/search.h b/arch/x64/sysroot/include/search.h
index eb50439..5348eab 100644
--- a/arch/x64/sysroot/include/search.h
+++ b/arch/x64/sysroot/include/search.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SEARCH_H_
+#define SYSROOT_SEARCH_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,16 +10,12 @@
 #define __NEED_size_t
 #include <bits/alltypes.h>
 
-typedef enum { FIND,
-               ENTER } ACTION;
-typedef enum { preorder,
-               postorder,
-               endorder,
-               leaf } VISIT;
+typedef enum { FIND, ENTER } ACTION;
+typedef enum { preorder, postorder, endorder, leaf } VISIT;
 
 typedef struct entry {
-    char* key;
-    void* data;
+  char* key;
+  void* data;
 } ENTRY;
 
 int hcreate(size_t);
@@ -27,9 +24,9 @@
 
 #ifdef _GNU_SOURCE
 struct hsearch_data {
-    struct __tab* __tab;
-    unsigned int __unused1;
-    unsigned int __unused2;
+  struct __tab* __tab;
+  unsigned int __unused1;
+  unsigned int __unused2;
 };
 
 int hcreate_r(size_t, struct hsearch_data*);
@@ -50,8 +47,8 @@
 
 #ifdef _GNU_SOURCE
 struct qelem {
-    struct qelem *q_forw, *q_back;
-    char q_data[1];
+  struct qelem *q_forw, *q_back;
+  char q_data[1];
 };
 
 void tdestroy(void*, void (*)(void*));
@@ -60,3 +57,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SEARCH_H_
diff --git a/arch/x64/sysroot/include/semaphore.h b/arch/x64/sysroot/include/semaphore.h
index e4bf7a8..d9e996e 100644
--- a/arch/x64/sysroot/include/semaphore.h
+++ b/arch/x64/sysroot/include/semaphore.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SEMAPHORE_H_
+#define SYSROOT_SEMAPHORE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,10 +10,10 @@
 #define __NEED_sem_t
 #define __NEED_time_t
 #define __NEED_struct_timespec
-#include <bits/alltypes.h>
-
 #include <fcntl.h>
 
+#include <bits/alltypes.h>
+
 #define SEM_FAILED ((sem_t*)0)
 
 int sem_close(sem_t*);
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SEMAPHORE_H_
diff --git a/arch/x64/sysroot/include/setjmp.h b/arch/x64/sysroot/include/setjmp.h
index eaceeca..65971b7 100644
--- a/arch/x64/sysroot/include/setjmp.h
+++ b/arch/x64/sysroot/include/setjmp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SETJMP_H_
+#define SYSROOT_SETJMP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,9 +10,9 @@
 #include <bits/setjmp.h>
 
 typedef struct __jmp_buf_tag {
-    __jmp_buf __jb;
-    unsigned long __fl;
-    unsigned long __ss[128 / sizeof(long)];
+  __jmp_buf __jb;
+  unsigned long __fl;
+  unsigned long __ss[128 / sizeof(long)];
 } jmp_buf[1];
 
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
@@ -34,3 +35,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SETJMP_H_
diff --git a/arch/x64/sysroot/include/signal.h b/arch/x64/sysroot/include/signal.h
index b26c9b0..594cf80 100644
--- a/arch/x64/sysroot/include/signal.h
+++ b/arch/x64/sysroot/include/signal.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SIGNAL_H_
+#define SYSROOT_SIGNAL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -86,55 +87,55 @@
 #define CLD_CONTINUED 6
 
 union sigval {
-    int sival_int;
-    void* sival_ptr;
+  int sival_int;
+  void* sival_ptr;
 };
 
 typedef struct {
 #ifdef __SI_SWAP_ERRNO_CODE
-    int si_signo, si_code, si_errno;
+  int si_signo, si_code, si_errno;
 #else
-    int si_signo, si_errno, si_code;
+  int si_signo, si_errno, si_code;
 #endif
-    union {
-        char __pad[128 - 2 * sizeof(int) - sizeof(long)];
+  union {
+    char __pad[128 - 2 * sizeof(int) - sizeof(long)];
+    struct {
+      union {
         struct {
-            union {
-                struct {
-                    pid_t si_pid;
-                    uid_t si_uid;
-                } __piduid;
-                struct {
-                    int si_timerid;
-                    int si_overrun;
-                } __timer;
-            } __first;
-            union {
-                union sigval si_value;
-                struct {
-                    int si_status;
-                    clock_t si_utime, si_stime;
-                } __sigchld;
-            } __second;
-        } __si_common;
+          pid_t si_pid;
+          uid_t si_uid;
+        } __piduid;
         struct {
-            void* si_addr;
-            short si_addr_lsb;
-            struct {
-                void* si_lower;
-                void* si_upper;
-            } __addr_bnd;
-        } __sigfault;
+          int si_timerid;
+          int si_overrun;
+        } __timer;
+      } __first;
+      union {
+        union sigval si_value;
         struct {
-            long si_band;
-            int si_fd;
-        } __sigpoll;
-        struct {
-            void* si_call_addr;
-            int si_syscall;
-            unsigned si_arch;
-        } __sigsys;
-    } __si_fields;
+          int si_status;
+          clock_t si_utime, si_stime;
+        } __sigchld;
+      } __second;
+    } __si_common;
+    struct {
+      void* si_addr;
+      short si_addr_lsb;
+      struct {
+        void* si_lower;
+        void* si_upper;
+      } __addr_bnd;
+    } __sigfault;
+    struct {
+      long si_band;
+      int si_fd;
+    } __sigpoll;
+    struct {
+      void* si_call_addr;
+      int si_syscall;
+      unsigned si_arch;
+    } __sigsys;
+  } __si_fields;
 } siginfo_t;
 #define si_pid __si_fields.__si_common.__first.__piduid.si_pid
 #define si_uid __si_fields.__si_common.__first.__piduid.si_uid
@@ -157,24 +158,24 @@
 #define si_arch __si_fields.__sigsys.si_arch
 
 struct sigaction {
-    union {
-        void (*sa_handler)(int);
-        void (*sa_sigaction)(int, siginfo_t*, void*);
-    } __sa_handler;
-    sigset_t sa_mask;
-    int sa_flags;
-    void (*sa_restorer)(void);
+  union {
+    void (*sa_handler)(int);
+    void (*sa_sigaction)(int, siginfo_t*, void*);
+  } __sa_handler;
+  sigset_t sa_mask;
+  int sa_flags;
+  void (*sa_restorer)(void);
 };
 #define sa_handler __sa_handler.sa_handler
 #define sa_sigaction __sa_handler.sa_sigaction
 
 struct sigevent {
-    union sigval sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-    void (*sigev_notify_function)(union sigval);
-    pthread_attr_t* sigev_notify_attributes;
-    char __pad[56 - 3 * sizeof(long)];
+  union sigval sigev_value;
+  int sigev_signo;
+  int sigev_notify;
+  void (*sigev_notify_function)(union sigval);
+  pthread_attr_t* sigev_notify_attributes;
+  char __pad[56 - 3 * sizeof(long)];
 };
 
 #define SIGEV_SIGNAL 0
@@ -258,3 +259,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SIGNAL_H_
diff --git a/arch/x64/sysroot/include/spawn.h b/arch/x64/sysroot/include/spawn.h
index 74710cb..1c70bb2 100644
--- a/arch/x64/sysroot/include/spawn.h
+++ b/arch/x64/sysroot/include/spawn.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SPAWN_H_
+#define SYSROOT_SPAWN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,16 +23,16 @@
 #define POSIX_SPAWN_SETSCHEDULER 32
 
 typedef struct {
-    int __flags;
-    pid_t __pgrp;
-    sigset_t __def, __mask;
-    int __prio, __pol, __pad[16];
+  int __flags;
+  pid_t __pgrp;
+  sigset_t __def, __mask;
+  int __prio, __pol, __pad[16];
 } posix_spawnattr_t;
 
 typedef struct {
-    int __pad0[2];
-    void* __actions;
-    int __pad[16];
+  int __pad0[2];
+  void* __actions;
+  int __pad[16];
 } posix_spawn_file_actions_t;
 
 int posix_spawn(pid_t* __restrict, const char* __restrict, const posix_spawn_file_actions_t*,
@@ -74,3 +75,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SPAWN_H_
diff --git a/arch/x64/sysroot/include/stdio.h b/arch/x64/sysroot/include/stdio.h
index fde69be..c08aba0 100644
--- a/arch/x64/sysroot/include/stdio.h
+++ b/arch/x64/sysroot/include/stdio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STDIO_H_
+#define SYSROOT_STDIO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -44,8 +45,8 @@
 #define L_tmpnam 20
 
 typedef union _G_fpos64_t {
-    char __opaque[16];
-    double __align;
+  char __opaque[16];
+  double __align;
 } fpos_t;
 
 extern FILE* const stdin;
@@ -180,3 +181,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STDIO_H_
diff --git a/arch/x64/sysroot/include/stdlib.h b/arch/x64/sysroot/include/stdlib.h
index 0c29b16..862c83f 100644
--- a/arch/x64/sysroot/include/stdlib.h
+++ b/arch/x64/sysroot/include/stdlib.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_STDLIB_H_
+#define SYSROOT_STDLIB_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -53,9 +55,15 @@
 long labs(long);
 long long llabs(long long);
 
-typedef struct { int quot, rem; } div_t;
-typedef struct { long quot, rem; } ldiv_t;
-typedef struct { long long quot, rem; } lldiv_t;
+typedef struct {
+  int quot, rem;
+} div_t;
+typedef struct {
+  long quot, rem;
+} ldiv_t;
+typedef struct {
+  long long quot, rem;
+} lldiv_t;
 
 div_t div(int, int);
 ldiv_t ldiv(long, long);
@@ -110,7 +118,6 @@
 int grantpt(int);
 int unlockpt(int);
 char* ptsname(int);
-char* l64a(long);
 long a64l(const char*);
 void setkey(const char*);
 double drand48(void);
@@ -146,3 +153,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STDLIB_H_
diff --git a/arch/x64/sysroot/include/stdnoreturn.h b/arch/x64/sysroot/include/stdnoreturn.h
deleted file mode 100644
index 574bcca..0000000
--- a/arch/x64/sysroot/include/stdnoreturn.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-
-#ifndef __cplusplus
-#include <features.h>
-#define noreturn _Noreturn
-#endif
diff --git a/arch/x64/sysroot/include/string.h b/arch/x64/sysroot/include/string.h
index d7ea6bb..0265b57 100644
--- a/arch/x64/sysroot/include/string.h
+++ b/arch/x64/sysroot/include/string.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_STRING_H_
+#define SYSROOT_STRING_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -84,3 +86,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STRING_H_
diff --git a/arch/x64/sysroot/include/strings.h b/arch/x64/sysroot/include/strings.h
index 343f31a..eb703d1 100644
--- a/arch/x64/sysroot/include/strings.h
+++ b/arch/x64/sysroot/include/strings.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STRINGS_H_
+#define SYSROOT_STRINGS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -33,3 +34,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STRINGS_H_
diff --git a/arch/x64/sysroot/include/stropts.h b/arch/x64/sysroot/include/stropts.h
index c2e6b7f..92eb968 100644
--- a/arch/x64/sysroot/include/stropts.h
+++ b/arch/x64/sysroot/include/stropts.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_STROPTS_H_
+#define SYSROOT_STROPTS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -81,51 +82,51 @@
 #define MOREDATA 2
 
 struct bandinfo {
-    unsigned char bi_pri;
-    int bi_flag;
+  unsigned char bi_pri;
+  int bi_flag;
 };
 
 struct strbuf {
-    int maxlen;
-    int len;
-    char* buf;
+  int maxlen;
+  int len;
+  char* buf;
 };
 
 struct strpeek {
-    struct strbuf ctlbuf;
-    struct strbuf databuf;
-    unsigned flags;
+  struct strbuf ctlbuf;
+  struct strbuf databuf;
+  unsigned flags;
 };
 
 struct strfdinsert {
-    struct strbuf ctlbuf;
-    struct strbuf databuf;
-    unsigned flags;
-    int fildes;
-    int offset;
+  struct strbuf ctlbuf;
+  struct strbuf databuf;
+  unsigned flags;
+  int fildes;
+  int offset;
 };
 
 struct strioctl {
-    int ic_cmd;
-    int ic_timout;
-    int ic_len;
-    char* ic_dp;
+  int ic_cmd;
+  int ic_timout;
+  int ic_len;
+  char* ic_dp;
 };
 
 struct strrecvfd {
-    int fd;
-    int uid;
-    int gid;
-    char __fill[8];
+  int fd;
+  int uid;
+  int gid;
+  char __fill[8];
 };
 
 struct str_mlist {
-    char l_name[FMNAMESZ + 1];
+  char l_name[FMNAMESZ + 1];
 };
 
 struct str_list {
-    int sl_nmods;
-    struct str_mlist* sl_modlist;
+  int sl_nmods;
+  struct str_mlist* sl_modlist;
 };
 
 int isastream(int);
@@ -134,3 +135,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_STROPTS_H_
diff --git a/arch/x64/sysroot/include/sys/acct.h b/arch/x64/sysroot/include/sys/acct.h
index be32528..8561ad0 100644
--- a/arch/x64/sysroot/include/sys/acct.h
+++ b/arch/x64/sysroot/include/sys/acct.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_ACCT_H_
+#define SYSROOT_SYS_ACCT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,45 +15,45 @@
 typedef uint16_t comp_t;
 
 struct acct {
-    char ac_flag;
-    uint16_t ac_uid;
-    uint16_t ac_gid;
-    uint16_t ac_tty;
-    uint32_t ac_btime;
-    comp_t ac_utime;
-    comp_t ac_stime;
-    comp_t ac_etime;
-    comp_t ac_mem;
-    comp_t ac_io;
-    comp_t ac_rw;
-    comp_t ac_minflt;
-    comp_t ac_majflt;
-    comp_t ac_swaps;
-    uint32_t ac_exitcode;
-    char ac_comm[ACCT_COMM + 1];
-    char ac_pad[10];
+  char ac_flag;
+  uint16_t ac_uid;
+  uint16_t ac_gid;
+  uint16_t ac_tty;
+  uint32_t ac_btime;
+  comp_t ac_utime;
+  comp_t ac_stime;
+  comp_t ac_etime;
+  comp_t ac_mem;
+  comp_t ac_io;
+  comp_t ac_rw;
+  comp_t ac_minflt;
+  comp_t ac_majflt;
+  comp_t ac_swaps;
+  uint32_t ac_exitcode;
+  char ac_comm[ACCT_COMM + 1];
+  char ac_pad[10];
 };
 
 struct acct_v3 {
-    char ac_flag;
-    char ac_version;
-    uint16_t ac_tty;
-    uint32_t ac_exitcode;
-    uint32_t ac_uid;
-    uint32_t ac_gid;
-    uint32_t ac_pid;
-    uint32_t ac_ppid;
-    uint32_t ac_btime;
-    float ac_etime;
-    comp_t ac_utime;
-    comp_t ac_stime;
-    comp_t ac_mem;
-    comp_t ac_io;
-    comp_t ac_rw;
-    comp_t ac_minflt;
-    comp_t ac_majflt;
-    comp_t ac_swaps;
-    char ac_comm[ACCT_COMM];
+  char ac_flag;
+  char ac_version;
+  uint16_t ac_tty;
+  uint32_t ac_exitcode;
+  uint32_t ac_uid;
+  uint32_t ac_gid;
+  uint32_t ac_pid;
+  uint32_t ac_ppid;
+  uint32_t ac_btime;
+  float ac_etime;
+  comp_t ac_utime;
+  comp_t ac_stime;
+  comp_t ac_mem;
+  comp_t ac_io;
+  comp_t ac_rw;
+  comp_t ac_minflt;
+  comp_t ac_majflt;
+  comp_t ac_swaps;
+  char ac_comm[ACCT_COMM];
 };
 
 #define AFORK 1
@@ -67,3 +68,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_ACCT_H_
diff --git a/arch/x64/sysroot/include/sys/auxv.h b/arch/x64/sysroot/include/sys/auxv.h
index 72d5de9..61ddea0 100644
--- a/arch/x64/sysroot/include/sys/auxv.h
+++ b/arch/x64/sysroot/include/sys/auxv.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_AUXV_H_
+#define SYSROOT_SYS_AUXV_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_AUXV_H_
diff --git a/arch/x64/sysroot/include/sys/eventfd.h b/arch/x64/sysroot/include/sys/eventfd.h
index c22369e..4259bac 100644
--- a/arch/x64/sysroot/include/sys/eventfd.h
+++ b/arch/x64/sysroot/include/sys/eventfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_EVENTFD_H_
+#define SYSROOT_SYS_EVENTFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -20,3 +21,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_EVENTFD_H_
diff --git a/arch/x64/sysroot/include/sys/file.h b/arch/x64/sysroot/include/sys/file.h
index c32fcb8..fe17290 100644
--- a/arch/x64/sysroot/include/sys/file.h
+++ b/arch/x64/sysroot/include/sys/file.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_FILE_H_
+#define SYSROOT_SYS_FILE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_FILE_H_
diff --git a/arch/x64/sysroot/include/sys/fsuid.h b/arch/x64/sysroot/include/sys/fsuid.h
index 29ea02b..a9f654c 100644
--- a/arch/x64/sysroot/include/sys/fsuid.h
+++ b/arch/x64/sysroot/include/sys/fsuid.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_FSUID_H_
+#define SYSROOT_SYS_FSUID_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,3 +16,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_FSUID_H_
diff --git a/arch/x64/sysroot/include/sys/io.h b/arch/x64/sysroot/include/sys/io.h
index f5013a2..89617e5 100644
--- a/arch/x64/sysroot/include/sys/io.h
+++ b/arch/x64/sysroot/include/sys/io.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IO_H_
+#define SYSROOT_SYS_IO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,3 +15,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IO_H_
diff --git a/arch/x64/sysroot/include/sys/ioctl.h b/arch/x64/sysroot/include/sys/ioctl.h
index c782d2e..ad22a3b 100644
--- a/arch/x64/sysroot/include/sys/ioctl.h
+++ b/arch/x64/sysroot/include/sys/ioctl.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IOCTL_H_
+#define SYSROOT_SYS_IOCTL_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IOCTL_H_
diff --git a/arch/x64/sysroot/include/sys/ipc.h b/arch/x64/sysroot/include/sys/ipc.h
index a3a380c..5d019f4 100644
--- a/arch/x64/sysroot/include/sys/ipc.h
+++ b/arch/x64/sysroot/include/sys/ipc.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_IPC_H_
+#define SYSROOT_SYS_IPC_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,3 +40,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_IPC_H_
diff --git a/arch/x64/sysroot/include/sys/klog.h b/arch/x64/sysroot/include/sys/klog.h
index ccde5e8..b182302 100644
--- a/arch/x64/sysroot/include/sys/klog.h
+++ b/arch/x64/sysroot/include/sys/klog.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_KLOG_H_
+#define SYSROOT_SYS_KLOG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,3 +10,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_KLOG_H_
diff --git a/arch/x64/sysroot/include/sys/mman.h b/arch/x64/sysroot/include/sys/mman.h
index c5ff3bf..7a913ae 100644
--- a/arch/x64/sysroot/include/sys/mman.h
+++ b/arch/x64/sysroot/include/sys/mman.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MMAN_H_
+#define SYSROOT_SYS_MMAN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,6 +30,7 @@
 #define MAP_NONBLOCK 0x10000
 #define MAP_STACK 0x20000
 #define MAP_HUGETLB 0x40000
+#define MAP_JIT 0x80000
 #define MAP_FILE 0
 
 #define PROT_NONE 0
@@ -96,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MMAN_H_
diff --git a/arch/x64/sysroot/include/sys/mount.h b/arch/x64/sysroot/include/sys/mount.h
index 9d3394b..53181ea 100644
--- a/arch/x64/sysroot/include/sys/mount.h
+++ b/arch/x64/sysroot/include/sys/mount.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MOUNT_H_
+#define SYSROOT_SYS_MOUNT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -68,3 +69,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MOUNT_H_
diff --git a/arch/x64/sysroot/include/sys/msg.h b/arch/x64/sysroot/include/sys/msg.h
index 6d08dad..be0114b 100644
--- a/arch/x64/sysroot/include/sys/msg.h
+++ b/arch/x64/sysroot/include/sys/msg.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_MSG_H_
+#define SYSROOT_SYS_MSG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -28,8 +29,8 @@
 #define MSG_INFO 12
 
 struct msginfo {
-    int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
-    unsigned short msgseg;
+  int msgpool, msgmap, msgmax, msgmnb, msgmni, msgssz, msgtql;
+  unsigned short msgseg;
 };
 
 int msgctl(int, int, struct msqid_ds*);
@@ -39,11 +40,13 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 struct msgbuf {
-    long mtype;
-    char mtext[1];
+  long mtype;
+  char mtext[1];
 };
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_MSG_H_
diff --git a/arch/x64/sysroot/include/sys/mtio.h b/arch/x64/sysroot/include/sys/mtio.h
index 2f4cf9a..3d9f753 100644
--- a/arch/x64/sysroot/include/sys/mtio.h
+++ b/arch/x64/sysroot/include/sys/mtio.h
@@ -1,11 +1,12 @@
-#pragma once
+#ifndef SYSROOT_SYS_MTIO_H_
+#define SYSROOT_SYS_MTIO_H_
 
 #include <sys/ioctl.h>
 #include <sys/types.h>
 
 struct mtop {
-    short mt_op;
-    int mt_count;
+  short mt_op;
+  int mt_count;
 };
 
 #define _IOT_mtop _IOT(_IOTS(short), 1, _IOTS(int), 1, 0, 0)
@@ -47,13 +48,13 @@
 #define MTMKPART 34
 
 struct mtget {
-    long mt_type;
-    long mt_resid;
-    long mt_dsreg;
-    long mt_gstat;
-    long mt_erreg;
-    int mt_fileno;
-    int mt_blkno;
+  long mt_type;
+  long mt_resid;
+  long mt_dsreg;
+  long mt_gstat;
+  long mt_erreg;
+  int mt_fileno;
+  int mt_blkno;
 };
 
 #define MT_ISUNKNOWN 0x01
@@ -78,53 +79,51 @@
 #define MT_ISFTAPE_FLAG 0x800000
 
 struct mt_tape_info {
-    long t_type;
-    char* t_name;
+  long t_type;
+  char* t_name;
 };
 
 #define MT_TAPE_INFO                                                                              \
-    {                                                                                             \
-        {MT_ISUNKNOWN, "Unknown type of tape device"},                                            \
-            {MT_ISQIC02, "Generic QIC-02 tape streamer"}, {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \
-            {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, {MT_ISCMSJ500, "CMS Jumbo 500"},            \
-            {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"},                                          \
-            {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"},                                        \
-            {MT_ISARCHIVE_2150L, "Archive Viper 2150L"},                                          \
-            {MT_ISARCHIVE_2060L, "Archive Viper 2060L"},                                          \
-            {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"},                              \
-            {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"},                       \
-            {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"},                                       \
-            {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"},                           \
-            {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, {MT_ISSCSI1, "Generic SCSI-1 tape"},     \
-            {MT_ISSCSI2, "Generic SCSI-2 tape"}, {                                                \
-            0, 0                                                                                  \
-        }                                                                                         \
-    }
+  {                                                                                               \
+    {MT_ISUNKNOWN, "Unknown type of tape device"}, {MT_ISQIC02, "Generic QIC-02 tape streamer"},  \
+        {MT_ISWT5150, "Wangtek 5150, QIC-150"}, {MT_ISARCHIVE_5945L2, "Archive 5945L-2"},         \
+        {MT_ISCMSJ500, "CMS Jumbo 500"}, {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"},             \
+        {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"},                                            \
+        {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \
+        {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"},                                  \
+        {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"},                           \
+        {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"},                                           \
+        {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"},                               \
+        {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, {MT_ISSCSI1, "Generic SCSI-1 tape"},         \
+        {MT_ISSCSI2, "Generic SCSI-2 tape"}, {                                                    \
+      0, 0                                                                                        \
+    }                                                                                             \
+  }
 
 struct mtpos {
-    long mt_blkno;
+  long mt_blkno;
 };
 
 struct mtconfiginfo {
-    long mt_type;
-    long ifc_type;
-    unsigned short irqnr;
-    unsigned short dmanr;
-    unsigned short port;
-    unsigned long debug;
-    unsigned have_dens : 1;
-    unsigned have_bsf : 1;
-    unsigned have_fsr : 1;
-    unsigned have_bsr : 1;
-    unsigned have_eod : 1;
-    unsigned have_seek : 1;
-    unsigned have_tell : 1;
-    unsigned have_ras1 : 1;
-    unsigned have_ras2 : 1;
-    unsigned have_ras3 : 1;
-    unsigned have_qfa : 1;
-    unsigned pad1 : 5;
-    char reserved[10];
+  long mt_type;
+  long ifc_type;
+  unsigned short irqnr;
+  unsigned short dmanr;
+  unsigned short port;
+  unsigned long debug;
+  unsigned have_dens : 1;
+  unsigned have_bsf : 1;
+  unsigned have_fsr : 1;
+  unsigned have_bsr : 1;
+  unsigned have_eod : 1;
+  unsigned have_seek : 1;
+  unsigned have_tell : 1;
+  unsigned have_ras1 : 1;
+  unsigned have_ras2 : 1;
+  unsigned have_ras3 : 1;
+  unsigned have_qfa : 1;
+  unsigned pad1 : 5;
+  char reserved[10];
 };
 
 #define MTIOCTOP _IOW('m', 1, struct mtop)
@@ -180,3 +179,5 @@
 #ifndef DEFTAPE
 #define DEFTAPE "/dev/tape"
 #endif
+
+#endif  // SYSROOT_SYS_MTIO_H_
diff --git a/arch/x64/sysroot/include/sys/param.h b/arch/x64/sysroot/include/sys/param.h
index 64989a4..301bba7 100644
--- a/arch/x64/sysroot/include/sys/param.h
+++ b/arch/x64/sysroot/include/sys/param.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_PARAM_H_
+#define SYSROOT_SYS_PARAM_H_
 
 #define MAXSYMLINKS 20
 #define MAXHOSTNAMELEN 64
@@ -29,3 +30,5 @@
 
 #include <endian.h>
 #include <limits.h>
+
+#endif  // SYSROOT_SYS_PARAM_H_
diff --git a/arch/x64/sysroot/include/sys/personality.h b/arch/x64/sysroot/include/sys/personality.h
index 3da0e20..b32d1eb 100644
--- a/arch/x64/sysroot/include/sys/personality.h
+++ b/arch/x64/sysroot/include/sys/personality.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_PERSONALITY_H_
+#define SYSROOT_SYS_PERSONALITY_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,3 +43,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_PERSONALITY_H_
diff --git a/arch/x64/sysroot/include/sys/quota.h b/arch/x64/sysroot/include/sys/quota.h
index ae2e194..aec5dc9 100644
--- a/arch/x64/sysroot/include/sys/quota.h
+++ b/arch/x64/sysroot/include/sys/quota.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_QUOTA_H_
+#define SYSROOT_SYS_QUOTA_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -57,15 +58,15 @@
 #define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
 
 struct dqblk {
-    uint64_t dqb_bhardlimit;
-    uint64_t dqb_bsoftlimit;
-    uint64_t dqb_curspace;
-    uint64_t dqb_ihardlimit;
-    uint64_t dqb_isoftlimit;
-    uint64_t dqb_curinodes;
-    uint64_t dqb_btime;
-    uint64_t dqb_itime;
-    uint32_t dqb_valid;
+  uint64_t dqb_bhardlimit;
+  uint64_t dqb_bsoftlimit;
+  uint64_t dqb_curspace;
+  uint64_t dqb_ihardlimit;
+  uint64_t dqb_isoftlimit;
+  uint64_t dqb_curinodes;
+  uint64_t dqb_btime;
+  uint64_t dqb_itime;
+  uint32_t dqb_valid;
 };
 
 #define dq_bhardlimit dq_dqb.dqb_bhardlimit
@@ -86,10 +87,10 @@
 #define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
 
 struct dqinfo {
-    uint64_t dqi_bgrace;
-    uint64_t dqi_igrace;
-    uint32_t dqi_flags;
-    uint32_t dqi_valid;
+  uint64_t dqi_bgrace;
+  uint64_t dqi_igrace;
+  uint32_t dqi_flags;
+  uint32_t dqi_valid;
 };
 
 int quotactl(int, const char*, int, char*);
@@ -97,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_QUOTA_H_
diff --git a/arch/x64/sysroot/include/sys/random.h b/arch/x64/sysroot/include/sys/random.h
index 080c3b4..258201d 100644
--- a/arch/x64/sysroot/include/sys/random.h
+++ b/arch/x64/sysroot/include/sys/random.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_RANDOM_H_
+#define SYSROOT_SYS_RANDOM_H_
 
 #include <stddef.h>
 
@@ -11,3 +12,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_RANDOM_H_
diff --git a/arch/x64/sysroot/include/sys/reboot.h b/arch/x64/sysroot/include/sys/reboot.h
index f28375d..a83629c 100644
--- a/arch/x64/sysroot/include/sys/reboot.h
+++ b/arch/x64/sysroot/include/sys/reboot.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_REBOOT_H_
+#define SYSROOT_SYS_REBOOT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,3 +18,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_REBOOT_H_
diff --git a/arch/x64/sysroot/include/sys/reg.h b/arch/x64/sysroot/include/sys/reg.h
index 22a9caa..0f37ffe 100644
--- a/arch/x64/sysroot/include/sys/reg.h
+++ b/arch/x64/sysroot/include/sys/reg.h
@@ -1,6 +1,9 @@
-#pragma once
+#ifndef SYSROOT_SYS_REG_H_
+#define SYSROOT_SYS_REG_H_
 
 #include <limits.h>
 #include <unistd.h>
 
 #include <bits/reg.h>
+
+#endif  // SYSROOT_SYS_REG_H_
diff --git a/arch/x64/sysroot/include/sys/select.h b/arch/x64/sysroot/include/sys/select.h
index 25197d8..5d4fd7d 100644
--- a/arch/x64/sysroot/include/sys/select.h
+++ b/arch/x64/sysroot/include/sys/select.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SELECT_H_
+#define SYSROOT_SYS_SELECT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,21 +20,23 @@
 
 typedef unsigned long fd_mask;
 
-typedef struct { unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)]; } fd_set;
+typedef struct {
+  unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)];
+} fd_set;
 
-#define FD_ZERO(s)                                            \
-    do {                                                      \
-        int __i;                                              \
-        unsigned long* __b = (s)->fds_bits;                   \
-        for (__i = sizeof(fd_set) / sizeof(long); __i; __i--) \
-            *__b++ = 0;                                       \
-    } while (0)
+#define FD_ZERO(s)                                        \
+  do {                                                    \
+    int __i;                                              \
+    unsigned long* __b = (s)->fds_bits;                   \
+    for (__i = sizeof(fd_set) / sizeof(long); __i; __i--) \
+      *__b++ = 0;                                         \
+  } while (0)
 #define FD_SET(d, s) \
-    ((s)->fds_bits[(d) / (8 * sizeof(long))] |= (1UL << ((d) % (8 * sizeof(long)))))
+  ((s)->fds_bits[(d) / (8 * sizeof(long))] |= (1UL << ((d) % (8 * sizeof(long)))))
 #define FD_CLR(d, s) \
-    ((s)->fds_bits[(d) / (8 * sizeof(long))] &= ~(1UL << ((d) % (8 * sizeof(long)))))
+  ((s)->fds_bits[(d) / (8 * sizeof(long))] &= ~(1UL << ((d) % (8 * sizeof(long)))))
 #define FD_ISSET(d, s) \
-    !!((s)->fds_bits[(d) / (8 * sizeof(long))] & (1UL << ((d) % (8 * sizeof(long)))))
+  !!((s)->fds_bits[(d) / (8 * sizeof(long))] & (1UL << ((d) % (8 * sizeof(long)))))
 
 int select(int, fd_set* __restrict, fd_set* __restrict, fd_set* __restrict,
            struct timeval* __restrict);
@@ -47,3 +50,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SELECT_H_
diff --git a/arch/x64/sysroot/include/sys/sem.h b/arch/x64/sysroot/include/sys/sem.h
index 864161f..a4330af 100644
--- a/arch/x64/sysroot/include/sys/sem.h
+++ b/arch/x64/sysroot/include/sys/sem.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SEM_H_
+#define SYSROOT_SYS_SEM_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -12,10 +13,10 @@
 #ifdef _GNU_SOURCE
 #define __NEED_struct_timespec
 #endif
-#include <bits/alltypes.h>
-
 #include <sys/ipc.h>
 
+#include <bits/alltypes.h>
+
 #define SEM_UNDO 0x1000
 #define GETPID 11
 #define GETVAL 12
@@ -35,22 +36,22 @@
 #define SEM_INFO 19
 
 struct seminfo {
-    int semmap;
-    int semmni;
-    int semmns;
-    int semmnu;
-    int semmsl;
-    int semopm;
-    int semume;
-    int semusz;
-    int semvzx;
-    int semaem;
+  int semmap;
+  int semmni;
+  int semmns;
+  int semmnu;
+  int semmsl;
+  int semopm;
+  int semume;
+  int semusz;
+  int semvzx;
+  int semaem;
 };
 
 struct sembuf {
-    unsigned short sem_num;
-    short sem_op;
-    short sem_flg;
+  unsigned short sem_num;
+  short sem_op;
+  short sem_flg;
 };
 
 int semctl(int, int, int, ...);
@@ -64,3 +65,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SEM_H_
diff --git a/arch/x64/sysroot/include/sys/sendfile.h b/arch/x64/sysroot/include/sys/sendfile.h
deleted file mode 100644
index 1c94a6b..0000000
--- a/arch/x64/sysroot/include/sys/sendfile.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <features.h>
-#include <unistd.h>
-
-ssize_t sendfile(int, int, off_t*, size_t);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/arch/x64/sysroot/include/sys/shm.h b/arch/x64/sysroot/include/sys/shm.h
index b4780d6..55b4389 100644
--- a/arch/x64/sysroot/include/sys/shm.h
+++ b/arch/x64/sysroot/include/sys/shm.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SHM_H_
+#define SYSROOT_SYS_SHM_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,10 +11,10 @@
 #define __NEED_size_t
 #define __NEED_pid_t
 
-#include <bits/alltypes.h>
-
 #include <sys/ipc.h>
 
+#include <bits/alltypes.h>
+
 #ifdef _GNU_SOURCE
 #define __used_ids used_ids
 #define __swap_attempts swap_attempts
@@ -49,3 +50,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SHM_H_
diff --git a/arch/x64/sysroot/include/sys/signalfd.h b/arch/x64/sysroot/include/sys/signalfd.h
index 832cc78..46a5489 100644
--- a/arch/x64/sysroot/include/sys/signalfd.h
+++ b/arch/x64/sysroot/include/sys/signalfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SIGNALFD_H_
+#define SYSROOT_SYS_SIGNALFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,26 +18,28 @@
 int signalfd(int, const sigset_t*, int);
 
 struct signalfd_siginfo {
-    uint32_t ssi_signo;
-    int32_t ssi_errno;
-    int32_t ssi_code;
-    uint32_t ssi_pid;
-    uint32_t ssi_uid;
-    int32_t ssi_fd;
-    uint32_t ssi_tid;
-    uint32_t ssi_band;
-    uint32_t ssi_overrun;
-    uint32_t ssi_trapno;
-    int32_t ssi_status;
-    int32_t ssi_int;
-    uint64_t ssi_ptr;
-    uint64_t ssi_utime;
-    uint64_t ssi_stime;
-    uint64_t ssi_addr;
-    uint16_t ssi_addr_lsb;
-    uint8_t pad[128 - 12 * 4 - 4 * 8 - 2];
+  uint32_t ssi_signo;
+  int32_t ssi_errno;
+  int32_t ssi_code;
+  uint32_t ssi_pid;
+  uint32_t ssi_uid;
+  int32_t ssi_fd;
+  uint32_t ssi_tid;
+  uint32_t ssi_band;
+  uint32_t ssi_overrun;
+  uint32_t ssi_trapno;
+  int32_t ssi_status;
+  int32_t ssi_int;
+  uint64_t ssi_ptr;
+  uint64_t ssi_utime;
+  uint64_t ssi_stime;
+  uint64_t ssi_addr;
+  uint16_t ssi_addr_lsb;
+  uint8_t pad[128 - 12 * 4 - 4 * 8 - 2];
 };
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SIGNALFD_H_
diff --git a/arch/x64/sysroot/include/sys/socket.h b/arch/x64/sysroot/include/sys/socket.h
index 10167be..7f68e6e 100644
--- a/arch/x64/sysroot/include/sys/socket.h
+++ b/arch/x64/sysroot/include/sys/socket.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SOCKET_H_
+#define SYSROOT_SYS_SOCKET_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -16,19 +17,18 @@
 #define __NEED_struct_iovec
 
 #include <bits/alltypes.h>
-
 #include <bits/socket.h>
 
 #ifdef _GNU_SOURCE
 struct ucred {
-    pid_t pid;
-    uid_t uid;
-    gid_t gid;
+  pid_t pid;
+  uid_t uid;
+  gid_t gid;
 };
 
 struct mmsghdr {
-    struct msghdr msg_hdr;
-    unsigned int msg_len;
+  struct msghdr msg_hdr;
+  unsigned int msg_len;
 };
 
 struct timespec;
@@ -38,8 +38,8 @@
 #endif
 
 struct linger {
-    int l_onoff;
-    int l_linger;
+  int l_onoff;
+  int l_linger;
 };
 
 #define SHUT_RD 0
@@ -260,16 +260,15 @@
 #define __MHDR_END(mhdr) ((unsigned char*)(mhdr)->msg_control + (mhdr)->msg_controllen)
 
 #define CMSG_DATA(cmsg) ((unsigned char*)(((struct cmsghdr*)(cmsg)) + 1))
-#define CMSG_NXTHDR(mhdr, cmsg)                                            \
-    ((cmsg)->cmsg_len < sizeof(struct cmsghdr)                             \
-         ? (struct cmsghdr*)0                                              \
-         : (__CMSG_NEXT(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) \
-                ? (struct cmsghdr*)0                                       \
-                : ((struct cmsghdr*)__CMSG_NEXT(cmsg))))
-#define CMSG_FIRSTHDR(mhdr)                                   \
-    ((size_t)(mhdr)->msg_controllen >= sizeof(struct cmsghdr) \
-         ? (struct cmsghdr*)(mhdr)->msg_control               \
-         : (struct cmsghdr*)0)
+#define CMSG_NXTHDR(mhdr, cmsg)                                          \
+  ((cmsg)->cmsg_len < sizeof(struct cmsghdr)                             \
+       ? (struct cmsghdr*)0                                              \
+       : (__CMSG_NEXT(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) \
+              ? (struct cmsghdr*)0                                       \
+              : ((struct cmsghdr*)__CMSG_NEXT(cmsg))))
+#define CMSG_FIRSTHDR(mhdr)                                                                        \
+  ((size_t)(mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? (struct cmsghdr*)(mhdr)->msg_control \
+                                                            : (struct cmsghdr*)0)
 
 #define CMSG_ALIGN(len) (((len) + sizeof(size_t) - 1) & (size_t) ~(sizeof(size_t) - 1))
 #define CMSG_SPACE(len) (CMSG_ALIGN(len) + CMSG_ALIGN(sizeof(struct cmsghdr)))
@@ -279,14 +278,14 @@
 #define SCM_CREDENTIALS 0x02
 
 struct sockaddr {
-    sa_family_t sa_family;
-    char sa_data[14];
+  sa_family_t sa_family;
+  char sa_data[14];
 };
 
 struct sockaddr_storage {
-    sa_family_t ss_family;
-    unsigned long __ss_align;
-    char __ss_padding[128 - 2 * sizeof(unsigned long)];
+  sa_family_t ss_family;
+  unsigned long __ss_align;
+  char __ss_padding[128 - 2 * sizeof(unsigned long)];
 };
 
 int socket(int, int, int);
@@ -319,3 +318,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SOCKET_H_
diff --git a/arch/x64/sysroot/include/sys/stat.h b/arch/x64/sysroot/include/sys/stat.h
index 2be2ff5..d58e26c 100644
--- a/arch/x64/sysroot/include/sys/stat.h
+++ b/arch/x64/sysroot/include/sys/stat.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_STAT_H_
+#define SYSROOT_SYS_STAT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -19,7 +20,6 @@
 #define __NEED_struct_timespec
 
 #include <bits/alltypes.h>
-
 #include <bits/stat.h>
 
 #define st_atime st_atim.tv_sec
@@ -98,3 +98,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STAT_H_
diff --git a/arch/x64/sysroot/include/sys/statfs.h b/arch/x64/sysroot/include/sys/statfs.h
index c2a3d41..1459181 100644
--- a/arch/x64/sysroot/include/sys/statfs.h
+++ b/arch/x64/sysroot/include/sys/statfs.h
@@ -1,14 +1,16 @@
-#pragma once
+#ifndef SYSROOT_SYS_STATFS_H_
+#define SYSROOT_SYS_STATFS_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <sys/statvfs.h>
 
-typedef struct __fsid_t { int __val[2]; } fsid_t;
+typedef struct __fsid_t {
+  int __val[2];
+} fsid_t;
 
 #include <bits/statfs.h>
 
@@ -18,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STATFS_H_
diff --git a/arch/x64/sysroot/include/sys/statvfs.h b/arch/x64/sysroot/include/sys/statvfs.h
index 6031e66..0423246 100644
--- a/arch/x64/sysroot/include/sys/statvfs.h
+++ b/arch/x64/sysroot/include/sys/statvfs.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_STATVFS_H_
+#define SYSROOT_SYS_STATVFS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -8,23 +9,23 @@
 
 #define __NEED_fsblkcnt_t
 #define __NEED_fsfilcnt_t
-#include <bits/alltypes.h>
-
 #include <endian.h>
 
+#include <bits/alltypes.h>
+
 struct statvfs {
-    unsigned long f_bsize, f_frsize;
-    fsblkcnt_t f_blocks, f_bfree, f_bavail;
-    fsfilcnt_t f_files, f_ffree, f_favail;
+  unsigned long f_bsize, f_frsize;
+  fsblkcnt_t f_blocks, f_bfree, f_bavail;
+  fsfilcnt_t f_files, f_ffree, f_favail;
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-    unsigned long f_fsid;
-    unsigned : 8 * (2 * sizeof(int) - sizeof(long));
+  unsigned long f_fsid;
+  unsigned : 8 * (2 * sizeof(int) - sizeof(long));
 #else
-    unsigned : 8 * (2 * sizeof(int) - sizeof(long));
-    unsigned long f_fsid;
+  unsigned : 8 * (2 * sizeof(int) - sizeof(long));
+  unsigned long f_fsid;
 #endif
-    unsigned long f_flag, f_namemax;
-    int __reserved[6];
+  unsigned long f_flag, f_namemax;
+  int __reserved[6];
 };
 
 int statvfs(const char* __restrict, struct statvfs* __restrict);
@@ -45,3 +46,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_STATVFS_H_
diff --git a/arch/x64/sysroot/include/sys/swap.h b/arch/x64/sysroot/include/sys/swap.h
index e9d516d..6420606 100644
--- a/arch/x64/sysroot/include/sys/swap.h
+++ b/arch/x64/sysroot/include/sys/swap.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_SWAP_H_
+#define SYSROOT_SYS_SWAP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,3 +16,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_SWAP_H_
diff --git a/arch/x64/sysroot/include/sys/time.h b/arch/x64/sysroot/include/sys/time.h
index 81c410a..a9476c7 100644
--- a/arch/x64/sysroot/include/sys/time.h
+++ b/arch/x64/sysroot/include/sys/time.h
@@ -1,11 +1,11 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIME_H_
+#define SYSROOT_SYS_TIME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <sys/select.h>
 
 int gettimeofday(struct timeval* __restrict, void* __restrict);
@@ -17,8 +17,8 @@
 #define ITIMER_PROF 2
 
 struct itimerval {
-    struct timeval it_interval;
-    struct timeval it_value;
+  struct timeval it_interval;
+  struct timeval it_value;
 };
 
 int getitimer(int, struct itimerval*);
@@ -29,8 +29,8 @@
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 struct timezone {
-    int tz_minuteswest;
-    int tz_dsttime;
+  int tz_minuteswest;
+  int tz_dsttime;
 };
 int futimes(int, const struct timeval[2]);
 int futimesat(int, const char*, const struct timeval[2]);
@@ -40,24 +40,26 @@
 #define timerisset(t) ((t)->tv_sec || (t)->tv_usec)
 #define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0)
 #define timercmp(s, t, op) \
-    ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op(t)->tv_usec : (s)->tv_sec op(t)->tv_sec)
-#define timeradd(s, t, a)                                             \
-    (void)((a)->tv_sec = (s)->tv_sec + (t)->tv_sec,                   \
-           ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
-               ((a)->tv_usec -= 1000000, (a)->tv_sec++))
-#define timersub(s, t, a)                                      \
-    (void)((a)->tv_sec = (s)->tv_sec - (t)->tv_sec,            \
-           ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
-               ((a)->tv_usec += 1000000, (a)->tv_sec--))
+  ((s)->tv_sec == (t)->tv_sec ? (s)->tv_usec op(t)->tv_usec : (s)->tv_sec op(t)->tv_sec)
+#define timeradd(s, t, a)                                           \
+  (void)((a)->tv_sec = (s)->tv_sec + (t)->tv_sec,                   \
+         ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \
+             ((a)->tv_usec -= 1000000, (a)->tv_sec++))
+#define timersub(s, t, a)                                    \
+  (void)((a)->tv_sec = (s)->tv_sec - (t)->tv_sec,            \
+         ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \
+             ((a)->tv_usec += 1000000, (a)->tv_sec--))
 #endif
 
 #if defined(_GNU_SOURCE)
 #define TIMEVAL_TO_TIMESPEC(tv, ts) \
-    ((ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0)
+  ((ts)->tv_sec = (tv)->tv_sec, (ts)->tv_nsec = (tv)->tv_usec * 1000, (void)0)
 #define TIMESPEC_TO_TIMEVAL(tv, ts) \
-    ((tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0)
+  ((tv)->tv_sec = (ts)->tv_sec, (tv)->tv_usec = (ts)->tv_nsec / 1000, (void)0)
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIME_H_
diff --git a/arch/x64/sysroot/include/sys/timeb.h b/arch/x64/sysroot/include/sys/timeb.h
index 560158b..bbb7e34 100644
--- a/arch/x64/sysroot/include/sys/timeb.h
+++ b/arch/x64/sysroot/include/sys/timeb.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMEB_H_
+#define SYSROOT_SYS_TIMEB_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,9 +10,9 @@
 #include <bits/alltypes.h>
 
 struct timeb {
-    time_t time;
-    unsigned short millitm;
-    short timezone, dstflag;
+  time_t time;
+  unsigned short millitm;
+  short timezone, dstflag;
 };
 
 int ftime(struct timeb*);
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMEB_H_
diff --git a/arch/x64/sysroot/include/sys/timerfd.h b/arch/x64/sysroot/include/sys/timerfd.h
index c6b52b3..499a938 100644
--- a/arch/x64/sysroot/include/sys/timerfd.h
+++ b/arch/x64/sysroot/include/sys/timerfd.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMERFD_H_
+#define SYSROOT_SYS_TIMERFD_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -21,3 +22,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMERFD_H_
diff --git a/arch/x64/sysroot/include/sys/times.h b/arch/x64/sysroot/include/sys/times.h
index d573297..ec5d3d6 100644
--- a/arch/x64/sysroot/include/sys/times.h
+++ b/arch/x64/sysroot/include/sys/times.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMES_H_
+#define SYSROOT_SYS_TIMES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -8,10 +9,10 @@
 #include <bits/alltypes.h>
 
 struct tms {
-    clock_t tms_utime;
-    clock_t tms_stime;
-    clock_t tms_cutime;
-    clock_t tms_cstime;
+  clock_t tms_utime;
+  clock_t tms_stime;
+  clock_t tms_cutime;
+  clock_t tms_cstime;
 };
 
 clock_t times(struct tms*);
@@ -19,3 +20,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMES_H_
diff --git a/arch/x64/sysroot/include/sys/timex.h b/arch/x64/sysroot/include/sys/timex.h
index 8aa166e..9981c93 100644
--- a/arch/x64/sysroot/include/sys/timex.h
+++ b/arch/x64/sysroot/include/sys/timex.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TIMEX_H_
+#define SYSROOT_SYS_TIMEX_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -6,26 +7,26 @@
 
 #define __NEED_clockid_t
 
-#include <bits/alltypes.h>
-
 #include <sys/time.h>
 
+#include <bits/alltypes.h>
+
 struct ntptimeval {
-    struct timeval time;
-    long maxerror, esterror;
+  struct timeval time;
+  long maxerror, esterror;
 };
 
 struct timex {
-    unsigned modes;
-    long offset, freq, maxerror, esterror;
-    int status;
-    long constant, precision, tolerance;
-    struct timeval time;
-    long tick, ppsfreq, jitter;
-    int shift;
-    long stabil, jitcnt, calcnt, errcnt, stbcnt;
-    int tai;
-    int __padding[11];
+  unsigned modes;
+  long offset, freq, maxerror, esterror;
+  int status;
+  long constant, precision, tolerance;
+  struct timeval time;
+  long tick, ppsfreq, jitter;
+  int shift;
+  long stabil, jitcnt, calcnt, errcnt, stbcnt;
+  int tai;
+  int __padding[11];
 };
 
 #define ADJ_OFFSET 0x0001
@@ -74,9 +75,9 @@
 #define STA_MODE 0x4000
 #define STA_CLK 0x8000
 
-#define STA_RONLY                                                                             \
-    (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | \
-     STA_MODE | STA_CLK)
+#define STA_RONLY                                                                           \
+  (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR | STA_NANO | \
+   STA_MODE | STA_CLK)
 
 #define TIME_OK 0
 #define TIME_INS 1
@@ -94,3 +95,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TIMEX_H_
diff --git a/arch/x64/sysroot/include/sys/ttydefaults.h b/arch/x64/sysroot/include/sys/ttydefaults.h
index 742e3a9..e4994fe 100644
--- a/arch/x64/sysroot/include/sys/ttydefaults.h
+++ b/arch/x64/sysroot/include/sys/ttydefaults.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TTYDEFAULTS_H_
+#define SYSROOT_SYS_TTYDEFAULTS_H_
 
 #define TTYDEF_IFLAG (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
 #define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
@@ -34,3 +35,5 @@
 #define CBRK CEOL
 #define CRPRNT CREPRINT
 #define CFLUSH CDISCARD
+
+#endif  // SYSROOT_SYS_TTYDEFAULTS_H_
diff --git a/arch/x64/sysroot/include/sys/types.h b/arch/x64/sysroot/include/sys/types.h
index b1c2a27..ea195a0 100644
--- a/arch/x64/sysroot/include/sys/types.h
+++ b/arch/x64/sysroot/include/sys/types.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_TYPES_H_
+#define SYSROOT_SYS_TYPES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -71,3 +72,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_TYPES_H_
diff --git a/arch/x64/sysroot/include/sys/uio.h b/arch/x64/sysroot/include/sys/uio.h
index e9f7b5d..4762083 100644
--- a/arch/x64/sysroot/include/sys/uio.h
+++ b/arch/x64/sysroot/include/sys/uio.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_UIO_H_
+#define SYSROOT_SYS_UIO_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,3 +30,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UIO_H_
diff --git a/arch/x64/sysroot/include/sys/un.h b/arch/x64/sysroot/include/sys/un.h
index 52bebd4..425c801 100644
--- a/arch/x64/sysroot/include/sys/un.h
+++ b/arch/x64/sysroot/include/sys/un.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_UN_H_
+#define SYSROOT_SYS_UN_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,8 +15,8 @@
 #include <bits/alltypes.h>
 
 struct sockaddr_un {
-    sa_family_t sun_family;
-    char sun_path[108];
+  sa_family_t sun_family;
+  char sun_path[108];
 };
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -26,3 +27,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UN_H_
diff --git a/arch/x64/sysroot/include/sys/utsname.h b/arch/x64/sysroot/include/sys/utsname.h
index 0333c82..5d5fee1 100644
--- a/arch/x64/sysroot/include/sys/utsname.h
+++ b/arch/x64/sysroot/include/sys/utsname.h
@@ -1,21 +1,23 @@
-#pragma once
+#ifndef SYSROOT_SYS_UTSNAME_H_
+#define SYSROOT_SYS_UTSNAME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+#include <limits.h>
 
 struct utsname {
-    char sysname[65];
-    char nodename[65];
-    char release[65];
-    char version[65];
-    char machine[65];
+  char sysname[65];
+  char nodename[HOST_NAME_MAX + 1];
+  char release[65];
+  char version[65];
+  char machine[65];
 #ifdef _GNU_SOURCE
-    char domainname[65];
+  char domainname[65];
 #else
-    char __domainname[65];
+  char __domainname[65];
 #endif
 };
 
@@ -24,3 +26,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_UTSNAME_H_
diff --git a/arch/x64/sysroot/include/sys/wait.h b/arch/x64/sysroot/include/sys/wait.h
index f31bb8e..3b33520 100644
--- a/arch/x64/sysroot/include/sys/wait.h
+++ b/arch/x64/sysroot/include/sys/wait.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYS_WAIT_H_
+#define SYSROOT_SYS_WAIT_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,9 +11,7 @@
 #define __NEED_id_t
 #include <bits/alltypes.h>
 
-typedef enum { P_ALL = 0,
-               P_PID = 1,
-               P_PGID = 2 } idtype_t;
+typedef enum { P_ALL = 0, P_PID = 1, P_PGID = 2 } idtype_t;
 
 pid_t wait(int*);
 pid_t waitpid(pid_t, int*, int);
@@ -43,3 +42,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYS_WAIT_H_
diff --git a/arch/x64/sysroot/include/sysexits.h b/arch/x64/sysroot/include/sysexits.h
index 82f672a..ca2782d 100644
--- a/arch/x64/sysroot/include/sysexits.h
+++ b/arch/x64/sysroot/include/sysexits.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYSEXITS_H_
+#define SYSROOT_SYSEXITS_H_
 
 #define EX_OK 0
 #define EX__BASE 64
@@ -18,3 +19,5 @@
 #define EX_NOPERM 77
 #define EX_CONFIG 78
 #define EX__MAX 78
+
+#endif  // SYSROOT_SYSEXITS_H_
diff --git a/arch/x64/sysroot/include/syslog.h b/arch/x64/sysroot/include/syslog.h
index 76fdce7..dcb09e3 100644
--- a/arch/x64/sysroot/include/syslog.h
+++ b/arch/x64/sysroot/include/syslog.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_SYSLOG_H_
+#define SYSROOT_SYSLOG_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -69,50 +70,52 @@
 #define INTERNAL_NOPRI 0x10
 #define INTERNAL_MARK (LOG_NFACILITIES << 3)
 typedef struct {
-    char* c_name;
-    int c_val;
+  char* c_name;
+  int c_val;
 } CODE;
-#define prioritynames                                \
-    ((CODE*)(const CODE[]){{"alert", LOG_ALERT},     \
-                           {"crit", LOG_CRIT},       \
-                           {"debug", LOG_DEBUG},     \
-                           {"emerg", LOG_EMERG},     \
-                           {"err", LOG_ERR},         \
-                           {"error", LOG_ERR},       \
-                           {"info", LOG_INFO},       \
-                           {"none", INTERNAL_NOPRI}, \
-                           {"notice", LOG_NOTICE},   \
-                           {"panic", LOG_EMERG},     \
-                           {"warn", LOG_WARNING},    \
-                           {"warning", LOG_WARNING}, \
-                           {0, -1}})
-#define facilitynames                                  \
-    ((CODE*)(const CODE[]){{"auth", LOG_AUTH},         \
-                           {"authpriv", LOG_AUTHPRIV}, \
-                           {"cron", LOG_CRON},         \
-                           {"daemon", LOG_DAEMON},     \
-                           {"ftp", LOG_FTP},           \
-                           {"kern", LOG_KERN},         \
-                           {"lpr", LOG_LPR},           \
-                           {"mail", LOG_MAIL},         \
-                           {"mark", INTERNAL_MARK},    \
-                           {"news", LOG_NEWS},         \
-                           {"security", LOG_AUTH},     \
-                           {"syslog", LOG_SYSLOG},     \
-                           {"user", LOG_USER},         \
-                           {"uucp", LOG_UUCP},         \
-                           {"local0", LOG_LOCAL0},     \
-                           {"local1", LOG_LOCAL1},     \
-                           {"local2", LOG_LOCAL2},     \
-                           {"local3", LOG_LOCAL3},     \
-                           {"local4", LOG_LOCAL4},     \
-                           {"local5", LOG_LOCAL5},     \
-                           {"local6", LOG_LOCAL6},     \
-                           {"local7", LOG_LOCAL7},     \
-                           {0, -1}})
+#define prioritynames                              \
+  ((CODE*)(const CODE[]){{"alert", LOG_ALERT},     \
+                         {"crit", LOG_CRIT},       \
+                         {"debug", LOG_DEBUG},     \
+                         {"emerg", LOG_EMERG},     \
+                         {"err", LOG_ERR},         \
+                         {"error", LOG_ERR},       \
+                         {"info", LOG_INFO},       \
+                         {"none", INTERNAL_NOPRI}, \
+                         {"notice", LOG_NOTICE},   \
+                         {"panic", LOG_EMERG},     \
+                         {"warn", LOG_WARNING},    \
+                         {"warning", LOG_WARNING}, \
+                         {0, -1}})
+#define facilitynames                                \
+  ((CODE*)(const CODE[]){{"auth", LOG_AUTH},         \
+                         {"authpriv", LOG_AUTHPRIV}, \
+                         {"cron", LOG_CRON},         \
+                         {"daemon", LOG_DAEMON},     \
+                         {"ftp", LOG_FTP},           \
+                         {"kern", LOG_KERN},         \
+                         {"lpr", LOG_LPR},           \
+                         {"mail", LOG_MAIL},         \
+                         {"mark", INTERNAL_MARK},    \
+                         {"news", LOG_NEWS},         \
+                         {"security", LOG_AUTH},     \
+                         {"syslog", LOG_SYSLOG},     \
+                         {"user", LOG_USER},         \
+                         {"uucp", LOG_UUCP},         \
+                         {"local0", LOG_LOCAL0},     \
+                         {"local1", LOG_LOCAL1},     \
+                         {"local2", LOG_LOCAL2},     \
+                         {"local3", LOG_LOCAL3},     \
+                         {"local4", LOG_LOCAL4},     \
+                         {"local5", LOG_LOCAL5},     \
+                         {"local6", LOG_LOCAL6},     \
+                         {"local7", LOG_LOCAL7},     \
+                         {0, -1}})
 #endif
 #endif
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_SYSLOG_H_
diff --git a/arch/x64/sysroot/include/tar.h b/arch/x64/sysroot/include/tar.h
index 7703c2b..2dcb983 100644
--- a/arch/x64/sysroot/include/tar.h
+++ b/arch/x64/sysroot/include/tar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_TAR_H_
+#define SYSROOT_TAR_H_
 
 #define TSUID 04000
 #define TSGID 02000
@@ -28,3 +29,5 @@
 
 #define TVERSION "00"
 #define TVERSLEN 2
+
+#endif  // SYSROOT_TAR_H_
diff --git a/arch/x64/sysroot/include/termios.h b/arch/x64/sysroot/include/termios.h
index 65c9d66..4ccfe13 100644
--- a/arch/x64/sysroot/include/termios.h
+++ b/arch/x64/sysroot/include/termios.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_TERMIOS_H_
+#define SYSROOT_TERMIOS_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -41,3 +42,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_TERMIOS_H_
diff --git a/arch/x64/sysroot/include/threads.h b/arch/x64/sysroot/include/threads.h
index 8711302..480a6f7 100644
--- a/arch/x64/sysroot/include/threads.h
+++ b/arch/x64/sysroot/include/threads.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_THREADS_H_
+#define SYSROOT_THREADS_H_
 
 #include <features.h>
 #include <time.h>
@@ -24,26 +25,26 @@
 #define TSS_DTOR_ITERATIONS 4
 
 enum {
-    thrd_success = 0,
-    thrd_busy = 1,
-    thrd_error = 2,
-    thrd_nomem = 3,
-    thrd_timedout = 4,
+  thrd_success = 0,
+  thrd_busy = 1,
+  thrd_error = 2,
+  thrd_nomem = 3,
+  thrd_timedout = 4,
 };
 
 // These are bitfield values; initialize with e.g. (mtx_plain|mtx_timed).
 // mtx_recursive is not implemented.
 enum {
-    mtx_plain = 0,
-    mtx_recursive = 1,
-    mtx_timed = 2,
+  mtx_plain = 0,
+  mtx_recursive = 1,
+  mtx_timed = 2,
 };
 
 #ifdef _ALL_SOURCE
 #define MTX_INIT \
-    {}
+  {}
 #define CND_INIT \
-    {}
+  {}
 #endif
 
 #define ONCE_FLAG_INIT 0
@@ -76,14 +77,14 @@
 #ifdef __clang__
     __attribute__((__acquire_capability__(__m)))
 #endif
-;
+    ;
 int mtx_timedlock(mtx_t* __restrict, const struct timespec* __restrict);
 int mtx_trylock(mtx_t*);
 int mtx_unlock(mtx_t* __m)
 #ifdef __clang__
     __attribute__((__release_capability__(__m)))
 #endif
-;
+    ;
 
 int cnd_init(cnd_t*);
 void cnd_destroy(cnd_t*);
@@ -103,3 +104,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_THREADS_H_
diff --git a/arch/x64/sysroot/include/time.h b/arch/x64/sysroot/include/time.h
index c20b7db..b81da45 100644
--- a/arch/x64/sysroot/include/time.h
+++ b/arch/x64/sysroot/include/time.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_TIME_H_
+#define SYSROOT_TIME_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_size_t
@@ -27,17 +29,17 @@
 #endif
 
 struct tm {
-    int tm_sec;
-    int tm_min;
-    int tm_hour;
-    int tm_mday;
-    int tm_mon;
-    int tm_year;
-    int tm_wday;
-    int tm_yday;
-    int tm_isdst;
-    long __tm_gmtoff;
-    const char* __tm_zone;
+  int tm_sec;
+  int tm_min;
+  int tm_hour;
+  int tm_mday;
+  int tm_mon;
+  int tm_year;
+  int tm_wday;
+  int tm_yday;
+  int tm_isdst;
+  long __tm_gmtoff;
+  const char* __tm_zone;
 };
 
 clock_t clock(void);
@@ -66,8 +68,8 @@
 void tzset(void);
 
 struct itimerspec {
-    struct timespec it_interval;
-    struct timespec it_value;
+  struct timespec it_interval;
+  struct timespec it_value;
 };
 
 #define CLOCK_REALTIME 0
@@ -118,3 +120,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_TIME_H_
diff --git a/arch/x64/sysroot/include/uchar.h b/arch/x64/sysroot/include/uchar.h
index 73e5e5a..79cda7c 100644
--- a/arch/x64/sysroot/include/uchar.h
+++ b/arch/x64/sysroot/include/uchar.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_UCHAR_H_
+#define SYSROOT_UCHAR_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,9 +11,10 @@
 #define __NEED_mbstate_t
 #define __NEED_size_t
 
-#include <bits/alltypes.h>
 #include <features.h>
 
+#include <bits/alltypes.h>
+
 size_t c16rtomb(char* __restrict, char16_t, mbstate_t* __restrict);
 size_t mbrtoc16(char16_t* __restrict, const char* __restrict, size_t, mbstate_t* __restrict);
 
@@ -22,3 +24,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UCHAR_H_
diff --git a/arch/x64/sysroot/include/ucontext.h b/arch/x64/sysroot/include/ucontext.h
index 930bb71..ccd910f 100644
--- a/arch/x64/sysroot/include/ucontext.h
+++ b/arch/x64/sysroot/include/ucontext.h
@@ -1,11 +1,11 @@
-#pragma once
+#ifndef SYSROOT_UCONTEXT_H_
+#define SYSROOT_UCONTEXT_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
-
 #include <signal.h>
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
@@ -22,3 +22,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UCONTEXT_H_
diff --git a/arch/x64/sysroot/include/unistd.h b/arch/x64/sysroot/include/unistd.h
index 4f91876..e400030 100644
--- a/arch/x64/sysroot/include/unistd.h
+++ b/arch/x64/sysroot/include/unistd.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_UNISTD_H_
+#define SYSROOT_UNISTD_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define STDIN_FILENO 0
@@ -134,8 +136,6 @@
 void sync(void);
 int syncfs(int);
 pid_t setpgrp(void);
-char* crypt(const char*, const char*);
-void encrypt(char*, int);
 void swab(const void* __restrict, void* __restrict, ssize_t);
 #endif
 
@@ -432,3 +432,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UNISTD_H_
diff --git a/arch/x64/sysroot/include/utime.h b/arch/x64/sysroot/include/utime.h
index 25e0ff7..b4368aa 100644
--- a/arch/x64/sysroot/include/utime.h
+++ b/arch/x64/sysroot/include/utime.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_UTIME_H_
+#define SYSROOT_UTIME_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -9,8 +10,8 @@
 #include <bits/alltypes.h>
 
 struct utimbuf {
-    time_t actime;
-    time_t modtime;
+  time_t actime;
+  time_t modtime;
 };
 
 int utime(const char*, const struct utimbuf*);
@@ -18,3 +19,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_UTIME_H_
diff --git a/arch/x64/sysroot/include/values.h b/arch/x64/sysroot/include/values.h
index a139dca..0862584 100644
--- a/arch/x64/sysroot/include/values.h
+++ b/arch/x64/sysroot/include/values.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_VALUES_H_
+#define SYSROOT_VALUES_H_
 
 #include <limits.h>
 
@@ -34,3 +35,5 @@
 #define FMAXEXP FLT_MAX_EXP
 
 #define BITSPERBYTE CHAR_BIT
+
+#endif  // SYSROOT_VALUES_H_
diff --git a/arch/x64/sysroot/include/wchar.h b/arch/x64/sysroot/include/wchar.h
index 5578085..aaa7e9e 100644
--- a/arch/x64/sysroot/include/wchar.h
+++ b/arch/x64/sysroot/include/wchar.h
@@ -1,10 +1,12 @@
-#pragma once
+#ifndef SYSROOT_WCHAR_H_
+#define SYSROOT_WCHAR_H_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <features.h>
+
 #include <bits/null.h>
 
 #define __NEED_FILE
@@ -32,13 +34,13 @@
 #ifndef WCHAR_MIN
 #if defined(__WCHAR_MIN__)
 #define WCHAR_MIN __WCHAR_MIN__
-#else // defined(__WCHAR_MIN__)
+#else  // defined(__WCHAR_MIN__)
 #if defined(__WCHAR_UNSIGNED__)
 #define WCHAR_MIN (L'\0' + 0)
 #else
 #define WCHAR_MIN (-WCHAR_MAX - 1)
-#endif // defined (__WCHAR_UNSIGNED)
-#endif // defined(__WCHAR_MIN__)
+#endif  // defined (__WCHAR_UNSIGNED)
+#endif  // defined(__WCHAR_MIN__)
 #endif
 
 #undef WEOF
@@ -179,3 +181,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WCHAR_H_
diff --git a/arch/x64/sysroot/include/wctype.h b/arch/x64/sysroot/include/wctype.h
index 8c86840..5a04bb8 100644
--- a/arch/x64/sysroot/include/wctype.h
+++ b/arch/x64/sysroot/include/wctype.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_WCTYPE_H_
+#define SYSROOT_WCTYPE_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -55,3 +56,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WCTYPE_H_
diff --git a/arch/x64/sysroot/include/wordexp.h b/arch/x64/sysroot/include/wordexp.h
index 26f8646..dd6caa0 100644
--- a/arch/x64/sysroot/include/wordexp.h
+++ b/arch/x64/sysroot/include/wordexp.h
@@ -1,4 +1,5 @@
-#pragma once
+#ifndef SYSROOT_WORDEXP_H_
+#define SYSROOT_WORDEXP_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -18,9 +19,9 @@
 #define WRDE_UNDEF 32
 
 typedef struct {
-    size_t we_wordc;
-    char** we_wordv;
-    size_t we_offs;
+  size_t we_wordc;
+  char** we_wordv;
+  size_t we_offs;
 } wordexp_t;
 
 #define WRDE_NOSYS -1
@@ -36,3 +37,5 @@
 #ifdef __cplusplus
 }
 #endif
+
+#endif  // SYSROOT_WORDEXP_H_
diff --git a/arch/x64/sysroot/include/zircon/assert.h b/arch/x64/sysroot/include/zircon/assert.h
index 6175321..d53115d 100644
--- a/arch/x64/sysroot/include/zircon/assert.h
+++ b/arch/x64/sysroot/include/zircon/assert.h
@@ -2,8 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_ASSERT_
-#define ZIRCON_ASSERT_
+#ifndef SYSROOT_ZIRCON_ASSERT_
+#define SYSROOT_ZIRCON_ASSERT_
+
+// For a description of which asserts are enabled at which debug levels, see the documentation for
+// GN build argument |assert_level|.
 
 #ifdef _KERNEL
 #include <assert.h>
@@ -16,61 +19,69 @@
 #define ZX_DEBUG_ASSERT_MSG_COND(args...) DEBUG_ASSERT_MSG_COND(args)
 #define ZX_DEBUG_ASSERT_IMPLEMENTED DEBUG_ASSERT_IMPLEMENTED
 
-#ifdef ZX_DEBUGLEVEL
-#undef ZX_DEBUGLEVEL
-#endif
-#define ZX_DEBUGLEVEL LK_DEBUGLEVEL
-
-#else // #ifdef _KERNEL
-
-#include <stdio.h>  // for printf
-#include <stdlib.h> // for abort
+#else  // #ifdef _KERNEL
 
 #include <zircon/compiler.h>
 
-#define ZX_PANIC(fmt, ...)          \
-    do {                            \
-        printf(fmt, ##__VA_ARGS__); \
-        abort();                    \
-    } while (0)
+__BEGIN_CDECLS
+void __zx_panic(const char* format, ...) __NO_RETURN __PRINTFLIKE(1, 2);
+__END_CDECLS
 
-#define ZX_ASSERT(x)                                                            \
-    do {                                                                        \
-        if (unlikely(!(x))) {                                                   \
-            ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
-        }                                                                       \
-    } while (0)
+#define ZX_PANIC(fmt, ...) __zx_panic((fmt), ##__VA_ARGS__)
 
-#define ZX_ASSERT_MSG(x, msg, msgargs...)                       \
-    do {                                                        \
-        if (unlikely(!(x))) {                                   \
-            ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n" msg "\n", \
-                     __FILE__, __LINE__, #x, ##msgargs);        \
-        }                                                       \
-    } while (0)
+// Assert that |x| is true, else panic.
+//
+// ZX_ASSERT is always enabled and |x| will be evaluated regardless of any build arguments.
+#define ZX_ASSERT(x)                                                      \
+  do {                                                                    \
+    if (unlikely(!(x))) {                                                 \
+      ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
+    }                                                                     \
+  } while (0)
 
-// conditionally implement DEBUG_ASSERT based on ZX_DEBUGLEVEL in kernel space
-// user space does not currently implement DEBUG_ASSERT
-#ifdef ZX_DEBUGLEVEL
-#define ZX_DEBUG_ASSERT_IMPLEMENTED (ZX_DEBUGLEVEL > 1)
+// Assert that |x| is true, else panic with the given message.
+//
+// ZX_ASSERT_MSG is always enabled and |x| will be evaluated regardless of any build arguments.
+#define ZX_ASSERT_MSG(x, msg, msgargs...)                                                     \
+  do {                                                                                        \
+    if (unlikely(!(x))) {                                                                     \
+      ZX_PANIC("ASSERT FAILED at (%s:%d): %s\n" msg "\n", __FILE__, __LINE__, #x, ##msgargs); \
+    }                                                                                         \
+  } while (0)
+
+// Conditionally implement ZX_DEBUG_ASSERT based on ZX_ASSERT_LEVEL.
+#ifdef ZX_ASSERT_LEVEL
+
+// ZX_DEBUG_ASSERT_IMPLEMENTED is intended to be used to conditionalize code that is logically part
+// of a debug assert. It's useful for performing complex consistency checks that are difficult to
+// work into a ZX_DEBUG_ASSERT statement.
+#define ZX_DEBUG_ASSERT_IMPLEMENTED (ZX_ASSERT_LEVEL > 1)
 #else
 #define ZX_DEBUG_ASSERT_IMPLEMENTED 0
 #endif
 
-#define ZX_DEBUG_ASSERT(x)                                                            \
-    do {                                                                              \
-        if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                          \
-            ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
-        }                                                                             \
-    } while (0)
+// Assert that |x| is true, else panic.
+//
+// Depending on build arguments, ZX_DEBUG_ASSERT may or may not be enabled. When disabled, |x| will
+// not be evaluated.
+#define ZX_DEBUG_ASSERT(x)                                                      \
+  do {                                                                          \
+    if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                        \
+      ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); \
+    }                                                                           \
+  } while (0)
 
-#define ZX_DEBUG_ASSERT_MSG(x, msg, msgargs...)                       \
-    do {                                                              \
-        if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {          \
-            ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n" msg "\n", \
-                     __FILE__, __LINE__, #x, ##msgargs);              \
-        }                                                             \
-    } while (0)
+// Assert that |x| is true, else panic with the given message.
+//
+// Depending on build arguments, ZX_DEBUG_ASSERT_MSG may or may not be enabled. When disabled, |x|
+// will not be evaluated.
+#define ZX_DEBUG_ASSERT_MSG(x, msg, msgargs...)                                         \
+  do {                                                                                  \
+    if (ZX_DEBUG_ASSERT_IMPLEMENTED && unlikely(!(x))) {                                \
+      ZX_PANIC("DEBUG ASSERT FAILED at (%s:%d): %s\n" msg "\n", __FILE__, __LINE__, #x, \
+               ##msgargs);                                                              \
+    }                                                                                   \
+  } while (0)
 
 // implement _COND versions of ZX_DEBUG_ASSERT which only emit the body if
 // ZX_DEBUG_ASSERT_IMPLEMENTED is set
@@ -78,9 +89,13 @@
 #define ZX_DEBUG_ASSERT_COND(x) ZX_DEBUG_ASSERT(x)
 #define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) ZX_DEBUG_ASSERT_MSG(x, msg, msgargs)
 #else
-#define ZX_DEBUG_ASSERT_COND(x) do { } while (0)
-#define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) do { } while (0)
+#define ZX_DEBUG_ASSERT_COND(x) \
+  do {                          \
+  } while (0)
+#define ZX_DEBUG_ASSERT_MSG_COND(x, msg, msgargs...) \
+  do {                                               \
+  } while (0)
 #endif
-#endif // #ifdef _KERNEL
+#endif  // #ifdef _KERNEL
 
-#endif // ZIRCON_ASSERT_
+#endif  // SYSROOT_ZIRCON_ASSERT_
diff --git a/arch/x64/sysroot/include/zircon/boot/bootdata.h b/arch/x64/sysroot/include/zircon/boot/bootdata.h
deleted file mode 100644
index d49b9b1..0000000
--- a/arch/x64/sysroot/include/zircon/boot/bootdata.h
+++ /dev/null
@@ -1,317 +0,0 @@
-// 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.
-
-#pragma once
-
-#ifndef __ASSEMBLER__
-#include <zircon/compiler.h>
-#include <stdbool.h>
-#include <stdint.h>
-#endif
-
-// lsw of sha256("bootdata")
-#define BOOTDATA_MAGIC (0x868cf7e6)
-
-// lsw of sha256("bootitem")
-#define BOOTITEM_MAGIC (0xb5781729)
-
-// Round n up to the next 8 byte boundary
-#define BOOTDATA_ALIGN(n) (((n) + 7) & (~7))
-
-#define BOOTITEM_NO_CRC32 (0x4a87e8d6)
-
-// This flag is required.
-#define BOOTDATA_FLAG_V2         (0x00010000)
-
-// Bootdata items with the CRC32 flag must have a valid crc32.
-// Otherwise their crc32 field must contain BOOTITEM_NO_CRC32
-#define BOOTDATA_FLAG_CRC32      (0x00020000)
-
-// Bootdata types that have least significant byte set to 'm'
-// are reserved for driver metadata
-#define BOOTDATA_KIND_METADATA   (0x0000006D)
-#define BOOTDATA_KIND_MASK       (0x000000FF)
-
-// Containers are used to wrap a set of bootdata items
-// written to a file or partition.  The "length" is the
-// length of the set of following bootdata items.  The
-// "extra" is the value BOOTDATA_MAGIC and "flags" is
-// set to 0.
-#define BOOTDATA_CONTAINER        (0x544f4f42) // BOOT
-
-// BOOTFS images.  The "extra" field is the decompressed
-// size of the image, if compressed, otherwise the same
-// as the "length" field.
-#define BOOTDATA_BOOTFS_BOOT      (0x42534642) // BFSB
-#define BOOTDATA_BOOTFS_SYSTEM    (0x53534642) // BFSS
-#define BOOTDATA_BOOTFS_DISCARD   (0x58534642) // BFSX
-
-#define BOOTDATA_BOOTFS_MASK      (0x00FFFFFF)
-#define BOOTDATA_BOOTFS_TYPE      (0x00534642) // BFS\0
-
-// Virtual disk images.  The header fields and compression protocol
-// are the same as for the BOOTFS types, but the payload before
-// compression is a raw disk image rather than BOOTFS format.
-#define BOOTDATA_RAMDISK          (0x4b534452) // RDSK
-
-// A Zircon Kernel Image
-// Content: bootdata_kernel_t
-#define BOOTDATA_KERNEL           (0x4c4e524b) // KRNL
-
-// A Zircon Partition Map
-// Content: bootdata_partition_map_t
-// The bootdata_t.extra field is used as a board specific index
-// to specify which device the partition map applies to.
-#define BOOTDATA_PARTITION_MAP    (0x5452506D) // mPRT
-
-// MAC Address for Ethernet, Wifi, Bluetooth, etc.
-// Content: uint8_t[] (variable length based on type of MAC address)
-// The bootdata_t.extra field is used as a board specific index
-// to specify which device the MAC address applies to.
-#define BOOTDATA_MAC_ADDRESS      (0x43414D6D) // mMAC
-
-// Flag indicating that the bootfs is compressed.
-#define BOOTDATA_BOOTFS_FLAG_COMPRESSED  (1 << 0)
-
-
-// These items are for passing from bootloader to kernel
-
-// Kernel Command Line String
-// Content: uint8_t[]
-#define BOOTDATA_CMDLINE          (0x4c444d43) // CMDL
-
-// ACPI Root Table Pointer
-// Content: uint64_t phys addr
-#define BOOTDATA_ACPI_RSDP        (0x50445352) // RSDP
-
-// SMBIOS entry point pointer
-// Content: uint64_t phys addr
-#define BOOTDATA_SMBIOS           (0x49424d53) // SMBI
-
-// Framebuffer Parameters
-// Content: bootdata_swfb_t
-#define BOOTDATA_FRAMEBUFFER      (0x42465753) // SWFB
-
-// Debug Serial Port
-// Content: bootdata_uart_t
-#define BOOTDATA_DEBUG_UART       (0x54524155) // UART
-
-// Platform ID Information
-// Content: bootdata_platform_id_t
-#define BOOTDATA_PLATFORM_ID      (0x44494C50) // PLID
-
-// Memory which will persist across warm boots
-// Content bootdata_lastlog_nvram_t
-#define BOOTDATA_LASTLOG_NVRAM    (0x4c4c564e) // NVLL
-
-// This reflects a typo we need to support for a while
-#define BOOTDATA_LASTLOG_NVRAM2   (0x4c4c5643) // CVLL
-
-// E820 Memory Table
-// Content: e820entry[]
-#define BOOTDATA_E820_TABLE       (0x30323845) // E820
-
-// EFI Memory Map
-// Content: a uint64_t entrysz followed by a set of
-// efi_memory_descriptor aligned on entrysz
-#define BOOTDATA_EFI_MEMORY_MAP   (0x4d494645) // EFIM
-
-// EFI System Table
-// Content: a uint64_t physical address of the table
-#define BOOTDATA_EFI_SYSTEM_TABLE (0x53494645) // EFIS
-
-// Last crashlog
-// Content: ascii/utf8 log data from previous boot
-#define BOOTDATA_LAST_CRASHLOG    (0x4d4f4f42) // BOOM
-
-// CPU configuration
-// Content: bootdata_cpu_config_t
-#define BOOTDATA_CPU_CONFIG       (0x43555043) // CPUC
-
-// Memory configuration
-// Content: one or more of bootdata_mem_range_t (count determined by bootdata_t length)
-#define BOOTDATA_MEM_CONFIG       (0x434D454D) // MEMC
-
-// Kernel driver configuration
-// Content: driver specific struct, with type determined by bootdata "extra" field
-#define BOOTDATA_KERNEL_DRIVER    (0x5652444B) // KDRV
-
-#define BOOTDATA_IGNORE           (0x50494b53) // SKIP
-
-#ifndef __ASSEMBLER__
-__BEGIN_CDECLS;
-
-// BootData header, describing the type and size of data
-// used to initialize the system. All fields are little-endian.
-//
-// BootData headers in a stream must be 8-byte-aligned.
-//
-// The length field specifies the actual payload length
-// and does not include the size of padding.
-typedef struct {
-    // Boot data type
-    uint32_t type;
-
-    // Size of the payload following this header
-    uint32_t length;
-
-    // type-specific extra data
-    // For CONTAINER this is MAGIC.
-    // For BOOTFS this is the decompressed size.
-    uint32_t extra;
-
-    // Flags for the boot data. See flag descriptions for each type.
-    uint32_t flags;
-
-    // For future expansion.  Set to 0.
-    uint32_t reserved0;
-    uint32_t reserved1;
-
-    // Must be BOOTITEM_MAGIC
-    uint32_t magic;
-
-    // Must be the CRC32 of payload if FLAG_CRC32 is set,
-    // otherwise must be BOOTITEM_NO_CRC32
-    uint32_t crc32;
-} bootdata_t;
-
-typedef struct {
-    uint64_t base; // physical base addr
-    uint32_t width;
-    uint32_t height;
-    uint32_t stride;
-    uint32_t format;
-} bootdata_swfb_t;
-
-typedef struct {
-    uint64_t entry64;
-    uint64_t reserved;
-} bootdata_kernel_t;
-
-#define BOOTDATA_PART_NAME_LEN 32
-#define BOOTDATA_PART_GUID_LEN 16
-
-typedef struct {
-    uint8_t type_guid[BOOTDATA_PART_GUID_LEN];
-    uint8_t uniq_guid[BOOTDATA_PART_GUID_LEN];
-    uint64_t first_block;
-    uint64_t last_block;
-    uint64_t flags;
-    char name[BOOTDATA_PART_NAME_LEN];
-} bootdata_partition_t;
-
-typedef struct {
-    uint64_t block_count;
-    uint64_t block_size;
-    uint32_t partition_count;
-    uint32_t reserved;
-    char guid[BOOTDATA_PART_GUID_LEN];
-    bootdata_partition_t partitions[];
-} bootdata_partition_map_t;
-
-typedef struct {
-    uint64_t base;
-    uint64_t length;
-} bootdata_nvram_t;
-
-#define BOOTDATA_UART_NONE 0
-#define BOOTDATA_UART_PC_PORT 1
-#define BOOTDATA_UART_PC_MMIO 2
-typedef struct {
-    uint64_t base;
-    uint32_t type;
-    uint32_t irq;
-} bootdata_uart_t;
-
-typedef struct {
-    uint32_t vid;
-    uint32_t pid;
-    char board_name[32];
-} bootdata_platform_id_t;
-
-typedef struct {
-    uint32_t cpu_count;     // number of CPU cores in the cluster
-    uint32_t type;          // for future use
-    uint32_t flags;         // for future use
-    uint32_t reserved;
-} bootdata_cpu_cluster_t;
-
-typedef struct {
-    uint32_t cluster_count;
-    uint32_t reserved[3];
-    bootdata_cpu_cluster_t clusters[];
-} bootdata_cpu_config_t;
-
-#define BOOTDATA_MEM_RANGE_RAM          1
-#define BOOTDATA_MEM_RANGE_PERIPHERAL   2
-#define BOOTDATA_MEM_RANGE_RESERVED     3
-typedef struct {
-    uint64_t    paddr;
-    uint64_t    length;
-    uint32_t    type;
-    uint32_t    reserved;
-} bootdata_mem_range_t;
-
-/* EFI Variable for Crash Log */
-#define ZIRCON_VENDOR_GUID \
-    {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}}
-#define ZIRCON_CRASHLOG_EFIVAR \
-    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 };
-#define ZIRCON_CRASHLOG_EFIATTR \
-    (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
-
-__END_CDECLS;
-
-
-// BOOTFS is a trivial "filesystem" format
-//
-// It consists of a bootfs_header_t
-//
-// Followed by a series of bootfs_entry_t's of:
-//   name length (32bit le)
-//   data size   (32bit le)
-//   data offset (32bit le)
-//   namedata   (namelength bytes, includes \0)
-//
-// - data offsets must be page aligned (multiple of 4096)
-// - entries start on uint32 boundaries
-
-//lsw of sha256("bootfs")
-#define BOOTFS_MAGIC (0xa56d3ff9)
-
-#define BOOTFS_PAGE_SIZE (4096)
-#define BOOTFS_PAGE_ALIGN(size) \
-    (((size) + BOOTFS_PAGE_SIZE - 1) & -BOOTFS_PAGE_SIZE)
-
-#define BOOTFS_MAX_NAME_LEN 256
-
-typedef struct bootfs_header {
-    // magic value BOOTFS_MAGIC
-    uint32_t magic;
-
-    // total size of all bootfs_entry_t's
-    // does not include the size of the bootfs_header_t
-    uint32_t dirsize;
-
-    // 0, 0
-    uint32_t reserved0;
-    uint32_t reserved1;
-} bootfs_header_t;
-
-typedef struct bootfs_entry {
-    uint32_t name_len;
-    uint32_t data_len;
-    uint32_t data_off;
-    char name[];
-} bootfs_entry_t;
-
-#define BOOTFS_ALIGN(nlen) (((nlen) + 3) & (~3))
-#define BOOTFS_RECSIZE(entry) \
-    (sizeof(bootfs_entry_t) + BOOTFS_ALIGN(entry->name_len))
-
-static inline bool bootdata_is_metadata(uint32_t type) {
-    return ((type & BOOTDATA_KIND_MASK) == BOOTDATA_KIND_METADATA);
-}
-
-#endif
diff --git a/arch/x64/sysroot/include/zircon/boot/bootfs.h b/arch/x64/sysroot/include/zircon/boot/bootfs.h
new file mode 100644
index 0000000..8cc2644
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/boot/bootfs.h
@@ -0,0 +1,66 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_BOOT_BOOTFS_H_
+#define SYSROOT_ZIRCON_BOOT_BOOTFS_H_
+
+#include <stdint.h>
+
+// The payload (after decompression) of an item in BOOTFS format consists
+// of separate "file" images that are each aligned to ZBI_BOOTFS_PAGE_SIZE
+// bytes from the beginning of the item payload.  The first "file" consists
+// of a zbi_bootfs_header_t followed by directory entries.
+#define ZBI_BOOTFS_PAGE_SIZE (4096u)
+
+#define ZBI_BOOTFS_PAGE_ALIGN(size) \
+  (((size) + ZBI_BOOTFS_PAGE_SIZE - 1) & ~(ZBI_BOOTFS_PAGE_SIZE - 1))
+
+typedef struct {
+  // Must be ZBI_BOOTFS_MAGIC.
+  uint32_t magic;
+
+  // Size in bytes of all the directory entries.
+  // Does not include the size of the zbi_bootfs_header_t.
+  uint32_t dirsize;
+
+  // Reserved for future use.  Set to 0.
+  uint32_t reserved0;
+  uint32_t reserved1;
+} zbi_bootfs_header_t;
+
+// LSW of sha256("bootfs")
+#define ZBI_BOOTFS_MAGIC (0xa56d3ff9)
+
+// Each directory entry holds a pathname and gives the offset and size
+// of the contents of the file by that name.
+typedef struct {
+  // Length of the name[] field at the end.  This length includes the
+  // NUL terminator, which must be present, but does not include any
+  // alignment padding required before the next directory entry.
+  uint32_t name_len;
+
+  // Length of the file in bytes.  This is an exact size that is not
+  // rounded, though the file is always padded with zeros up to a
+  // multiple of ZBI_BOOTFS_PAGE_SIZE.
+  uint32_t data_len;
+
+  // Offset from the beginning of the payload (zbi_bootfs_header_t) to
+  // the file's data.  This must be a multiple of ZBI_BOOTFS_PAGE_SIZE.
+  uint32_t data_off;
+
+  // Pathname of the file, a UTF-8 string.  This must include a NUL
+  // terminator at the end.  It must not begin with a '/', but it may
+  // contain '/' separators for subdirectories.
+  char name[];
+} zbi_bootfs_dirent_t;
+
+// Each directory entry has a variable size of [16,268] bytes that
+// must be a multiple of 4 bytes.
+#define ZBI_BOOTFS_DIRENT_SIZE(name_len) \
+  ((sizeof(zbi_bootfs_dirent_t) + (name_len) + 3) & -(size_t)4)
+
+// zbi_bootfs_dirent_t.name_len must be > 1 and <= ZBI_BOOTFS_MAX_NAME_LEN.
+#define ZBI_BOOTFS_MAX_NAME_LEN (256)
+
+#endif  // SYSROOT_ZIRCON_BOOT_BOOTFS_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/crash-reason.h b/arch/x64/sysroot/include/zircon/boot/crash-reason.h
new file mode 100644
index 0000000..f626fac
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/boot/crash-reason.h
@@ -0,0 +1,59 @@
+// Copyright 2020 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.
+
+#ifndef SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
+#define SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
+
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+// 0 is reserved for "Invalid".  It will never be used by a functioning
+// crash-logger.
+#define ZIRCON_CRASH_REASON_INVALID ((uint32_t)0)
+
+// "Unknown" indicates that the system does not know the reason for a recent
+// crash.  The primary use of this reason is to be something which can be left
+// in the crashlog in case the system spontaneously reboots without a chance to
+// gracefully finalize the log, perhaps because of something like a hardware
+// watchdog timer.
+#define ZIRCON_CRASH_REASON_UNKNOWN ((uint32_t)1)
+
+// "No Crash" indicates that the system deliberately rebooted in an
+// orderly fashion.  No crash occurred.
+#define ZIRCON_CRASH_REASON_NO_CRASH ((uint32_t)2)
+
+// "OOM" indicates a crash triggered by the system because of an unrecoverable
+// out-of-memory situation.
+#define ZIRCON_CRASH_REASON_OOM ((uint32_t)3)
+
+// "Panic" indicates a crash triggered by the system because of an unrecoverable
+// kernel panic situation.
+#define ZIRCON_CRASH_REASON_PANIC ((uint32_t)4)
+
+// "Software watchdog" indicates a crash triggered by a kernel level software
+// watchdog construct.  Note that this is distinct from a hardware based WDT.
+// If the system reboots because of a hardware watchdog, it will have no chance
+// to record the reboot reason, and the crashlog will indicate "unknown".  The
+// HW reboot reason may be known, but only if the bootloader reports it to us.
+#define ZIRCON_CRASH_REASON_SOFTWARE_WATCHDOG ((uint32_t)5)
+
+#ifndef __ASSEMBLER__
+#if !__cplusplus
+typedef uint32_t zircon_crash_reason_t;
+#else   // !__cplusplus
+enum class ZirconCrashReason : uint32_t {
+  Invalid = ZIRCON_CRASH_REASON_INVALID,
+  Unknown = ZIRCON_CRASH_REASON_UNKNOWN,
+  NoCrash = ZIRCON_CRASH_REASON_NO_CRASH,
+  Oom = ZIRCON_CRASH_REASON_OOM,
+  Panic = ZIRCON_CRASH_REASON_PANIC,
+  SoftwareWatchdog = ZIRCON_CRASH_REASON_SOFTWARE_WATCHDOG,
+};
+
+// Using alias to maintain compatibility with APIs meant to be used by both C and C++.
+using zircon_crash_reason_t = ZirconCrashReason;
+#endif  // !__cplusplus
+#endif  // __ASSEMBLER__
+
+#endif  // SYSROOT_ZIRCON_BOOT_CRASH_REASON_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/driver-config.h b/arch/x64/sysroot/include/zircon/boot/driver-config.h
index 4913ae1..7f72fca 100644
--- a/arch/x64/sysroot/include/zircon/boot/driver-config.h
+++ b/arch/x64/sysroot/include/zircon/boot/driver-config.h
@@ -2,87 +2,162 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
+#define SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
 
-#include <zircon/compiler.h>
 #include <stdint.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
 
-// BOOTDATA_KERNEL_DRIVER bootdata types
-#define KDRV_ARM_PSCI           0x49435350  // 'PSCI'
-#define KDRV_ARM_GIC_V2         0x32434947  // 'GIC2'
-#define KDRV_ARM_GIC_V3         0x33434947  // 'GIC3'
-#define KDRV_ARM_GENERIC_TIMER  0x4D495441  // 'ATIM'
-#define KDRV_PL011_UART         0x55304C50  // 'PL0U'
-#define KDRV_AMLOGIC_UART       0x554C4D41  // 'AMLU'
-#define KDRV_NXP_IMX_UART       0x55584D49  // 'IMXU'
-#define KDRV_MT8167_UART        0x5538544D  // 'MT8U'
-#define KDRV_HISILICON_POWER    0x4F505348  // 'HSPO'
-#define KDRV_AMLOGIC_HDCP       0x484C4D41  // 'AMLH'
+// ZBI_TYPE_KERNEL_DRIVER item types (for zbi_header_t.extra)
+#define KDRV_ARM_PSCI 0x49435350                // 'PSCI'
+#define KDRV_ARM_GIC_V2 0x32434947              // 'GIC2'
+#define KDRV_ARM_GIC_V3 0x33434947              // 'GIC3'
+#define KDRV_ARM_GENERIC_TIMER 0x4D495441       // 'ATIM'
+#define KDRV_PL011_UART 0x55304C50              // 'PL0U'
+#define KDRV_AMLOGIC_UART 0x554C4D41            // 'AMLU'
+#define KDRV_NXP_IMX_UART 0x55584D49            // 'IMXU'
+#define KDRV_MT8167_UART 0x5538544D             // 'MT8U'
+#define KDRV_AMLOGIC_HDCP 0x484C4D41            // 'AMLH'
+#define KDRV_MSM_UART 0x554D534D                // 'MSMU'
+#define KDRV_MSM_POWER 1347244877               // 'MSMP'
+#define KDRV_DW8250_UART 0x44573855             // 'DW8U'
+#define KDRV_AS370_POWER 0x50303733             // '370P'
+#define KDRV_AMLOGIC_RNG 0x484C4D52             // 'AMLR'
+#define KDRV_GENERIC_32BIT_WATCHDOG 0x32334457  // 'WD32'
+#define KDRV_I8250_PIO_UART 0x30353238          // '8250'
+#define KDRV_I8250_MMIO_UART 0x4d353238         // '825M'
 
-// kernel driver struct that can be used for simple drivers
-// used by KDRV_PL011_UART, KDRV_AMLOGIC_UART and KDRV_NXP_IMX_UART
+// Kernel driver struct that can be used for simple drivers.
+// Used by KDRV_PL011_UART, KDRV_AMLOGIC_UART, KDRV_NXP_IMX_UART,
+// and KDRV_I8250_MMIO_UART.
 typedef struct {
-    uint64_t mmio_phys;
-    uint32_t irq;
+  uint64_t mmio_phys;
+  uint32_t irq;
 } dcfg_simple_t;
 
+// Used by KDRV_I8250_PIO_UART.
+typedef struct {
+  uint16_t base;
+  uint32_t irq;
+} dcfg_simple_pio_t;
+
 // for KDRV_MT8167_UART
 typedef struct {
-    uint64_t soc_mmio_phys;
-    uint64_t uart_mmio_phys;
-    uint32_t irq;
+  uint64_t soc_mmio_phys;
+  uint64_t uart_mmio_phys;
+  uint32_t irq;
 } dcfg_soc_uart_t;
 
 // for KDRV_ARM_PSCI
 typedef struct {
-    bool use_hvc;
-    uint64_t shutdown_args[3];
-    uint64_t reboot_args[3];
-    uint64_t reboot_bootloader_args[3];
-    uint64_t reboot_recovery_args[3];
+  bool use_hvc;
+  uint64_t shutdown_args[3];
+  uint64_t reboot_args[3];
+  uint64_t reboot_bootloader_args[3];
+  uint64_t reboot_recovery_args[3];
 } dcfg_arm_psci_driver_t;
 
+typedef struct {
+  uint64_t soc_imem_phys;
+  uint64_t soc_imem_offset;
+} dcfg_msm_power_driver_t;
+
 // for KDRV_ARM_GIC_V2
 typedef struct {
-    uint64_t mmio_phys;
-    uint64_t msi_frame_phys;
-    uint64_t gicd_offset;
-    uint64_t gicc_offset;
-    uint64_t gich_offset;
-    uint64_t gicv_offset;
-    uint32_t ipi_base;
-    bool optional;
-    bool use_msi;
+  uint64_t mmio_phys;
+  uint64_t msi_frame_phys;
+  uint64_t gicd_offset;
+  uint64_t gicc_offset;
+  uint64_t gich_offset;
+  uint64_t gicv_offset;
+  uint32_t ipi_base;
+  bool optional;
+  bool use_msi;
 } dcfg_arm_gicv2_driver_t;
 
 // for KDRV_ARM_GIC_V3
 typedef struct {
-    uint64_t mmio_phys;
-    uint64_t gicd_offset;
-    uint64_t gicr_offset;
-    uint64_t gicr_stride;
-    uint64_t mx8_gpr_phys;
-    uint32_t ipi_base;
-    bool optional;
+  uint64_t mmio_phys;
+  uint64_t gicd_offset;
+  uint64_t gicr_offset;
+  uint64_t gicr_stride;
+  uint64_t mx8_gpr_phys;
+  uint32_t ipi_base;
+  bool optional;
 } dcfg_arm_gicv3_driver_t;
 
 // for KDRV_ARM_GENERIC_TIMER
 typedef struct {
-    uint32_t irq_phys;
-    uint32_t irq_virt;
-    uint32_t irq_sphys;
-    uint32_t freq_override;
+  uint32_t irq_phys;
+  uint32_t irq_virt;
+  uint32_t irq_sphys;
+  uint32_t freq_override;
 } dcfg_arm_generic_timer_driver_t;
 
-// for KDRV_HISILICON_POWER
-typedef struct {
-    uint64_t sctrl_phys;
-    uint64_t pmu_phys;
-} dcfg_hisilicon_power_driver_t;
-
 // for KDRV_AMLOGIC_HDCP
 typedef struct {
-    uint64_t preset_phys;
-    uint64_t hiu_phys;
-    uint64_t hdmitx_phys;
+  uint64_t preset_phys;
+  uint64_t hiu_phys;
+  uint64_t hdmitx_phys;
 } dcfg_amlogic_hdcp_driver_t;
+
+// for KDRV_AMLOGIC_RNG
+typedef struct {
+  uint64_t rng_data_phys;
+  uint64_t rng_status_phys;
+  uint64_t rng_refresh_interval_usec;
+} dcfg_amlogic_rng_driver_t;
+
+// Defines a register write action for a generic kernel watchdog driver.  An
+// action consists of the following steps.
+//
+// 1) Read from the register located a physical address |addr|
+// 2) Clear all of the bits in the value which was read using the |clr_mask|
+// 3) Set all of the bits in the value using the |set_mask|
+// 4) Write this value back to the address located at addr.
+//
+typedef struct {
+  uint64_t addr;
+  uint32_t clr_mask;
+  uint32_t set_mask;
+} dcfg_generic_32bit_watchdog_action_t;
+
+#define KDRV_GENERIC_32BIT_WATCHDOG_FLAG_ENABLED ((uint32_t)0x00000001)
+#define KDRV_GENERIC_32BIT_WATCHDOG_MIN_PERIOD ZX_MSEC(1)
+
+// Definitions of actions which may be taken by a generic 32 bit watchdog timer
+// kernel driver which may be passed by a bootloader.  Field definitions are as
+// follows.
+//
+// |pet_action|
+// The address and masks needed to "pet" (aka, dismiss) a hardware watchdog timer.
+//
+// |enable_action|
+// The address and masks needed to enable a hardware watchdog timer.  If enable
+// is an unsupported operation, the addr of the |enable_action| shall be zero.
+//
+// |disable_action|
+// The address and masks needed to disable a hardware watchdog timer.  If
+// disable is an unsupported operation, the addr of the |disable_action| shall
+// be zero.
+//
+// |watchdog_period_nsec|
+// The period of the watchdog timer given in nanoseconds.  When enabled, the
+// watchdog timer driver must pet the watch dog at least this often.  The value
+// must be at least 1 mSec, typically much larger (on the order of a second or
+// two)
+//
+// |flags|
+// Storage for additional flags.  Currently, only one flag is defined,
+// "FLAG_ENABLED".  When this flag is set, it indicates that the watchdog timer
+// was left enabled by the bootloader at startup.
+typedef struct {
+  dcfg_generic_32bit_watchdog_action_t pet_action;
+  dcfg_generic_32bit_watchdog_action_t enable_action;
+  dcfg_generic_32bit_watchdog_action_t disable_action;
+  zx_duration_t watchdog_period_nsec;
+  uint32_t flags;
+} dcfg_generic_32bit_watchdog_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_DRIVER_CONFIG_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/e820.h b/arch/x64/sysroot/include/zircon/boot/e820.h
index fb8c340..f0f98f0 100644
--- a/arch/x64/sysroot/include/zircon/boot/e820.h
+++ b/arch/x64/sysroot/include/zircon/boot/e820.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_E820_H_
+#define SYSROOT_ZIRCON_BOOT_E820_H_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
@@ -14,7 +15,9 @@
 #define E820_UNUSABLE 5
 
 typedef struct e820entry {
-    uint64_t addr;
-    uint64_t size;
-    uint32_t type;
+  uint64_t addr;
+  uint64_t size;
+  uint32_t type;
 } __PACKED e820entry_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_E820_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/image.h b/arch/x64/sysroot/include/zircon/boot/image.h
index de2411e..28663b6 100644
--- a/arch/x64/sysroot/include/zircon/boot/image.h
+++ b/arch/x64/sysroot/include/zircon/boot/image.h
@@ -2,12 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_IMAGE_H_
+#define SYSROOT_ZIRCON_BOOT_IMAGE_H_
+
+// This file contains assembly code that cannot be clang formatted.
+// clang-format off
 
 #ifndef __ASSEMBLER__
 #include <stdint.h>
 #endif
 
+
 // Zircon Boot Image format (ZBI).
 //
 // A Zircon Boot Image consists of a container header followed by boot
@@ -108,6 +113,7 @@
     macro(ZBI_TYPE_DISCARD, "DISCARD", ".bin") \
     macro(ZBI_TYPE_STORAGE_RAMDISK, "RAMDISK", ".bin") \
     macro(ZBI_TYPE_STORAGE_BOOTFS, "BOOTFS", ".bin") \
+    macro(ZBI_TYPE_STORAGE_BOOTFS_FACTORY, "BOOTFS_FACTORY", ".bin") \
     macro(ZBI_TYPE_CMDLINE, "CMDLINE", ".txt") \
     macro(ZBI_TYPE_CRASHLOG, "CRASHLOG", ".bin") \
     macro(ZBI_TYPE_NVRAM, "NVRAM", ".bin") \
@@ -121,12 +127,17 @@
     macro(ZBI_TYPE_EFI_MEMORY_MAP, "EFI_MEMORY_MAP", ".bin") \
     macro(ZBI_TYPE_EFI_SYSTEM_TABLE, "EFI_SYSTEM_TABLE", ".bin") \
     macro(ZBI_TYPE_E820_TABLE, "E820_TABLE", ".bin") \
-    macro(ZBI_TYPE_DEBUG_UART, "DEBUG_UART", ".bin") \
     macro(ZBI_TYPE_FRAMEBUFFER, "FRAMEBUFFER", ".bin") \
     macro(ZBI_TYPE_DRV_MAC_ADDRESS, "DRV_MAC_ADDRESS", ".bin") \
     macro(ZBI_TYPE_DRV_PARTITION_MAP, "DRV_PARTITION_MAP", ".bin") \
-    macro(ZBI_TYPE_BOOT_CONFIG, "BOOT_CONFIG", ".bin") \
-    macro(ZBI_TYPE_BOOT_VERSION, "BOOT_VERSION", ".bin")
+    macro(ZBI_TYPE_DRV_BOARD_PRIVATE, "DRV_BOARD_PRIVATE", ".bin") \
+    macro(ZBI_TYPE_DRV_BOARD_INFO, "DRV_BOARD_INFO", ".bin") \
+    macro(ZBI_TYPE_IMAGE_ARGS, "IMAGE_ARGS", ".txt") \
+    macro(ZBI_TYPE_BOOT_VERSION, "BOOT_VERSION", ".bin") \
+    macro(ZBI_TYPE_HW_REBOOT_REASON, "HW_REBOOT_REASON", ".bin") \
+    macro(ZBI_TYPE_SERIAL_NUMBER, "SERIAL_NUMBER", ".txt") \
+    macro(ZBI_TYPE_BOOTLOADER_FILE, "BOOTLOADER_FILE", ".bin") \
+    macro(ZBI_TYPE_DEVICETREE, "DEVICETREE", ".dtb")
 
 // Each ZBI starts with a container header.
 //     length:          Total size of the image after this header.
@@ -197,12 +208,12 @@
 //     The kernel assumes it was loaded at a fixed physical address of
 //     0x100000 (1MB).  zbi_kernel_t.entry is the absolute physical address
 //     of the PC location where the kernel will start.
-//     TODO(SEC-31): Perhaps this will change??
+//     TODO(fxbug.dev/24762): Perhaps this will change??
 //     The processor is in 64-bit mode with direct virtual to physical
 //     mapping covering the physical memory where the kernel and
-//     bootloader-constructed ZBI were loaded, which must be below 4GB.
-//     The %rsi register (or %esi, since the high 32 bits must be zero)
-//     holds the physical address of the bootloader-constructed ZBI.
+//     bootloader-constructed ZBI were loaded.
+//     The %rsi register holds the physical address of the
+//     bootloader-constructed ZBI.
 //     All other registers are unspecified.
 //
 //  ARM64
@@ -257,12 +268,29 @@
 // The interpretation of the payload (after possible decompression) is
 // indicated by the specific zbi_header_t.type value.
 //
-// If ZBI_FLAG_STORAGE_COMPRESSED is set in zbi_header_t.flags, then the
-// payload is compressed with LZ4 and zbi_header_t.extra gives the exact
-// size of the decompressed payload.  If ZBI_FLAG_STORAGE_COMPRESSED is
-// not set, then zbi_header_t.extra matches zbi_header_t.length.
+// **Note:** The ZBI_TYPE_STORAGE_* types are not a long-term stable ABI.
+//  - Items of these types are always packed for a specific version of the
+//    kernel and userland boot services, often in the same build that compiles
+//    the kernel.
+//  - These item types are **not** expected to be synthesized or
+//    examined by boot loaders.
+//  - New versions of the `zbi` tool will usually retain the ability to
+//    read old formats and non-default switches to write old formats, for
+//    diagnostic use.
 //
-// TODO(mcgrathr): Document or point to the details of the LZ4 header format.
+// The zbi_header_t.extra field always gives the exact size of the
+// original, uncompressed payload.  That equals zbi_header_t.length when
+// the payload is not compressed.  If ZBI_FLAG_STORAGE_COMPRESSED is set in
+// zbi_header_t.flags, then the payload is compressed.
+//
+// **Note:** Magic-number and header bytes at the start of the compressed
+// payload indicate the compression algorithm and parameters.  The set of
+// compression formats is not a long-term stable ABI.
+//  - Zircon [userboot](../../../../docs/userboot.md) and core services
+//    do the decompression.  A given kernel build's `userboot` will usually
+//    only support one particular compression format.
+//  - The `zbi` tool will usually retain the ability to compress and
+//    decompress for old formats, and can be used to convert between formats.
 #define ZBI_FLAG_STORAGE_COMPRESSED     (0x00000001)
 
 // A virtual disk image.  This is meant to be treated as if it were a
@@ -270,72 +298,14 @@
 // the storage device, in whatever format that might be.
 #define ZBI_TYPE_STORAGE_RAMDISK        (0x4b534452) // RDSK
 
-// The /boot filesystem in BOOTFS format, specified below.
+// The /boot filesystem in BOOTFS format, specified in <zircon/boot/bootfs.h>.
 // A complete ZBI must have exactly one ZBI_TYPE_STORAGE_BOOTFS item.
 // Zircon [userboot](../../../../docs/userboot.md) handles the contents
 // of this filesystem.
 #define ZBI_TYPE_STORAGE_BOOTFS         (0x42534642) // BFSB
 
-// The payload (after decompression) of an item in BOOTFS format consists
-// of separate "file" images that are each aligned to ZBI_BOOTFS_PAGE_SIZE
-// bytes from the beginning of the item payload.  The first "file" consists
-// of a zbi_bootfs_header_t followed by directory entries.
-#define ZBI_BOOTFS_PAGE_SIZE            (4096u)
-
-#define ZBI_BOOTFS_PAGE_ALIGN(size) \
-    (((size) + ZBI_BOOTFS_PAGE_SIZE - 1) & -ZBI_BOOTFS_PAGE_SIZE)
-
-#ifndef __ASSEMBLER__
-typedef struct {
-    // Must be ZBI_BOOTFS_MAGIC.
-    uint32_t magic;
-
-    // Size in bytes of all the directory entries.
-    // Does not include the size of the zbi_bootfs_header_t.
-    uint32_t dirsize;
-
-    // Reserved for future use.  Set to 0.
-    uint32_t reserved0;
-    uint32_t reserved1;
-} zbi_bootfs_header_t;
-#endif
-
-// LSW of sha256("bootfs")
-#define ZBI_BOOTFS_MAGIC                (0xa56d3ff9)
-
-// Each directory entry holds a pathname and gives the offset and size
-// of the contents of the file by that name.
-#ifndef __ASSEMBLER__
-typedef struct {
-    // Length of the name[] field at the end.  This length includes the
-    // NUL terminator, which must be present, but does not include any
-    // alignment padding required before the next directory entry.
-    uint32_t name_len;
-
-    // Length of the file in bytes.  This is an exact size that is not
-    // rounded, though the file is always padded with zeros up to a
-    // multiple of ZBI_BOOTFS_PAGE_SIZE.
-    uint32_t data_len;
-
-    // Offset from the beginning of the payload (zbi_bootfs_header_t) to
-    // the file's data.  This must be a multiple of ZBI_BOOTFS_PAGE_SIZE.
-    uint32_t data_off;
-
-    // Pathname of the file, a UTF-8 string.  This must include a NUL
-    // terminator at the end.  It must not begin with a '/', but it may
-    // contain '/' separators for subdirectories.
-    char name[];
-} zbi_bootfs_dirent_t;
-#endif
-
-// Each directory entry has a variable size of [16,268] bytes that
-// must be a multiple of 4 bytes.
-#define ZBI_BOOTFS_DIRENT_SIZE(name_len) \
-    ((sizeof(zbi_bootfs_dirent_t) + (name_len) + 3) & -(size_t)4)
-
-// zbi_bootfs_dirent_t.name_len must be > 1 and <= ZBI_BOOTFS_MAX_NAME_LEN.
-#define ZBI_BOOTFS_MAX_NAME_LEN         (256)
-
+// Device-specific factory data, stored in BOOTFS format, specified below.
+#define ZBI_TYPE_STORAGE_BOOTFS_FACTORY (0x46534642) // BFSF
 
 // The remaining types are used to communicate information from the boot
 // loader to the kernel.  Usually these are synthesized in memory by the
@@ -380,6 +350,14 @@
 } zbi_platform_id_t;
 #endif
 
+#define ZBI_TYPE_DRV_BOARD_INFO         (0x4953426D) // mBSI
+// Board-specific information.
+#ifndef __ASSEMBLER__
+typedef struct {
+    uint32_t revision;
+} zbi_board_info_t;
+#endif
+
 // CPU configuration, a zbi_cpu_config_t header followed by one or more
 // zbi_cpu_cluster_t entries.  zbi_header_t.length must equal
 // zbi_cpu_config_t.cluster_count * sizeof(zbi_cpu_cluster_t).
@@ -447,7 +425,9 @@
 }  zbi_topology_arm_info_t;
 
 typedef struct {
-    uint32_t apic_id;
+    // Indexes here correspond to the logical_ids index for the thread.
+    uint32_t apic_ids[ZBI_MAX_SMT];
+    uint32_t apic_id_count;
 }  zbi_topology_x86_info_t;
 
 typedef struct {
@@ -467,14 +447,33 @@
 } zbi_topology_processor_t;
 
 typedef struct {
-    // Relative performance level of this processor in the system, with 0
-    // representing the lowest performance.
-    // For example on a two cluster ARM big.LITTLE system 0 would be the little
-    // cores and 1 would represent the big cores.
+    // Relative performance level of this processor in the system. The value is
+    // interpreted as the performance of this processor relative to the maximum
+    // performance processor in the system. No specific values are required for
+    // the performance level, only that the following relationship holds:
+    //
+    //   Pmax is the value of performance_class for the maximum performance
+    //   processor in the system, operating at its maximum operating point.
+    //
+    //   P is the value of performance_class for this processor, operating at
+    //   its maximum operating point.
+    //
+    //   R is the performance ratio of this processor to the maximum performance
+    //   processor in the system in the range (0.0, 1.0].
+    //
+    //   R = (P + 1) / (Pmax + 1)
+    //
+    // If accuracy is limited, choose a conservative value that slightly under-
+    // estimates the performance of lower-performance processors.
     uint8_t performance_class;
 } zbi_topology_cluster_t;
 
 typedef struct {
+    // Unique id of this cache node. No other semantics are assumed.
+    uint32_t cache_id;
+} zbi_topology_cache_t;
+
+typedef struct {
   // Starting and ending memory addresses of this numa region.
   uint64_t start_address;
   uint64_t end_address;
@@ -499,6 +498,7 @@
         zbi_topology_processor_t processor;
         zbi_topology_cluster_t cluster;
         zbi_topology_numa_region_t numa_region;
+        zbi_topology_cache_t cache;
     } entity;
 } zbi_topology_node_t;
 
@@ -544,29 +544,18 @@
 #define ZIRCON_VENDOR_GUID \
     {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}}
 #define ZIRCON_CRASHLOG_EFIVAR \
-    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 };
+    { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 }
 #define ZIRCON_CRASHLOG_EFIATTR \
     (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
 
-// Debug serial port, a zbi_uart_t entry.
-#define ZBI_TYPE_DEBUG_UART             (0x54524155) // UART
-#ifndef __ASSEMBLER__
-typedef struct {
-    uint64_t base;
-    uint32_t type;
-    uint32_t irq;
-} zbi_uart_t;
-#endif
-#define ZBI_UART_NONE                   (0)
-#define ZBI_UART_PC_PORT                (1)
-#define ZBI_UART_PC_MMIO                (2)
-
 // Framebuffer parameters, a zbi_swfb_t entry.
 #define ZBI_TYPE_FRAMEBUFFER            (0x42465753) // SWFB
 
-// A copy of the boot configuration stored as a kvstore
-// within the sysconfig partition.
-#define ZBI_TYPE_BOOT_CONFIG        (0x47464342) // BCFG
+// The image arguments, data is a trivial text format of one "key=value" per line
+// with leading whitespace stripped and "#" comment lines and blank lines ignored.
+// It is processed by bootsvc and parsed args are shared to others via Arguments service.
+// TODO: the format can be streamlined after the /config/devmgr compat support is removed.
+#define ZBI_TYPE_IMAGE_ARGS          (0x47524149) // IARG
 
 // A copy of the boot version stored within the sysconfig
 // partition
@@ -602,6 +591,10 @@
 #define ZBI_TYPE_DRV_PARTITION_MAP      (0x5452506D) // mPRT
 #define ZBI_PARTITION_NAME_LEN          (32)
 #define ZBI_PARTITION_GUID_LEN          (16)
+
+// Private information for the board driver.
+#define ZBI_TYPE_DRV_BOARD_PRIVATE      (0x524F426D) // mBOR
+
 #ifndef __ASSEMBLER__
 typedef struct {
     // GUID specifying the format and use of data stored in the partition.
@@ -639,3 +632,50 @@
     zbi_partition_t partitions[];
 } zbi_partition_map_t;
 #endif
+
+
+#define ZBI_TYPE_HW_REBOOT_REASON       (0x42525748) // HWRB
+
+#define ZBI_HW_REBOOT_UNDEFINED         ((uint32_t)0)
+#define ZBI_HW_REBOOT_COLD              ((uint32_t)1)
+#define ZBI_HW_REBOOT_WARM              ((uint32_t)2)
+#define ZBI_HW_REBOOT_BROWNOUT          ((uint32_t)3)
+#define ZBI_HW_REBOOT_WATCHDOG          ((uint32_t)4)
+
+#ifndef __ASSEMBLER__
+#ifndef __cplusplus
+typedef uint32_t zbi_hw_reboot_reason_t;
+#else
+enum class ZbiHwRebootReason : uint32_t {
+    Undefined = ZBI_HW_REBOOT_UNDEFINED,
+    Cold = ZBI_HW_REBOOT_COLD,
+    Warm = ZBI_HW_REBOOT_WARM,
+    Brownout = ZBI_HW_REBOOT_BROWNOUT,
+    Watchdog = ZBI_HW_REBOOT_WATCHDOG,
+};
+using zbi_hw_reboot_reason_t = ZbiHwRebootReason;
+#endif  // __cplusplus
+#endif  // __ASSEMBLER__
+
+// The serial number, an unterminated ASCII string of printable non-whitespace
+// characters with length zbi_header_t.length.
+#define ZBI_TYPE_SERIAL_NUMBER          (0x4e4c5253) // SRLN
+
+// This type specifies a binary file passed in by the bootloader.
+// The first byte specifies the length of the filename without a NUL terminator.
+// The filename starts on the second byte.
+// The file contents are located immediately after the filename.
+//
+// Layout: | name_len |        name       |   payload
+//           ^(1 byte)  ^(name_len bytes)     ^(length of file)
+#define ZBI_TYPE_BOOTLOADER_FILE        (0x4C465442) // BTFL
+
+// The devicetree blob from the legacy boot loader, if any.  This is used only
+// for diagnostic and development purposes.  Zircon kernel and driver
+// configuration is entirely driven by specific ZBI items from the boot
+// loader.  The boot shims for legacy boot loaders pass the raw devicetree
+// along for development purposes, but extract information from it to populate
+// specific ZBI items such as ZBI_TYPE_KERNEL_DRIVER et al.
+#define ZBI_TYPE_DEVICETREE             (0xd00dfeed)
+
+#endif  // SYSROOT_ZIRCON_BOOT_IMAGE_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/multiboot.h b/arch/x64/sysroot/include/zircon/boot/multiboot.h
index 0076832..85cf0a6 100644
--- a/arch/x64/sysroot/include/zircon/boot/multiboot.h
+++ b/arch/x64/sysroot/include/zircon/boot/multiboot.h
@@ -1,23 +1,22 @@
-// Copyright 2016 The Fuchsia Authors
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
 // Copyright (c) 2009 Corey Tabaka
-//
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file or at
-// https://opensource.org/licenses/MIT
 
-#ifndef __PLATFORM_MULTIBOOT_H
-#define __PLATFORM_MULTIBOOT_H
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SYSROOT_ZIRCON_MULTIBOOT_H_
+#define SYSROOT_ZIRCON_MULTIBOOT_H_
 
 /* magic number for multiboot header */
-#define MULTIBOOT_HEADER_MAGIC      0x1BADB002
+#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
 
 // Flags for multiboot header:
 //   0x00000002: Boot loader should provide memory map.
 //   0x00010000: *_addr fields in multiboot_header_t are used.
-#define MULTIBOOT_HEADER_FLAGS      0x00010002
+#define MULTIBOOT_HEADER_FLAGS 0x00010002
 
 /* magic number passed by multiboot-compliant boot loaders */
-#define MULTIBOOT_BOOTLOADER_MAGIC  0x2BADB002
+#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
 
 #ifndef __ASSEMBLER__
 
@@ -25,52 +24,52 @@
 
 /* multiboot header */
 typedef struct multiboot_header {
-    uint32_t magic;
-    uint32_t flags;
-    uint32_t checksum;
-    uint32_t header_addr;
-    uint32_t load_addr;
-    uint32_t load_end_addr;
-    uint32_t bss_end_addr;
-    uint32_t entry_addr;
+  uint32_t magic;
+  uint32_t flags;
+  uint32_t checksum;
+  uint32_t header_addr;
+  uint32_t load_addr;
+  uint32_t load_end_addr;
+  uint32_t bss_end_addr;
+  uint32_t entry_addr;
 } multiboot_header_t;
 
 /* symbol table for a.out */
 typedef struct aout_symbol_table {
-    uint32_t tabsize;
-    uint32_t strsize;
-    uint32_t addr;
-    uint32_t reserved;
+  uint32_t tabsize;
+  uint32_t strsize;
+  uint32_t addr;
+  uint32_t reserved;
 } aout_symbol_table_t;
 
 /* section header table for ELF */
 typedef struct elf_section_header_table {
-    uint32_t num;
-    uint32_t size;
-    uint32_t addr;
-    uint32_t shndx;
+  uint32_t num;
+  uint32_t size;
+  uint32_t addr;
+  uint32_t shndx;
 } elf_section_header_table_t;
 
 /* multiboot info */
 typedef struct multiboot_info {
-    uint32_t flags;
-    uint32_t mem_lower;
-    uint32_t mem_upper;
-    uint32_t boot_device;
-    uint32_t cmdline;
-    uint32_t mods_count;
-    uint32_t mods_addr;
-    union {
-        aout_symbol_table_t aout_sym;
-        elf_section_header_table_t elf_sec;
-    } u;
-    uint32_t mmap_length;
-    uint32_t mmap_addr;
-    uint32_t drives_length;
-    uint32_t drives_addr;
-    uint32_t config_table;
-    uint32_t boot_loader_name;
-    uint32_t apm_table;
+  uint32_t flags;
+  uint32_t mem_lower;
+  uint32_t mem_upper;
+  uint32_t boot_device;
+  uint32_t cmdline;
+  uint32_t mods_count;
+  uint32_t mods_addr;
+  union {
+    aout_symbol_table_t aout_sym;
+    elf_section_header_table_t elf_sec;
+  } u;
+  uint32_t mmap_length;
+  uint32_t mmap_addr;
+  uint32_t drives_length;
+  uint32_t drives_addr;
+  uint32_t config_table;
+  uint32_t boot_loader_name;
+  uint32_t apm_table;
 } multiboot_info_t;
 
 #define MB_INFO_MEM_SIZE 0x001
@@ -88,20 +87,20 @@
 
 /* module structure */
 typedef struct module {
-    uint32_t mod_start;
-    uint32_t mod_end;
-    uint32_t string;
-    uint32_t reserved;
+  uint32_t mod_start;
+  uint32_t mod_end;
+  uint32_t string;
+  uint32_t reserved;
 } module_t;
 
 /* memory map - be careful that the offset 0 is base_addr_low without size */
 typedef struct memory_map {
-    uint32_t size;
-    uint32_t base_addr_low;
-    uint32_t base_addr_high;
-    uint32_t length_low;
-    uint32_t length_high;
-    uint32_t type;
+  uint32_t size;
+  uint32_t base_addr_low;
+  uint32_t base_addr_high;
+  uint32_t length_low;
+  uint32_t length_high;
+  uint32_t type;
 } memory_map_t;
 
 /* memory map entry types */
@@ -112,4 +111,4 @@
 
 #endif
 
-#endif
+#endif  // SYSROOT_ZIRCON_BOOT_MULTIBOOT_
diff --git a/arch/x64/sysroot/include/zircon/boot/netboot.h b/arch/x64/sysroot/include/zircon/boot/netboot.h
index 25973c6..1586352 100644
--- a/arch/x64/sysroot/include/zircon/boot/netboot.h
+++ b/arch/x64/sysroot/include/zircon/boot/netboot.h
@@ -2,14 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_NETBOOT_H_
+#define SYSROOT_ZIRCON_BOOT_NETBOOT_H_
 
 #include <stddef.h>
 #include <stdint.h>
+#include <zircon/types.h>
 
 // clang-format off
 
-#define BOOTLOADER_VERSION "0.7.13"
+#define BOOTLOADER_VERSION "0.7.22"
 
 #define NB_MAGIC              0xAA774217
 #define NB_DEBUGLOG_MAGIC     0xAEAE1123
@@ -34,6 +36,7 @@
 #define NB_CLOSE             10  // arg=0
 #define NB_LAST_DATA         11  // arg=offset, data=data
 #define NB_REBOOT            12  // arg=0
+#define NB_GET_ADVERT        13  // arg=0
 
 #define NB_ACK                0 // arg=0 or -err, NB_READ: data=data
 #define NB_FILE_RECEIVED      0x70000001 // arg=size
@@ -62,10 +65,17 @@
 #define NB_FVM_FILENAME NB_IMAGE_PREFIX NB_FVM_HOST_FILENAME
 #define NB_BOOTLOADER_HOST_FILENAME "bootloader.img"
 #define NB_BOOTLOADER_FILENAME NB_IMAGE_PREFIX NB_BOOTLOADER_HOST_FILENAME
-#define NB_EFI_HOST_FILENAME "efi.img"
-#define NB_EFI_FILENAME NB_IMAGE_PREFIX NB_EFI_HOST_FILENAME
-#define NB_KERNC_HOST_FILENAME "kernc.img"
-#define NB_KERNC_FILENAME NB_IMAGE_PREFIX NB_KERNC_HOST_FILENAME
+// Firmware images are slightly different, as they have an optional type suffix:
+//   firmware_     <- type = "" (the default)
+//   firmware_foo  <- type = "foo"
+#define NB_FIRMWARE_HOST_FILENAME_PREFIX "firmware_"
+#define NB_FIRMWARE_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARE_HOST_FILENAME_PREFIX
+#define NB_FIRMWAREA_HOST_FILENAME_PREFIX "firmwarea_"
+#define NB_FIRMWAREA_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREA_HOST_FILENAME_PREFIX
+#define NB_FIRMWAREB_HOST_FILENAME_PREFIX "firmwareb_"
+#define NB_FIRMWAREB_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWAREB_HOST_FILENAME_PREFIX
+#define NB_FIRMWARER_HOST_FILENAME_PREFIX "firmwarer_"
+#define NB_FIRMWARER_FILENAME_PREFIX NB_IMAGE_PREFIX NB_FIRMWARER_HOST_FILENAME_PREFIX
 #define NB_ZIRCONA_HOST_FILENAME "zircona.img"
 #define NB_ZIRCONA_FILENAME NB_IMAGE_PREFIX NB_ZIRCONA_HOST_FILENAME
 #define NB_ZIRCONB_HOST_FILENAME "zirconb.img"
@@ -76,8 +86,36 @@
 #define NB_VBMETAA_FILENAME NB_IMAGE_PREFIX NB_VBMETAA_HOST_FILENAME
 #define NB_VBMETAB_HOST_FILENAME "vbmetab.img"
 #define NB_VBMETAB_FILENAME NB_IMAGE_PREFIX NB_VBMETAB_HOST_FILENAME
+#define NB_VBMETAR_HOST_FILENAME "vbmetar.img"
+#define NB_VBMETAR_FILENAME NB_IMAGE_PREFIX NB_VBMETAR_HOST_FILENAME
 #define NB_SSHAUTH_HOST_FILENAME "authorized_keys"
 #define NB_SSHAUTH_FILENAME NB_IMAGE_PREFIX NB_SSHAUTH_HOST_FILENAME
+#define NB_BOARD_NAME_HOST_FILENAME "board_name"
+#define NB_BOARD_NAME_FILENAME NB_IMAGE_PREFIX NB_BOARD_NAME_HOST_FILENAME
+#define NB_BOARD_REVISION_HOST_FILENAME "board_revision"
+#define NB_BOARD_REVISION_FILENAME NB_IMAGE_PREFIX NB_BOARD_REVISION_HOST_FILENAME
+#define NB_BOARD_INFO_HOST_FILENAME "board_info"
+#define NB_BOARD_INFO_FILENAME NB_IMAGE_PREFIX NB_BOARD_INFO_HOST_FILENAME
+#define NB_INIT_PARTITION_TABLES_HOST_FILENAME "init_partition_tables"
+#define NB_INIT_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_INIT_PARTITION_TABLES_HOST_FILENAME
+#define NB_WIPE_PARTITION_TABLES_HOST_FILENAME "wipe_partition_tables"
+#define NB_WIPE_PARTITION_TABLES_FILENAME NB_IMAGE_PREFIX NB_WIPE_PARTITION_TABLES_HOST_FILENAME
+
+// Should match paver FIDL definition.
+// Length does not include the '\0' terminator, so when allocating a character
+// buffer to hold the type use (NB_FIRMWARE_TYPE_MAX_LENGTH  + 1).
+#define NB_FIRMWARE_TYPE_MAX_LENGTH 256
+
+typedef struct board_info {
+  char board_name[ZX_MAX_NAME_LEN];
+  uint32_t board_revision;
+  uint8_t mac_address[8];
+} board_info_t;
+
+typedef struct modify_partition_table_info {
+  // Path of block device to initialize or wipe.
+  char block_device_path[ZX_MAX_NAME_LEN + 1];
+} modify_partition_table_info_t;
 
 typedef struct nbmsg_t {
     uint32_t magic;
@@ -114,3 +152,5 @@
     char nodename[MAX_NODENAME_LENGTH];
     char data[MAX_LOG_DATA];
 } logpacket_t;
+
+#endif  // SYSROOT_ZIRCON_BOOT_NETBOOT_H_
diff --git a/arch/x64/sysroot/include/zircon/boot/sysconfig.h b/arch/x64/sysroot/include/zircon/boot/sysconfig.h
index fe59efa..1f7d49b 100644
--- a/arch/x64/sysroot/include/zircon/boot/sysconfig.h
+++ b/arch/x64/sysroot/include/zircon/boot/sysconfig.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
+#define SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
 
 // Zircon sysconfig partition format
 //
@@ -19,8 +20,10 @@
 //                  If present, this overrides boot-default, and the bootloader
 //                  deletes this section after use.
 
-#define ZX_SYSCONFIG_KVSTORE_SIZE           32768
-#define ZX_SYSCONFIG_VERSION_A_OFFSET       (0 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_VERSION_B_OFFSET       (1 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET    (2 * ZX_SYSCONFIG_KVSTORE_SIZE)
-#define ZX_SYSCONFIG_BOOT_ONESHOT_OFFSET    (3 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_KVSTORE_SIZE 32768
+#define ZX_SYSCONFIG_VERSION_A_OFFSET (0 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_VERSION_B_OFFSET (1 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET (2 * ZX_SYSCONFIG_KVSTORE_SIZE)
+#define ZX_SYSCONFIG_BOOT_ONESHOT_OFFSET (3 * ZX_SYSCONFIG_KVSTORE_SIZE)
+
+#endif  // SYSROOT_ZIRCON_BOOT_SYSCONFIG_H_
diff --git a/arch/x64/sysroot/include/zircon/compiler.h b/arch/x64/sysroot/include/zircon/compiler.h
index fb3bb42..ce2bcea 100644
--- a/arch/x64/sysroot/include/zircon/compiler.h
+++ b/arch/x64/sysroot/include/zircon/compiler.h
@@ -2,7 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_COMPILER_H_
+#define SYSROOT_ZIRCON_COMPILER_H_
+
+#ifndef __has_feature
+#define __has_feature(x) 0
+#endif
+
+#ifndef __has_cpp_attribute
+#define __has_cpp_attribute(x) 0
+#endif
 
 #ifndef __ASSEMBLER__
 
@@ -10,14 +19,14 @@
 #error "Unrecognized compiler!"
 #endif
 
-#define likely(x)       __builtin_expect(!!(x), 1)
-#define unlikely(x)     __builtin_expect(!!(x), 0)
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
 #define __UNUSED __attribute__((__unused__))
 #define __USED __attribute__((__used__))
 #define __PACKED __attribute__((packed))
 #define __ALIGNED(x) __attribute__((aligned(x)))
-#define __PRINTFLIKE(__fmt,__varargs) __attribute__((__format__ (__printf__, __fmt, __varargs)))
-#define __SCANFLIKE(__fmt,__varargs) __attribute__((__format__ (__scanf__, __fmt, __varargs)))
+#define __PRINTFLIKE(__fmt, __varargs) __attribute__((__format__(__printf__, __fmt, __varargs)))
+#define __SCANFLIKE(__fmt, __varargs) __attribute__((__format__(__scanf__, __fmt, __varargs)))
 #define __SECTION(x) __attribute__((__section__(x)))
 #define __PURE __attribute__((__pure__))
 #define __CONST __attribute__((__const__))
@@ -39,18 +48,21 @@
 #define __LEAF_FN __attribute__((__leaf__))
 #define __OPTIMIZE(x) __attribute__((__optimize__(x)))
 #define __EXTERNALLY_VISIBLE __attribute__((__externally_visible__))
-#define __THREAD_ANNOTATION(x)
 #define __NO_SAFESTACK
+#define __THREAD_ANNOTATION(x)
 #else
 #define __LEAF_FN
 #define __OPTIMIZE(x)
 #define __EXTERNALLY_VISIBLE
+// The thread safety annotations are frequently used with C++ standard library
+// types in userspace, so only enable the annotations if we know that the C++
+// standard library types are annotated or if we're in kernel code.
+#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) || defined(_KERNEL)
 #define __THREAD_ANNOTATION(x) __attribute__((x))
-#define __NO_SAFESTACK __attribute__((__no_sanitize__("safe-stack")))
-#endif
-
-#ifndef __has_feature
-#define __has_feature(x) 0
+#else
+#define __THREAD_ANNOTATION(x)
+#endif  // _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS
+#define __NO_SAFESTACK __attribute__((__no_sanitize__("safe-stack", "shadow-call-stack")))
 #endif
 
 #define __ALWAYS_INLINE __attribute__((__always_inline__))
@@ -60,19 +72,51 @@
 #define __UNREACHABLE __builtin_unreachable()
 #define __WEAK_ALIAS(x) __attribute__((__weak__, __alias__(x)))
 #define __ALIAS(x) __attribute__((__alias__(x)))
-#define __EXPORT __attribute__ ((__visibility__("default")))
-#define __LOCAL  __attribute__ ((__visibility__("hidden")))
+#define __EXPORT __attribute__((__visibility__("default")))
+#define __LOCAL __attribute__((__visibility__("hidden")))
 #define __THREAD __thread
 #define __offsetof(type, field) __builtin_offsetof(type, field)
 
+// Only define __NO_UNIQUE_ADDRESS for C++, since it doesn't make sense in C.
+#ifdef __cplusplus
+#if __has_cpp_attribute(no_unique_address)
+#define __NO_UNIQUE_ADDRESS [[no_unique_address]]
+#else
+#define __NO_UNIQUE_ADDRESS
+#endif
+#endif  // ifdef __cplusplus
+
 #if defined(__cplusplus) && __cplusplus >= 201703L
 #define __FALLTHROUGH [[fallthrough]]
 #elif defined(__cplusplus) && defined(__clang__)
 #define __FALLTHROUGH [[clang::fallthrough]]
-#elif __GNUC__ >= 7
+// The GNU style attribute is supported by Clang for C code, but __GNUC__ for
+// clang right now is 4.
+#elif __GNUC__ >= 7 || (!defined(__cplusplus) && defined(__clang__))
 #define __FALLTHROUGH __attribute__((__fallthrough__))
 #else
-#define __FALLTHROUGH do {} while (0)
+#define __FALLTHROUGH \
+  do {                \
+  } while (0)
+#endif
+
+// C++17 onwards supports [[nodiscard]] on a constructor, warning if
+// a temporary object is created without a name. Such objects would be
+// immediately destroyed again, while the user's expectation might be
+// that it would last the scope.
+//
+// We could ideally just use [[nodiscard]] (or __WARN_UNUSED_RESULT)
+// directly, except GCC < 10.0 has a bug preventing it from being used
+// on constructors. __WARN_UNUSED_CONSTRUCTOR allows us to tag
+// constructors in supported compilers, and is simply ignored in older
+// compilers.
+#if defined(__cplusplus)
+// Clang and GCC versions >= 10.0 support [[nodiscard]] on constructors.
+#if __cplusplus >= 201703L && (defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 10)))
+#define __WARN_UNUSED_CONSTRUCTOR [[nodiscard]]
+#else
+#define __WARN_UNUSED_CONSTRUCTOR
+#endif
 #endif
 
 // Publicly exposed thread annotation macros. These have a long and ugly name to
@@ -80,12 +124,17 @@
 #define __TA_CAPABILITY(x) __THREAD_ANNOTATION(__capability__(x))
 #define __TA_GUARDED(x) __THREAD_ANNOTATION(__guarded_by__(x))
 #define __TA_ACQUIRE(...) __THREAD_ANNOTATION(__acquire_capability__(__VA_ARGS__))
+#define __TA_ACQUIRE_SHARED(...) __THREAD_ANNOTATION(__acquire_shared_capability__(__VA_ARGS__))
 #define __TA_TRY_ACQUIRE(...) __THREAD_ANNOTATION(__try_acquire_capability__(__VA_ARGS__))
 #define __TA_ACQUIRED_BEFORE(...) __THREAD_ANNOTATION(__acquired_before__(__VA_ARGS__))
 #define __TA_ACQUIRED_AFTER(...) __THREAD_ANNOTATION(__acquired_after__(__VA_ARGS__))
 #define __TA_RELEASE(...) __THREAD_ANNOTATION(__release_capability__(__VA_ARGS__))
+#define __TA_RELEASE_SHARED(...) __THREAD_ANNOTATION(__release_shared_capability__(__VA_ARGS__))
 #define __TA_REQUIRES(...) __THREAD_ANNOTATION(__requires_capability__(__VA_ARGS__))
+#define __TA_REQUIRES_SHARED(...) __THREAD_ANNOTATION(__requires_shared_capability__(__VA_ARGS__))
 #define __TA_EXCLUDES(...) __THREAD_ANNOTATION(__locks_excluded__(__VA_ARGS__))
+#define __TA_ASSERT(...) __THREAD_ANNOTATION(__assert_capability__(__VA_ARGS__))
+#define __TA_ASSERT_SHARED(...) __THREAD_ANNOTATION(__assert_shared_capability__(__VA_ARGS__))
 #define __TA_RETURN_CAPABILITY(x) __THREAD_ANNOTATION(__lock_returned__(x))
 #define __TA_SCOPED_CAPABILITY __THREAD_ANNOTATION(__scoped_lockable__)
 #define __TA_NO_THREAD_SAFETY_ANALYSIS __THREAD_ANNOTATION(__no_thread_safety_analysis__)
@@ -103,8 +152,8 @@
 
 /* CPP header guards */
 #ifdef __cplusplus
-#define __BEGIN_CDECLS  extern "C" {
-#define __END_CDECLS    }
+#define __BEGIN_CDECLS extern "C" {
+#define __END_CDECLS }
 #else
 #define __BEGIN_CDECLS
 #define __END_CDECLS
@@ -120,3 +169,23 @@
 #define add_overflow(a, b, c) __builtin_add_overflow(a, b, c)
 #define sub_overflow(a, b, c) __builtin_sub_overflow(a, b, c)
 #define mul_overflow(a, b, c) __builtin_mul_overflow(a, b, c)
+
+// A workaround to help static analyzer identify assertion failures
+#if defined(__clang__)
+#define __ANALYZER_CREATE_SINK __attribute__((analyzer_noreturn))
+#else
+#define __ANALYZER_CREATE_SINK  // no-op
+#endif
+
+// Lifetime analysis
+#ifndef __OWNER
+#ifdef __clang__
+#define __OWNER(x) [[gsl::Owner(x)]]
+#define __POINTER(x) [[gsl::Pointer(x)]]
+#else
+#define __OWNER(x)
+#define __POINTER(x)
+#endif
+#endif
+
+#endif  // SYSROOT_ZIRCON_COMPILER_H_
diff --git a/arch/x64/sysroot/include/zircon/device/audio.h b/arch/x64/sysroot/include/zircon/device/audio.h
new file mode 100644
index 0000000..01b966e
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/device/audio.h
@@ -0,0 +1,467 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_DEVICE_AUDIO_H_
+#define SYSROOT_ZIRCON_DEVICE_AUDIO_H_
+
+#include <sys/types.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+#include <cassert>
+#include <cstdio>
+
+// When communicating with an Audio driver using zx_channel_call, do not use
+// the AUDIO_INVALID_TRANSACTION_ID as your message's transaction ID.  It is
+// reserved for async notifications sent from the driver to the application.
+#define AUDIO_INVALID_TRANSACTION_ID ((zx_txid_t)0)
+
+__BEGIN_CDECLS
+
+typedef uint32_t audio_cmd_t;
+
+// Commands sent on the stream channel
+#define AUDIO_STREAM_CMD_GET_FORMATS ((audio_cmd_t)0x1000)
+#define AUDIO_STREAM_CMD_SET_FORMAT ((audio_cmd_t)0x1001)
+#define AUDIO_STREAM_CMD_GET_GAIN ((audio_cmd_t)0x1002)
+#define AUDIO_STREAM_CMD_SET_GAIN ((audio_cmd_t)0x1003)
+#define AUDIO_STREAM_CMD_PLUG_DETECT ((audio_cmd_t)0x1004)
+#define AUDIO_STREAM_CMD_GET_UNIQUE_ID ((audio_cmd_t)0x1005)
+#define AUDIO_STREAM_CMD_GET_STRING ((audio_cmd_t)0x1006)
+#define AUDIO_STREAM_CMD_GET_CLOCK_DOMAIN ((audio_cmd_t)0x1007)
+
+// Async notifications sent on the stream channel.
+#define AUDIO_STREAM_PLUG_DETECT_NOTIFY ((audio_cmd_t)0x2000)
+
+// Commands sent on the ring buffer channel
+#define AUDIO_RB_CMD_GET_FIFO_DEPTH ((audio_cmd_t)0x3000)
+#define AUDIO_RB_CMD_GET_BUFFER ((audio_cmd_t)0x3001)
+#define AUDIO_RB_CMD_START ((audio_cmd_t)0x3002)
+#define AUDIO_RB_CMD_STOP ((audio_cmd_t)0x3003)
+
+// Async notifications sent on the ring buffer channel.
+#define AUDIO_RB_POSITION_NOTIFY ((audio_cmd_t)0x4000)
+
+// Flags used to modify commands.
+// The NO_ACK flag can be used with the SET_GAIN and PLUG_DETECT commands.
+#define AUDIO_FLAG_NO_ACK ((audio_cmd_t)0x80000000)
+
+typedef struct audio_cmd_hdr {
+  zx_txid_t transaction_id;
+  audio_cmd_t cmd;
+} audio_cmd_hdr_t;
+
+static_assert(sizeof(audio_cmd_hdr_t) == 8,
+              "audio_cmd_hdr_t should be 8 bytes! "
+              "If sizeof(zx_txid_t has changed from 4 to 8, "
+              "consider repacking the structs in audio.h");
+
+// audio_sample_format_t
+//
+// Bitfield which describes audio sample format as they reside in memory.
+//
+typedef uint32_t audio_sample_format_t;
+#define AUDIO_SAMPLE_FORMAT_BITSTREAM ((audio_sample_format_t)(1u << 0))
+#define AUDIO_SAMPLE_FORMAT_8BIT ((audio_sample_format_t)(1u << 1))
+#define AUDIO_SAMPLE_FORMAT_16BIT ((audio_sample_format_t)(1u << 2))
+#define AUDIO_SAMPLE_FORMAT_20BIT_PACKED ((audio_sample_format_t)(1u << 4))
+#define AUDIO_SAMPLE_FORMAT_24BIT_PACKED ((audio_sample_format_t)(1u << 5))
+#define AUDIO_SAMPLE_FORMAT_20BIT_IN32 ((audio_sample_format_t)(1u << 6))
+#define AUDIO_SAMPLE_FORMAT_24BIT_IN32 ((audio_sample_format_t)(1u << 7))
+#define AUDIO_SAMPLE_FORMAT_32BIT ((audio_sample_format_t)(1u << 8))
+#define AUDIO_SAMPLE_FORMAT_32BIT_FLOAT ((audio_sample_format_t)(1u << 9))
+#define AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED ((audio_sample_format_t)(1u << 30))
+#define AUDIO_SAMPLE_FORMAT_FLAG_INVERT_ENDIAN ((audio_sample_format_t)(1u << 31))
+#define AUDIO_SAMPLE_FORMAT_FLAG_MASK                          \
+  ((audio_sample_format_t)(AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED | \
+                           AUDIO_SAMPLE_FORMAT_FLAG_INVERT_ENDIAN))
+
+// audio_stream_format_range_t
+//
+// A structure used along with the AUDIO_STREAM_CMD_GET_FORMATS command in order
+// to describe the formats supported by an audio stream.
+#define ASF_RANGE_FLAG_FPS_CONTINUOUS ((uint16_t)(1u << 0))
+#define ASF_RANGE_FLAG_FPS_48000_FAMILY ((uint16_t)(1u << 1))
+#define ASF_RANGE_FLAG_FPS_44100_FAMILY ((uint16_t)(1u << 2))
+typedef struct audio_stream_format_range {
+  audio_sample_format_t sample_formats;
+  uint32_t min_frames_per_second;
+  uint32_t max_frames_per_second;
+  uint8_t min_channels;
+  uint8_t max_channels;
+  uint16_t flags;
+} __PACKED audio_stream_format_range_t;
+
+static_assert(sizeof(audio_stream_format_range_t) == 16,
+              "audio_stream_format_range_t should be 16 bytes!");
+
+// audio_set_gain_flags_t
+//
+// Flags used by the AUDIO_STREAM_CMD_SET_GAIN message.
+//
+typedef uint32_t audio_set_gain_flags_t;
+#define AUDIO_SGF_MUTE_VALID \
+  ((audio_set_gain_flags_t)0x1)  // Whether or not the mute flag is valid.
+#define AUDIO_SGF_AGC_VALID ((audio_set_gain_flags_t)0x2)  // Whether or not the agc flag is valid.
+#define AUDIO_SGF_GAIN_VALID \
+  ((audio_set_gain_flags_t)0x4)  // Whether or not the gain float is valid.
+#define AUDIO_SGF_MUTE ((audio_set_gain_flags_t)0x40000000)  // Whether or not to mute the stream.
+#define AUDIO_SGF_AGC \
+  ((audio_set_gain_flags_t)0x80000000)  // Whether or not enable AGC for the stream.
+
+// audio_pd_flags_t
+//
+// Flags used by AUDIO_STREAM_CMD_PLUG_DETECT commands to enable or disable
+// asynchronous plug detect notifications.
+//
+typedef uint32_t audio_pd_flags_t;
+#define AUDIO_PDF_NONE ((audio_pd_flags_t)0)
+#define AUDIO_PDF_ENABLE_NOTIFICATIONS ((audio_pd_flags_t)0x40000000)
+#define AUDIO_PDF_DISABLE_NOTIFICATIONS ((audio_pd_flags_t)0x80000000)
+
+// audio_pd_notify_flags_t
+//
+// Flags used by responses to the AUDIO_STREAM_CMD_PLUG_DETECT
+// message, and by AUDIO_STREAM_PLUG_DETECT_NOTIFY messages.
+//
+typedef uint32_t audio_pd_notify_flags_t;
+#define AUDIO_PDNF_HARDWIRED \
+  ((audio_pd_notify_flags_t)0x1)  // Stream is hardwired (will always be plugged in)
+#define AUDIO_PDNF_CAN_NOTIFY \
+  ((audio_pd_notify_flags_t)0x2)  // Stream is able to notify of plug state changes.
+#define AUDIO_PDNF_PLUGGED ((audio_pd_notify_flags_t)0x80000000)  // Stream is currently plugged in.
+
+// AUDIO_STREAM_CMD_GET_FORMATS
+//
+// Must not be used with the NO_ACK flag.
+#define AUDIO_STREAM_CMD_GET_FORMATS_MAX_RANGES_PER_RESPONSE (15u)
+typedef struct audio_stream_cmd_get_formats_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_formats_req_t;
+
+// TODO(johngro) : Figure out if zx_txid_t is ever going to go up to 8 bytes or
+// not.  If it is, just remove the _pad field below.  If not, either keep it as
+// a _pad field, or repurpose it for some flags of some form.  Right now, we use
+// it to make sure that format_ranges is aligned to a 16 byte boundary.
+typedef struct audio_stream_cmd_get_formats_resp {
+  audio_cmd_hdr_t hdr;
+  uint32_t _pad;
+  uint16_t format_range_count;
+  uint16_t first_format_range_ndx;
+  audio_stream_format_range_t format_ranges[AUDIO_STREAM_CMD_GET_FORMATS_MAX_RANGES_PER_RESPONSE];
+} audio_stream_cmd_get_formats_resp_t;
+
+static_assert(sizeof(audio_stream_cmd_get_formats_resp_t) == 256,
+              "audio_stream_cmd_get_formats_resp_t must be 256 bytes");
+
+#define AUDIO_SET_FORMAT_REQ_BITMASK_DISABLED ((uint64_t)0)
+
+// AUDIO_STREAM_CMD_SET_FORMAT
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_set_format_req {
+  audio_cmd_hdr_t hdr;
+  uint32_t frames_per_second;
+  audio_sample_format_t sample_format;
+  uint16_t channels;
+  uint64_t channels_to_use_bitmask;
+} audio_stream_cmd_set_format_req_t;
+
+typedef struct audio_stream_cmd_set_format_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint64_t external_delay_nsec;
+
+  // Note: Upon success, a channel used to control the audio buffer will also
+  // be returned.
+} audio_stream_cmd_set_format_resp_t;
+
+// AUDIO_STREAM_CMD_GET_GAIN
+//
+// Request that a gain notification be sent with the current details of the
+// streams current gain settings as well as gain setting capabilities.
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_get_gain_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_gain_req_t;
+
+typedef struct audio_stream_cmd_get_gain_resp {
+  // TODO(johngro) : Is there value in exposing the gain step to the level
+  // above the lowest level stream interface, or should we have all drivers
+  // behave as if they have continuous control at all times?
+  audio_cmd_hdr_t hdr;
+
+  bool cur_mute;   // True if the stream is currently muted.
+  bool cur_agc;    // True if the stream has AGC currently enabled.
+  float cur_gain;  // The current setting gain of the stream in dB
+
+  bool can_mute;    // True if the stream is capable of muting
+  bool can_agc;     // True if the stream has support for AGC
+  float min_gain;   // The minimum valid gain setting, in dB
+  float max_gain;   // The maximum valid gain setting, in dB
+  float gain_step;  // The smallest valid gain increment, counted from the minimum gain.
+} audio_stream_cmd_get_gain_resp_t;
+
+// AUDIO_STREAM_CMD_SET_GAIN
+//
+// Request that a stream change its gain settings to most closely match those
+// requested.  Gain values for Valid requests will be rounded to the nearest
+// gain step.  For example, if a stream can control its gain on the range from
+// -60.0 to 0.0 dB, a request to set the gain to -33.3 dB will result in a gain
+// of -33.5 being applied.
+//
+// Gain change requests outside of the capabilities of the stream's
+// amplifier will be rejected with a result of ZX_ERR_INVALID_ARGS.  Using the
+// previous example, requests for gains of -65.0 or +3dB would be rejected.
+// Similarly,  If an amplifier is capable of gain control but cannot mute, a
+// request to mute will be rejected.
+//
+// TODO(johngro) : Is this the correct behavior?  Should we just apply sensible
+// limits instead?  IOW - If the user requests a gain of -1000 dB, should we
+// just set the gain to -60dB?  Likewise, if they request mute but the amplifier
+// has no hard mute feature, should we just set the gain to the minimum
+// permitted gain?
+//
+// May be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_set_gain_req {
+  audio_cmd_hdr_t hdr;
+  audio_set_gain_flags_t flags;
+  float gain;
+} audio_stream_cmd_set_gain_req_t;
+
+typedef struct audio_stream_cmd_set_gain_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  // The current gain settings observed immediately after processing the set
+  // gain request.
+  bool cur_mute;
+  bool cur_agc;
+  float cur_gain;
+} audio_stream_cmd_set_gain_resp_t;
+
+// AUDIO_STREAM_CMD_PLUG_DETECT
+//
+// Trigger a plug detect operation and/or enable/disable asynchronous plug
+// detect notifications.
+//
+// May be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_plug_detect_req {
+  audio_cmd_hdr_t hdr;
+  audio_pd_flags_t flags;  // Options used to enable or disable notifications
+} audio_stream_cmd_plug_detect_req_t;
+
+typedef struct audio_stream_cmd_plug_detect_resp {
+  audio_cmd_hdr_t hdr;
+  audio_pd_notify_flags_t flags;  // The current plug state and capabilities
+  zx_time_t plug_state_time;      // The time of the plug state last change.
+} audio_stream_cmd_plug_detect_resp_t;
+
+// AUDIO_STREAM_PLUG_DETECT_NOTIFY
+//
+// Message asynchronously in response to a plug state change to clients who have
+// registered for plug state notifications.
+//
+// Note: Solicited and unsolicited plug detect messages currently use the same
+// structure and contain the same information.  The difference between the two
+// is that Solicited messages, use AUDIO_STREAM_CMD_PLUG_DETECT as the value of
+// the `cmd` field of their header and the transaction ID of the request sent by
+// the client.  Unsolicited messages use AUDIO_STREAM_PLUG_DETECT_NOTIFY as the
+// value value of the `cmd` field of their header, and
+// AUDIO_INVALID_TRANSACTION_ID for their transaction ID.
+typedef audio_stream_cmd_plug_detect_resp_t audio_stream_plug_detect_notify_t;
+
+// AUDIO_STREAM_CMD_GET_UNIQUE_ID
+//
+// Fetch a globally unique, but persistent ID for the stream.
+//
+// Drivers should make every effort to return as unique an identifier as
+// possible for each stream that they publish.  This ID must not change between
+// boots.  When available, using a globally unique device serial number is
+// strongly encouraged.  Other possible sources of unique-ness include a
+// driver's physical connection path, driver binding information, manufacturer
+// calibration data, and so on.
+//
+// Note: a small number of hardcoded unique ID has been provided for built-in
+// devices.  Platform drivers for systems with hardwired audio devices may use
+// these unique IDs as appropriate to signal which audio streams represent the
+// built-in devices for the system.  Drivers for hot-pluggable audio devices
+// should *never* use these identifiers.
+//
+// Even given this, higher level code should *not* depend on these identifiers
+// being perfectly unique, and should be prepared to take steps to de-dupe
+// identifiers when needed.
+typedef struct audio_stream_cmd_get_unique_id_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_unique_id_req_t;
+
+typedef struct audio_stream_unique_id {
+  uint8_t data[16];
+} audio_stream_unique_id_t;
+
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_SPEAKERS \
+  {                                             \
+    .data = { 0x01, 0x00 }                      \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_HEADPHONE_JACK \
+  {                                                   \
+    .data = { 0x02, 0x00 }                            \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_MICROPHONE \
+  {                                               \
+    .data = { 0x03, 0x00 }                        \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_HEADSET_JACK \
+  {                                                 \
+    .data = { 0x04, 0x00 }                          \
+  }
+#define AUDIO_STREAM_UNIQUE_ID_BUILTIN_BT \
+  {                                       \
+    .data = { 0x05, 0x00 }                \
+  }
+
+typedef struct audio_stream_cmd_get_unique_id_resp {
+  audio_cmd_hdr_t hdr;
+  audio_stream_unique_id_t unique_id;
+} audio_stream_cmd_get_unique_id_resp_t;
+
+// AUDIO_STREAM_CMD_GET_STRING
+//
+// Fetch the specified string from a device's static string table.  Strings
+// returned by the device driver...
+//
+// ++ Must be encoded using UTF8
+// ++ May contain embedded NULLs
+// ++ May not be NULL terminated
+//
+// Drivers are encouraged to NULL terminate all of their strings whenever
+// possible, but are not required to do so if the response buffer is too small.
+//
+typedef uint32_t audio_stream_string_id_t;
+#define AUDIO_STREAM_STR_ID_MANUFACTURER ((audio_stream_string_id_t)0x80000000)
+#define AUDIO_STREAM_STR_ID_PRODUCT ((audio_stream_string_id_t)0x80000001)
+
+typedef struct audio_stream_cmd_get_string_req {
+  audio_cmd_hdr_t hdr;
+  audio_stream_string_id_t id;
+} audio_stream_cmd_get_string_req_t;
+
+typedef struct audio_stream_cmd_get_string_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  audio_stream_string_id_t id;
+  uint32_t strlen;
+  uint8_t str[256 - sizeof(audio_cmd_hdr_t) - (3 * sizeof(uint32_t))];
+} audio_stream_cmd_get_string_resp_t;
+
+static_assert(sizeof(audio_stream_cmd_get_string_resp_t) == 256,
+              "audio_stream_cmd_get_string_resp_t must be exactly 256 bytes");
+
+// AUDIO_STREAM_CMD_GET_CLOCK_DOMAIN
+//
+// Fetch the hardware clock domain for this device.
+// On products containing audio devices that are not locked to the local system clock, the board
+// driver will provide a clock tree entry to the audio driver at driver startup time. From that,
+// the audio driver can extract the clock domain and provide it to the sender, upon receiving this
+// command. This domain value is all that the sender needs, in order to locate controls for that
+// clock domain in the clock tree and trim that clock domain's rate.
+// On products containing audio devices that are locked to the local system monotonic clock, a clock
+// domain value of 0 should be returned.
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_stream_cmd_get_clock_domain_req {
+  audio_cmd_hdr_t hdr;
+} audio_stream_cmd_get_clock_domain_req_t;
+
+typedef struct audio_stream_cmd_get_clock_domain_resp {
+  audio_cmd_hdr_t hdr;
+  int32_t clock_domain;
+} audio_stream_cmd_get_clock_domain_resp_t;
+
+//
+// Ring-buffer commands
+//
+
+// AUDIO_RB_CMD_GET_FIFO_DEPTH
+//
+// TODO(johngro) : Is calling this "FIFO" depth appropriate?  Should it be some
+// direction neutral form of something like "max-read-ahead-amount" or something
+// instead?
+//
+// Must not be used with the NO_ACK flag.
+typedef struct audio_rb_cmd_get_fifo_depth_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_get_fifo_depth_req_t;
+
+typedef struct audio_rb_cmd_get_fifo_depth_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+
+  // A representation (in bytes) of how far ahead audio hardware may read
+  // into the stream (in the case of output) or may hold onto audio before
+  // writing it to memory (in the case of input).
+  uint32_t fifo_depth;
+} audio_rb_cmd_get_fifo_depth_resp_t;
+
+// AUDIO_RB_CMD_GET_BUFFER
+typedef struct audio_rb_cmd_get_buffer_req {
+  audio_cmd_hdr_t hdr;
+
+  uint32_t min_ring_buffer_frames;
+  uint32_t notifications_per_ring;
+} audio_rb_cmd_get_buffer_req_t;
+
+typedef struct audio_rb_cmd_get_buffer_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint32_t num_ring_buffer_frames;
+
+  // NOTE: If result == ZX_OK, a VMO handle representing the ring buffer to
+  // be used will be returned as well.  Clients may map this buffer with
+  // read-write permissions in the case of an output stream, or read-only
+  // permissions in the case of an input stream.  The size of the VMO
+  // indicates where the wrap point of the ring (in bytes) is located in the
+  // VMO.  This size *must* always be an integral number of audio frames.
+  //
+  // TODO(johngro) : Should we provide some indication of whether or not this
+  // memory is being used directly for HW DMA and may need explicit cache
+  // flushing/invalidation?
+} audio_rb_cmd_get_buffer_resp_t;
+
+// AUDIO_RB_CMD_START
+typedef struct audio_rb_cmd_start_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_start_req_t;
+
+typedef struct audio_rb_cmd_start_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+  uint64_t start_time;
+} audio_rb_cmd_start_resp_t;
+
+// AUDIO_RB_CMD_STOP
+typedef struct audio_rb_cmd_stop_req {
+  audio_cmd_hdr_t hdr;
+} audio_rb_cmd_stop_req_t;
+
+typedef struct audio_rb_cmd_stop_resp {
+  audio_cmd_hdr_t hdr;
+  zx_status_t result;
+} audio_rb_cmd_stop_resp_t;
+
+// AUDIO_RB_POSITION_NOTIFY
+typedef struct audio_rb_position_notify {
+  audio_cmd_hdr_t hdr;
+
+  // The time, per system monotonic clock, of the below byte position.
+  zx_time_t monotonic_time;
+
+  // The current position (in bytes) of the driver/hardware's read (output) or
+  // write (input) pointer in the ring buffer.
+  uint32_t ring_buffer_pos;
+} audio_rb_position_notify_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_DEVICE_AUDIO_H_
diff --git a/arch/x64/sysroot/include/zircon/device/ioctl-wrapper.h b/arch/x64/sysroot/include/zircon/device/ioctl-wrapper.h
deleted file mode 100644
index 81a1286..0000000
--- a/arch/x64/sysroot/include/zircon/device/ioctl-wrapper.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <zircon/compiler.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-__BEGIN_CDECLS
-
-extern ssize_t fdio_ioctl(int fd, int op, const void* in_buf, size_t in_len, void* out_buf, size_t out_len);
-
-#define IOCTL_WRAPPER(name, op) \
-static inline ssize_t name(int fd) {             \
-    return fdio_ioctl(fd, op, NULL, 0, NULL, 0); \
-}
-
-#define IOCTL_WRAPPER_IN(name, op, type) \
-static inline ssize_t name(int fd, const type* in) {     \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, NULL, 0); \
-}
-
-#define IOCTL_WRAPPER_VARIN(name, op, type) \
-static inline ssize_t name(int fd, const type* in, size_t in_len) { \
-    return fdio_ioctl(fd, op, in, in_len, NULL, 0);                  \
-}
-
-#define IOCTL_WRAPPER_OUT(name, op, type) \
-static inline ssize_t name(int fd, type* out) {            \
-    return fdio_ioctl(fd, op, NULL, 0, out, out ? sizeof(*out) : 0); \
-}
-
-#define IOCTL_WRAPPER_VAROUT(name, op, type) \
-static inline ssize_t name(int fd, type* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, NULL, 0, out, out_len);           \
-}
-
-#define IOCTL_WRAPPER_INOUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, outtype* out) { \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, out, out ? sizeof(*out) : 0);   \
-}
-
-#define IOCTL_WRAPPER_VARIN_OUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, size_t in_len, outtype* out) { \
-    return fdio_ioctl(fd, op, in, in_len, out, out ? sizeof(*out) : 0);                       \
-}
-
-#define IOCTL_WRAPPER_IN_VAROUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, outtype* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, in, in ? sizeof(*in) : 0, out, out_len);                        \
-}
-
-#define IOCTL_WRAPPER_VARIN_VAROUT(name, op, intype, outtype) \
-static inline ssize_t name(int fd, const intype* in, size_t in_len, outtype* out, size_t out_len) { \
-    return fdio_ioctl(fd, op, in, in_len, out, out_len);                                            \
-}
-
-__END_CDECLS
diff --git a/arch/x64/sysroot/include/zircon/device/ioctl.h b/arch/x64/sysroot/include/zircon/device/ioctl.h
deleted file mode 100644
index 7df5529..0000000
--- a/arch/x64/sysroot/include/zircon/device/ioctl.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-// DEFAULT ioctls accept and received byte[] data
-// the particular ioctl may define more specific structures
-#define IOCTL_KIND_DEFAULT          0x0
-
-// GET_HANDLE ioctls accept plain data and return
-// a single handle, optionally followed by plain data
-#define IOCTL_KIND_GET_HANDLE       0x1
-
-// GET_TWO_HANDLES ioctls accept plain data and return
-// two handles, optionally followed by plain data
-#define IOCTL_KIND_GET_TWO_HANDLES  0x2
-
-// GET_THREE_HANDLES ioctls accept plain data and return
-// three handles, optionally followed by plain data
-#define IOCTL_KIND_GET_THREE_HANDLES 0x4
-
-// SET_HANDLE ioctls accept a handle, and optionally
-// plain data afterwards.
-#define IOCTL_KIND_SET_HANDLE       0x3
-
-// SET_TWO_HANDLES ioctls accepts two handles, and
-// optionally plain data afterwards.
-#define IOCTL_KIND_SET_TWO_HANDLES  0x5
-
-// core device/vfs ioctl families
-#define IOCTL_FAMILY_RESERVED       0x00
-#define IOCTL_FAMILY_DEVICE         0x01
-#define IOCTL_FAMILY_VFS            0x02
-#define IOCTL_FAMILY_DMCTL          0x03
-#define IOCTL_FAMILY_TEST           0x04
-
-// device protocol families
-#define IOCTL_FAMILY_CONSOLE        0x10
-#define IOCTL_FAMILY_INPUT          0x11
-// 0x12 unused
-#define IOCTL_FAMILY_BLOCK          0x13
-#define IOCTL_FAMILY_I2C            0x14
-#define IOCTL_FAMILY_USB_DEVICE     0x16
-#define IOCTL_FAMILY_HID            0x17
-// 0x18 unused
-#define IOCTL_FAMILY_AUDIO          0x19
-#define IOCTL_FAMILY_MIDI           0x1A
-#define IOCTL_FAMILY_KTRACE         0x1B
-#define IOCTL_FAMILY_BT_HCI         0x1C
-#define IOCTL_FAMILY_SYSINFO        0x1D
-// 0x1E unused
-#define IOCTL_FAMILY_RTC            0x1F  // ioctls for RTC
-#define IOCTL_FAMILY_ETH            0x20
-#define IOCTL_FAMILY_INSNTRACE      0x21  // ioctls for instruction tracing
-#define IOCTL_FAMILY_RAMDISK        0x22
-#define IOCTL_FAMILY_SDMMC          0x23
-#define IOCTL_FAMILY_WLAN           0x24
-#define IOCTL_FAMILY_PTY            0x25
-#define IOCTL_FAMILY_NETCONFIG      0x26
-#define IOCTL_FAMILY_ETHERTAP       0x27
-#define IOCTL_FAMILY_USB_PERIPHERAL 0x28
-#define IOCTL_FAMILY_USB_VIRT_BUS   0x29
-#define IOCTL_FAMILY_CPUPERF        0x2A
-#define IOCTL_FAMILY_POWER          0x30
-#define IOCTL_FAMILY_THERMAL        0x31
-#define IOCTL_FAMILY_CAMERA         0x32
-#define IOCTL_FAMILY_BT_HOST        0x33
-#define IOCTL_FAMILY_WLANPHY        0x34
-#define IOCTL_FAMILY_SERIAL         0x35
-#define IOCTL_FAMILY_WLANTAP        0x36
-#define IOCTL_FAMILY_DISPLAY_CONTROLLER 0x37
-#define IOCTL_FAMILY_DEBUG          0x38
-#define IOCTL_FAMILY_AUDIO_CODEC    0x39
-#define IOCTL_FAMILY_BACKLIGHT      0x3A
-#define IOCTL_FAMILY_NAND_TEST      0x3B
-#define IOCTL_FAMILY_TEE            0x3C
-#define IOCTL_FAMILY_SKIP_BLOCK     0x3D
-#define IOCTL_FAMILY_USB_TEST       0x3E
-#define IOCTL_FAMILY_CLK            0x3F
-// 0x40 unused.
-#define IOCTL_FAMILY_QMI            0x41
-
-// IOCTL constructor
-// --K-FFNN
-#define IOCTL(kind, family, number) \
-    ((((kind) & 0xF) << 20) | (((family) & 0xFF) << 8) | ((number) & 0xFF))
-
-// IOCTL accessors
-#define IOCTL_KIND(n) (((n) >> 20) & 0xF)
-#define IOCTL_FAMILY(n) (((n) >> 8) & 0xFF)
-#define IOCTL_NUMBER(n) ((n) & 0xFF)
diff --git a/arch/x64/sysroot/include/zircon/device/ramdisk.h b/arch/x64/sysroot/include/zircon/device/ramdisk.h
deleted file mode 100644
index dac72b9..0000000
--- a/arch/x64/sysroot/include/zircon/device/ramdisk.h
+++ /dev/null
@@ -1,83 +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.
-
-#pragma once
-
-#include <limits.h>
-#include <zircon/boot/image.h>
-#include <zircon/device/ioctl.h>
-#include <zircon/device/ioctl-wrapper.h>
-#include <zircon/types.h>
-
-#define IOCTL_RAMDISK_CONFIG \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 1)
-#define IOCTL_RAMDISK_CONFIG_VMO \
-    IOCTL(IOCTL_KIND_SET_HANDLE, IOCTL_FAMILY_RAMDISK, 4)
-#define IOCTL_RAMDISK_UNLINK \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 2)
-#define IOCTL_RAMDISK_SET_FLAGS \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 3)
-#define IOCTL_RAMDISK_WAKE_UP \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 4)
-#define IOCTL_RAMDISK_SLEEP_AFTER \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 5)
-#define IOCTL_RAMDISK_GET_BLK_COUNTS \
-    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_RAMDISK, 6)
-
-// Ramdisk-specific flags
-#define RAMDISK_FLAG_RESUME_ON_WAKE 0xFF000001
-
-typedef struct ramdisk_ioctl_config {
-    uint64_t blk_size;
-    uint64_t blk_count;
-    uint8_t type_guid[ZBI_PARTITION_GUID_LEN];
-} ramdisk_ioctl_config_t;
-
-typedef struct ramdisk_ioctl_config_response {
-    char name[NAME_MAX + 1];
-} ramdisk_ioctl_config_response_t;
-
-typedef struct ramdisk_blk_counts {
-    uint64_t received;
-    uint64_t successful;
-    uint64_t failed;
-} ramdisk_blk_counts_t;
-
-// ssize_t ioctl_ramdisk_config(int fd, const ramdisk_ioctl_config_t* in,
-//                              ramdisk_ioctl_config_response_t* out);
-IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config, IOCTL_RAMDISK_CONFIG, ramdisk_ioctl_config_t,
-                    ramdisk_ioctl_config_response_t);
-
-// ssize_t ioctl_ramdisk_config_vmo(int fd, const zx_handle_t* in,
-//                                  ramdisk_ioctl_config_response_t* out);
-IOCTL_WRAPPER_INOUT(ioctl_ramdisk_config_vmo, IOCTL_RAMDISK_CONFIG_VMO,
-                    zx_handle_t, ramdisk_ioctl_config_response_t);
-
-// ssize_t ioctl_ramdisk_unlink(int fd);
-IOCTL_WRAPPER(ioctl_ramdisk_unlink, IOCTL_RAMDISK_UNLINK);
-
-// ssize_t ioctl_ramdisk_set_flags(int fd, uint32_t* in);
-// The flags to set match block_info_t.flags. This is intended to simulate the behavior
-// of other block devices, so it should be used only for tests.
-IOCTL_WRAPPER_IN(ioctl_ramdisk_set_flags, IOCTL_RAMDISK_SET_FLAGS, uint32_t);
-
-// ssize_t ioctl_ramdisk_wake_up(int fd);
-// "Wakes" the ramdisk, if it was sleeping.
-// Transactions are no longer expected to fail after this point, and the ramdisk will not sleep
-// again until the next call to SLEEP_AFTER.
-// This will reset the current transaction count.
-IOCTL_WRAPPER(ioctl_ramdisk_wake_up, IOCTL_RAMDISK_WAKE_UP);
-
-// ssize_t ioctl_ramdisk_sleep_after(int fd, uint64_t* in);
-// Tell the ramdisk to "sleep" after |in| blocks have been written successfully.
-// After this point, all incoming transactions will fail.
-// This will reset the current block count.
-// NOTE! Use caution with RAMDISK_FLAG_RESUME_ON_WAKE set; sleeping with this flags will cause I/O
-// to block indefinitely until another call invokes |ioctl_ramdisk_wake_up|.
-IOCTL_WRAPPER_IN(ioctl_ramdisk_sleep_after, IOCTL_RAMDISK_SLEEP_AFTER, uint64_t);
-
-// ssize_t ioctl_ramdisk_get_blk_counts(int fd, ramdisk_blk_counts_t* out);
-// Retrieve the number of received, successful, and failed block writes since the last call to
-// sleep/wake.
-IOCTL_WRAPPER_OUT(ioctl_ramdisk_get_blk_counts, IOCTL_RAMDISK_GET_BLK_COUNTS, ramdisk_blk_counts_t);
diff --git a/arch/x64/sysroot/include/zircon/dlfcn.h b/arch/x64/sysroot/include/zircon/dlfcn.h
index af4a62b..f37e9be 100644
--- a/arch/x64/sysroot/include/zircon/dlfcn.h
+++ b/arch/x64/sysroot/include/zircon/dlfcn.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_DLFCN_H_
+#define SYSROOT_ZIRCON_DLFCN_H_
 
 #include <dlfcn.h>
 #include <zircon/compiler.h>
@@ -30,3 +31,5 @@
 zx_status_t dl_clone_loader_service(zx_handle_t* out);
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_DLFCN_H_
diff --git a/arch/x64/sysroot/include/zircon/driver/binding.h b/arch/x64/sysroot/include/zircon/driver/binding.h
deleted file mode 100644
index 7c05026..0000000
--- a/arch/x64/sysroot/include/zircon/driver/binding.h
+++ /dev/null
@@ -1,286 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <assert.h>
-#include <zircon/compiler.h>
-#include <stdalign.h>
-#include <stddef.h>
-#include <stdint.h>
-
-__BEGIN_CDECLS;
-
-// COAABBBB VVVVVVVV  Condition Opcode paramA paramB Value
-
-#define OP_ABORT  0x0 // if (cond) return no-match
-#define OP_MATCH  0x1 // if (cond) return match
-#define OP_GOTO   0x2 // if (cond) advance to next LABEL(paramA)
-#define OP_SET    0x3 // if (cond) flags |= paramA
-#define OP_CLEAR  0x4 // if (cond) flags &= (~paramA)
-#define OP_LABEL  0x5 // no-op, labels line with paramA
-
-#define COND_AL   0x0 // true
-#define COND_EQ   0x1 // bind(paramB) == Value
-#define COND_NE   0x2 // bind(paramB) != Value
-#define COND_GT   0x3 // bind(paramB) > Value
-#define COND_LT   0x4 // bind(paramB) < Value
-#define COND_GE   0x5 // bind(paramB) >= Value
-#define COND_LE   0x6 // bind(paramB) <= Value
-#define COND_MASK 0x7 // (bind(paramB) & Value) != 0
-#define COND_BITS 0x8 // (bind(paramB) & Value) == Value
-
-// branches are forward-only
-// branches always go to the first matching LABEL
-// branches that cannot find a matching LABEL are treated as ABORTs
-// there is an implied unconditional ABORT after the last instruction
-// flags are initially zero, may be set/cleared with SET/CLEAR
-// flags may be tested by comparison against BIND_FLAGS
-
-#define BINDINST(c,o,a,b,v) \
-    { (((c)&0xF)<<28)|(((o)&0xF)<<24)|(((a)&0xFF)<<16)|((b)&0xFFFF),(v) }
-
-#define BINDINST_CC(n) ((n) >> 28)
-#define BINDINST_OP(n) (((n) >> 24) & 0xF)
-#define BINDINST_PA(n) (((n) >> 16) & 0xFF)
-#define BINDINST_PB(n) ((n) & 0xFFFF)
-
-#define BI_ABORT()            BINDINST(COND_AL,OP_ABORT,0,0,0)
-#define BI_MATCH()            BINDINST(COND_AL,OP_MATCH,0,0,0)
-#define BI_GOTO(n)            BINDINST(COND_AL,OP_GOTO,n,0,0)
-#define BI_SET(f)             BINDINST(COND_AL,OP_SET,f,0,0)
-#define BI_CLEAR(f)           BINDINST(COND_AL,OP_CLEAR,f,0,0)
-#define BI_LABEL(n)           BINDINST(COND_AL,OP_LABEL,n,0,0)
-
-#define BI_ABORT_IF(c,b,v)    BINDINST(COND_##c,OP_ABORT,0,b,v)
-#define BI_MATCH_IF(c,b,v)    BINDINST(COND_##c,OP_MATCH,0,b,v)
-#define BI_GOTO_IF(c,b,v,n)   BINDINST(COND_##c,OP_GOTO,n,b,v)
-#define BI_SET_IF(c,b,v,f)    BINDINST(COND_##c,OP_SET,f,b,v)
-#define BI_CLEAR_IF(c,b,v,f)  BINDINST(COND_##c,OP_CLEAR,f,b,v)
-
-// for drivers that only want to be bound on user request
-#define BI_ABORT_IF_AUTOBIND  BI_ABORT_IF(NE, BIND_AUTOBIND, 0)
-
-// global binding variables at 0x00XX
-#define BIND_FLAGS            0x0000 // value of the flags register
-#define BIND_PROTOCOL         0x0001 // primary protcol of the device
-#define BIND_AUTOBIND         0x0002 // if this is an automated bind/load
-
-// pci binding variables at 0x01XX
-#define BIND_PCI_VID          0x0100
-#define BIND_PCI_DID          0x0101
-#define BIND_PCI_CLASS        0x0102
-#define BIND_PCI_SUBCLASS     0x0103
-#define BIND_PCI_INTERFACE    0x0104
-#define BIND_PCI_REVISION     0x0105
-#define BIND_PCI_BDF_ADDR     0x0106
-
-// pci binding variable utils
-#define BIND_PCI_BDF_PACK(bus, dev, func) \
-    ((((uint32_t)(bus)  & 0xFF) << 8) |   \
-     (((uint32_t)(dev)  & 0x1F) << 3) |   \
-      ((uint32_t)(func) & 0x07))
-
-#define BIND_PCI_BDF_UNPACK_BUS(bdf) (((uint32_t)(bdf) >> 8) & 0xFF)
-#define BIND_PCI_BDF_UNPACK_DEV(bdf) (((uint32_t)(bdf) >> 3) & 0x1F)
-#define BIND_PCI_BDF_UNPACK_FUNC(bdf) ((uint32_t)(bdf) & 0x07)
-
-// usb binding variables at 0x02XX
-// these are used for both ZX_PROTOCOL_USB and ZX_PROTOCOL_USB_FUNCTION
-#define BIND_USB_VID          0x0200
-#define BIND_USB_PID          0x0201
-#define BIND_USB_CLASS        0x0202
-#define BIND_USB_SUBCLASS     0x0203
-#define BIND_USB_PROTOCOL     0x0204
-
-// Platform bus binding variables at 0x03XX
-#define BIND_PLATFORM_DEV_VID 0x0300
-#define BIND_PLATFORM_DEV_PID 0x0301
-#define BIND_PLATFORM_DEV_DID 0x0302
-#define BIND_PLATFORM_PROTO   0x0303
-
-// ACPI binding variables at 0x04XX
-// The _HID is a 7- or 8-byte string. Because a bind property is 32-bit, use 2
-// properties to bind using the _HID. They are encoded in big endian order for
-// human readability. In the case of 7-byte _HID's, the 8th-byte shall be 0.
-#define BIND_ACPI_HID_0_3      0x0400 // char 0-3
-#define BIND_ACPI_HID_4_7      0x0401 // char 4-7
-// The _CID may be a valid HID value or a bus-specific string. The ACPI bus
-// driver only publishes those that are valid HID values.
-#define BIND_ACPI_CID_0_3      0x0402 // char 0-3
-#define BIND_ACPI_CID_4_7      0x0403 // char 4-7
-
-// Intel HDA Codec binding variables at 0x05XX
-#define BIND_IHDA_CODEC_VID         0x0500
-#define BIND_IHDA_CODEC_DID         0x0501
-#define BIND_IHDA_CODEC_MAJOR_REV   0x0502
-#define BIND_IHDA_CODEC_MINOR_REV   0x0503
-#define BIND_IHDA_CODEC_VENDOR_REV  0x0504
-#define BIND_IHDA_CODEC_VENDOR_STEP 0x0505
-
-// Serial binding variables at 0x06XX
-#define BIND_SERIAL_CLASS           0x0600
-#define BIND_SERIAL_VID             0x0601
-#define BIND_SERIAL_PID             0x0602
-
-// NAND binding variables at 0x07XX
-#define BIND_NAND_CLASS             0x0700
-
-// Bluetooth binding variables at 0x08XX
-#define BIND_BT_GATT_SVC_UUID16     0x0800
-// 128-bit UUID is split across 4 32-bit unsigned ints
-#define BIND_BT_GATT_SVC_UUID128_1     0x0801
-#define BIND_BT_GATT_SVC_UUID128_2     0x0802
-#define BIND_BT_GATT_SVC_UUID128_3     0x0803
-#define BIND_BT_GATT_SVC_UUID128_4     0x0804
-
-// SDIO binding variables at 0x09XX
-#define BIND_SDIO_VID             0x0900
-#define BIND_SDIO_PID             0x0901
-
-// I2C binding variables at 0x0AXX
-#define BIND_I2C_CLASS            0x0A00
-
-// TEMPORARY binding variables at 0xfXX
-// I2C_ADDR is a temporary way to bind the i2c touchscreen on the Acer12. This
-// binding will eventually be made via some sort of ACPI device enumeration.
-#define BIND_I2C_ADDR         0x0f00
-
-typedef struct zx_bind_inst {
-    uint32_t op;
-    uint32_t arg;
-} zx_bind_inst_t;
-
-typedef struct zx_device_prop {
-    uint16_t id;
-    uint16_t reserved;
-    uint32_t value;
-} zx_device_prop_t;
-
-// simple example
-#if 0
-zx_bind_inst_t i915_binding[] = {
-    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_PCI),
-    BI_ABORT_IF(NE, BIND_PCI_VID, 0x8086),
-    BI_MATCH_IF(EQ, BIND_PCI_DID, 0x1616), // broadwell
-    BI_MATCH_IF(EQ, BIND_PCI_DID, 0x1916), // skylake
-    BI_ABORT(),
-};
-#endif
-
-#define ZIRCON_NOTE_NAME "Zircon"
-#define ZIRCON_NOTE_DRIVER 0x31565244 // DRV1
-
-typedef struct {
-    // Elf64_Nhdr fields:
-    uint32_t namesz;
-    uint32_t descsz;
-    uint32_t type;
-    // ELF note name.  namesz is the exact size of the name (including '\0'),
-    // but the storage size is always rounded up to a multiple of 4 bytes.
-    char name[(sizeof(ZIRCON_NOTE_NAME) + 3) & -4];
-} zircon_driver_note_header_t;
-
-#define ZIRCON_DRIVER_NOTE_HEADER_INIT(object) {        \
-        /* .namesz = */ sizeof(ZIRCON_NOTE_NAME),              \
-        /* .descsz = */ (sizeof(object) -                       \
-                         sizeof(zircon_driver_note_header_t)), \
-        /* .type = */ ZIRCON_NOTE_DRIVER,                      \
-        /* .name = */ ZIRCON_NOTE_NAME,                        \
-    }
-
-typedef struct {
-    // See flag bits below.
-    uint32_t flags;
-
-    // Driver Metadata
-    uint32_t bindcount;
-    uint32_t reserved0;
-    char name[32];
-    char vendor[16];
-    char version[16];
-
-    // Driver Bind Program follows
-} zircon_driver_note_payload_t;
-
-// Flag bits in the driver note:
-
-// Driver is built with `-fsanitize=address` and can only be loaded into a
-// devhost that supports the ASan runtime.
-#define ZIRCON_DRIVER_NOTE_FLAG_ASAN (1u << 0)
-
-#define ZIRCON_DRIVER_NOTE_PAYLOAD_INIT(Driver,VendorName,Version,BindCount) \
-    {                                                               \
-        /* .flags = */ ZIRCON_DRIVER_NOTE_FLAGS,                    \
-        /* .bindcount = */ (BindCount),                             \
-        /* .reserved0 = */ 0,                                       \
-        /* .name = */ #Driver,                                      \
-        /* .vendor = */ VendorName,                                 \
-        /* .version = */ Version,                                   \
-    }
-
-#define ZIRCON_DRIVER_NOTE_FLAGS \
-    (__has_feature(address_sanitizer) ? ZIRCON_DRIVER_NOTE_FLAG_ASAN : 0)
-
-typedef struct {
-    zircon_driver_note_header_t header;
-    zircon_driver_note_payload_t payload;
-} zircon_driver_note_t;
-
-static_assert(offsetof(zircon_driver_note_t, payload) ==
-              sizeof(zircon_driver_note_header_t),
-              "alignment snafu?");
-
-// Without this, ASan will add redzone padding after the object, which
-// would make it invalid ELF note format.
-#if __has_feature(address_sanitizer)
-# define ZIRCON_DRIVER_NOTE_ASAN __attribute__((no_sanitize("address")))
-#else
-# define ZIRCON_DRIVER_NOTE_ASAN
-#endif
-
-// GCC has a quirk about how '__attribute__((visibility("default")))'
-// (__EXPORT here) works for const variables in C++.  The attribute has no
-// effect when used on the definition of a const variable, and GCC gives a
-// warning/error about that.  The attribute must appear on the "extern"
-// declaration of the variable instead.
-
-// We explicitly align the note to 4 bytes.  That's its natural alignment
-// anyway, but the compilers sometimes like to over-align as an
-// optimization while other tools sometimes like to complain if SHT_NOTE
-// sections are over-aligned (since this could result in padding being
-// inserted that makes it violate the ELF note format).  Standard C11
-// doesn't permit alignas(...) on a type but we could use __ALIGNED(4) on
-// all the types (i.e. GNU __attribute__ syntax instead of C11 syntax).
-// But the alignment of the types is not actually the issue: it's the
-// compiler deciding to over-align the individual object regardless of its
-// type's alignment, so we have to explicitly set the alignment of the
-// object to defeat any compiler default over-alignment.
-
-#define ZIRCON_DRIVER_BEGIN(Driver,Ops,VendorName,Version,BindCount) \
-zx_driver_rec_t __zircon_driver_rec__ __EXPORT = {\
-    /* .ops = */ &(Ops),\
-    /* .driver = */ NULL,\
-    /* .log_flags = */ 7, /* DDK_LOG_ERROR | DDK_LOG_WARN | DDK_LOG_INFO */\
-};\
-extern const struct zircon_driver_note __zircon_driver_note__ __EXPORT;\
-alignas(4) __SECTION(".note.zircon.driver." #Driver) ZIRCON_DRIVER_NOTE_ASAN \
-const struct zircon_driver_note {\
-    zircon_driver_note_t note;\
-    zx_bind_inst_t binding[BindCount];\
-} __zircon_driver_note__ = {\
-    /* .note = */{\
-        ZIRCON_DRIVER_NOTE_HEADER_INIT(__zircon_driver_note__),\
-        ZIRCON_DRIVER_NOTE_PAYLOAD_INIT(Driver,VendorName,Version,BindCount),\
-    },\
-    /* .binding = */ {
-
-#define ZIRCON_DRIVER_END(Driver) }};
-
-//TODO: if we moved the Ops from the BEGIN() to END() macro we
-//      could add a zircon_driver_note_t* to the zx_driver_rec_t,
-//      define it in END(), and have only one symbol to dlsym()
-//      when loading drivers
-
-__END_CDECLS;
diff --git a/arch/x64/sysroot/include/zircon/errors.h b/arch/x64/sysroot/include/zircon/errors.h
index 1c1ed80..390acfb 100644
--- a/arch/x64/sysroot/include/zircon/errors.h
+++ b/arch/x64/sysroot/include/zircon/errors.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_ERRORS_H_
+#define SYSROOT_ZIRCON_ERRORS_H_
 
 // Zircon statuses are signed 32 bit integers. The space of values is
 // divided as follows:
@@ -108,7 +109,6 @@
 // and should thus retry.
 #define ZX_ERR_UNAVAILABLE (-28)
 
-
 // ======= Permission check errors =======
 // ZX_ERR_ACCESS_DENIED: The caller did not have permission to perform
 // the specified operation.
@@ -229,3 +229,10 @@
 
 // ZX_ERR_CONNECTION_ABORTED: Connection was aborted.
 #define ZX_ERR_CONNECTION_ABORTED (-76)
+
+// ======= VDSO-private errors =======
+
+// ZX_ERR_INTERNAL_INTR_KILLED: A task was killed during an operation.
+#define ZX_ERR_INTERNAL_INTR_KILLED (-502)
+
+#endif  // SYSROOT_ZIRCON_ERRORS_H_
diff --git a/arch/x64/sysroot/include/zircon/exception.h b/arch/x64/sysroot/include/zircon/exception.h
new file mode 100644
index 0000000..bf3843b
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/exception.h
@@ -0,0 +1,19 @@
+// Copyright 2019 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.
+
+#pragma once
+
+#include <zircon/syscalls/exception.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+__EXPORT const char* _zx_exception_get_string(zx_excp_type_t exception);
+__EXPORT const char* zx_exception_get_string(zx_excp_type_t exception);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/arch/x64/sysroot/include/zircon/features.h b/arch/x64/sysroot/include/zircon/features.h
index a560007..d0c0720 100644
--- a/arch/x64/sysroot/include/zircon/features.h
+++ b/arch/x64/sysroot/include/zircon/features.h
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_FEATURES_H_
-#define ZIRCON_FEATURES_H_
+#ifndef SYSROOT_ZIRCON_FEATURES_H_
+#define SYSROOT_ZIRCON_FEATURES_H_
 
 // clang-format off
 
 // types of features that can be retrieved via |zx_system_get_features|
-#define ZX_FEATURE_KIND_CPU ((uint32_t)0)
+#define ZX_FEATURE_KIND_CPU                   ((uint32_t)0)
+#define ZX_FEATURE_KIND_HW_BREAKPOINT_COUNT   ((uint32_t)1)
+#define ZX_FEATURE_KIND_HW_WATCHPOINT_COUNT   ((uint32_t)2)
 
 // arch-independent CPU features
 #define ZX_HAS_CPU_FEATURES            ((uint32_t)(1u << 0))
@@ -35,6 +37,9 @@
 #define ZX_ARM64_FEATURE_ISA_SM4       ((uint32_t)(1u << 12))
 #define ZX_ARM64_FEATURE_ISA_DP        ((uint32_t)(1u << 13))
 #define ZX_ARM64_FEATURE_ISA_DPB       ((uint32_t)(1u << 14))
+#define ZX_ARM64_FEATURE_ISA_FHM       ((uint32_t)(1u << 15))
+#define ZX_ARM64_FEATURE_ISA_TS        ((uint32_t)(1u << 16))
+#define ZX_ARM64_FEATURE_ISA_RNDR      ((uint32_t)(1u << 17))
 
 #else
 
@@ -42,4 +47,4 @@
 
 #endif
 
-#endif // ZIRCON_FEATURES_H_
+#endif // SYSROOT_ZIRCON_FEATURES_H_
diff --git a/arch/x64/sysroot/include/zircon/fidl.h b/arch/x64/sysroot/include/zircon/fidl.h
index e971472..7388729 100644
--- a/arch/x64/sysroot/include/zircon/fidl.h
+++ b/arch/x64/sysroot/include/zircon/fidl.h
@@ -2,20 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_FIDL_H_
-#define ZIRCON_FIDL_H_
+#ifndef SYSROOT_ZIRCON_FIDL_H_
+#define SYSROOT_ZIRCON_FIDL_H_
 
-#include <assert.h>
-#include <stdalign.h>
-#include <stdint.h>
-
+#include <assert.h>    // NOLINT(modernize-deprecated-headers, foobar)
+#include <stdalign.h>  // NOLINT(modernize-deprecated-headers)
+#include <stdint.h>    // NOLINT(modernize-*)
 #include <zircon/compiler.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
 // Fidl data types have a representation in a wire format. This wire
-// format is shared by all language bindings, including C11 and C++14.
+// format is shared by all language bindings, including C11 and C++.
 //
 // The C bindings also define a representation of fidl data types. For
 // a given type, the size and alignment of all parts of the type agree
@@ -55,12 +54,21 @@
 #define FIDL_ALLOC_ABSENT ((uintptr_t)0)
 
 // Out of line allocations are all 8 byte aligned.
+// TODO(fxbug.dev/42792): Remove either this FIDL_ALIGN macro or the FidlAlign function in
+// fidl/internal.h.
 #define FIDL_ALIGNMENT ((size_t)8)
-#define FIDL_ALIGN(a) (((a) + 7) & ~7)
+#define FIDL_ALIGN(a) (((a) + 7u) & ~7u)
 #define FIDL_ALIGNDECL alignas(FIDL_ALIGNMENT)
 
-// An opaque struct representing the encoding of a particular fidl
-// type.
+// The maximum depth of out-of-line objects in the wire format.
+// 0 is the initial depth, 1 is the first out of line object, etc.
+// Tables count as two depth levels because the vector body and the
+// table elements are both out of line.
+#define FIDL_MAX_DEPTH 32
+
+// An opaque struct containing metadata for encoding a particular fidl
+// type. The actual length of the struct is different depending on the
+// kind of fidl type it is describing.
 typedef struct fidl_type fidl_type_t;
 
 // Primitive types.
@@ -119,11 +127,11 @@
 // but is checked as part of validation.
 
 typedef struct fidl_string {
-    // Number of UTF-8 code units (bytes), must be 0 if |data| is null.
-    uint64_t size;
+  // Number of UTF-8 code units (bytes), must be 0 if |data| is null.
+  uint64_t size;
 
-    // Pointer to UTF-8 code units (bytes) or null
-    char* data;
+  // Pointer to UTF-8 code units (bytes) or null
+  char* data;
 } fidl_string_t;
 
 // When encoded, an absent nullable string is represented as a
@@ -169,11 +177,11 @@
 // but is checked as part of validation.
 
 typedef struct fidl_vector {
-    // Number of elements, must be 0 if |data| is null.
-    uint64_t count;
+  // Number of elements, must be 0 if |data| is null.
+  uint64_t count;
 
-    // Pointer to element data or null.
-    void* data;
+  // Pointer to element data or null.
+  void* data;
 } fidl_vector_t;
 
 // When encoded, an absent nullable vector is represented as a
@@ -193,6 +201,42 @@
 // vector<T>:N   fidl_vector_t  A vector of T, up to N elements.
 // vector<T>:N?  fidl_vector_t  An optional vector of T,  up to N elements.
 
+// Envelope.
+
+// An efficient way to encapsulate uninterpreted FIDL messages.
+// - Stores a variable size uninterpreted payload out-of-line.
+// - Payload may contain an arbitrary number of bytes and handles.
+// - Allows for encapsulation of one FIDL message inside of another.
+// - Building block for extensible structures such as tables & extensible
+//   unions.
+
+// When encoded for transfer, |data| indicates presence of content:
+// - FIDL_ALLOC_ABSENT : envelope is null
+// - FIDL_ALLOC_PRESENT : envelope is non-null, |data| is the next out-of-line object
+// When decoded for consumption, |data| is a pointer to content.
+// - nullptr : envelope is null
+// - <valid pointer> : envelope is non-null, |data| is at indicated memory address
+
+typedef struct {
+  // The size of the entire envelope contents, including any additional
+  // out-of-line objects that the envelope may contain. For example, a
+  // vector<string>'s num_bytes for ["hello", "world"] would include the
+  // string contents in the size, not just the outer vector. Always a multiple
+  // of 8; must be zero if envelope is null.
+  uint32_t num_bytes;
+
+  // The number of handles in the envelope, including any additional
+  // out-of-line objects that the envelope contains. Must be zero if envelope is null.
+  uint32_t num_handles;
+
+  // A pointer to the out-of-line envelope data in decoded form, or
+  // FIDL_ALLOC_(ABSENT|PRESENT) in encoded form.
+  union {
+    void* data;
+    uintptr_t presence;
+  };
+} fidl_envelope_t;
+
 // Handle types.
 
 // Handle types are encoded directly. Just like primitive types, there
@@ -278,16 +322,53 @@
 //                                                   union_foo, or else
 //                                                   FIDL_ALLOC_ABSENT.
 
+// Tables.
+
+// Tables are 'flexible structs', where all members are optional, and new
+// members can be added, or old members removed while preserving ABI
+// compatibility. Each table member is referenced by ordinal, sequentially
+// assigned from 1 onward, with no gaps. Each member content is stored
+// out-of-line in an envelope, and a table is simply a vector of these envelopes
+// with the requirement that the last envelope must be present in order
+// to guarantee a canonical representation.
+
+typedef struct {
+  fidl_vector_t envelopes;
+} fidl_table_t;
+
+// Extensible unions.
+
+// Extensible unions, or "xunions" (colloquially pronounced "zoo-nions") are
+// similar to unions, except that storage for union members are out-of-line
+// rather than inline. This enables union members to be added and removed while
+// preserving ABI compatibility with the existing xunion definition.
+
+typedef uint64_t fidl_xunion_tag_t;
+
+enum {
+  kFidlXUnionEmptyTag = 0,  // The tag representing an empty xunion.
+};
+
+typedef struct {
+  fidl_xunion_tag_t tag;
+  fidl_envelope_t envelope;
+} fidl_xunion_t;
+
 // Messages.
 
 // All fidl messages share a common 16 byte header.
 
+enum {
+  kFidlWireFormatMagicNumberInitial = 1,
+};
+
 typedef struct fidl_message_header {
-    zx_txid_t txid;
-    // This reserved word is used by Epitaphs to represent an error value.
-    uint32_t reserved0;
-    uint32_t flags;
-    uint32_t ordinal;
+  zx_txid_t txid;
+  uint8_t flags[3];
+  // This value indicates the message's wire format. Two sides with different
+  // wire formats are incompatible with each other
+  uint8_t magic_number;
+  uint64_t ordinal;
 } fidl_message_header_t;
 
 // Messages which do not have a response use zero as a special
@@ -295,46 +376,65 @@
 
 #define FIDL_TXID_NO_RESPONSE 0ul
 
-// The system reserves the high half of the ordinal space.
+// An outgoing FIDL message.
+typedef struct fidl_outgoing_msg {
+  // The bytes of the message.
+  //
+  // The bytes of the message might be in the encoded or decoded form.
+  // Functions that take a |fidl_outgoing_msg_t| as an argument should document whether
+  // the expect encoded or decoded messages.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  void* bytes;
 
-#define FIDL_ORD_SYSTEM_MASK 0x80000000ul
+  // The handles of the message.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  zx_handle_t* handles;
 
-// A FIDL message.
-typedef struct fidl_msg {
-    // The bytes of the message.
-    //
-    // The bytes of the message might be in the encoded or decoded form.
-    // Functions that take a |fidl_msg_t| as an argument should document whether
-    // the expect encoded or decoded messages.
-    //
-    // See |num_bytes| for the number of bytes in the message.
-    void* bytes;
+  // The number of bytes in |bytes|.
+  uint32_t num_bytes;
 
-    // The handles of the message.
-    //
-    // See |num_bytes| for the number of bytes in the message.
-    zx_handle_t* handles;
+  // The number of handles in |handles|.
+  uint32_t num_handles;
+} fidl_outgoing_msg_t;
 
-    // The number of bytes in |bytes|.
-    uint32_t num_bytes;
+// An incoming FIDL message.
+typedef struct fidl_incoming_msg {
+  // The bytes of the message.
+  //
+  // The bytes of the message might be in the encoded or decoded form.
+  // Functions that take a |fidl_incoming_msg_t| as an argument should document whether
+  // the expect encoded or decoded messages.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  void* bytes;
 
-    // The number of handles in |handles|.
-    uint32_t num_handles;
-} fidl_msg_t;
+  // The handles of the message.
+  //
+  // See |num_bytes| for the number of bytes in the message.
+  zx_handle_t* handles;
+
+  // The number of bytes in |bytes|.
+  uint32_t num_bytes;
+
+  // The number of handles in |handles|.
+  uint32_t num_handles;
+} fidl_incoming_msg_t;
 
 // An outstanding FIDL transaction.
 typedef struct fidl_txn fidl_txn_t;
 struct fidl_txn {
-    // Replies to the outstanding request and complete the FIDL transaction.
-    //
-    // Pass the |fidl_txn_t| object itself as the first parameter. The |msg|
-    // should already be encoded. This function always consumes any handles
-    // present in |msg|.
-    //
-    // Call |reply| only once for each |txn| object. After |reply| returns, the
-    // |txn| object is considered invalid and might have been freed or reused
-    // for another purpose.
-    zx_status_t (*reply)(fidl_txn_t* txn, const fidl_msg_t* msg);
+  // Replies to the outstanding request and complete the FIDL transaction.
+  //
+  // Pass the |fidl_txn_t| object itself as the first parameter. The |msg|
+  // should already be encoded. This function always consumes any handles
+  // present in |msg|.
+  //
+  // Call |reply| only once for each |txn| object. After |reply| returns, the
+  // |txn| object is considered invalid and might have been freed or reused
+  // for another purpose.
+  zx_status_t (*reply)(fidl_txn_t* txn, const fidl_outgoing_msg_t* msg);
 };
 
 // An epitaph is a message that a server sends just prior to closing the
@@ -342,17 +442,22 @@
 // Epitaphs are defined in the FIDL wire format specification.  Once sent down
 // the wire, the channel should be closed.
 typedef struct fidl_epitaph {
-    FIDL_ALIGNDECL
+  FIDL_ALIGNDECL
 
-    // The error associated with this epitaph is stored in the reserved word of
-    // the message header.  System errors must be constants of type zx_status_t,
-    // which are all negative.  Positive numbers should be used for application
-    // errors.  A value of ZX_OK indicates no error.
-    fidl_message_header_t hdr;
+  // The method ordinal for all epitaphs must be kFidlOrdinalEpitaph
+  fidl_message_header_t hdr;
+
+  // The error associated with this epitaph is stored as a struct{int32} in
+  // the message payload. System errors must be constants of type zx_status_t,
+  // which are all negative. Positive numbers should be used for application
+  // errors. A value of ZX_OK indicates no error.
+  zx_status_t error;
 } fidl_epitaph_t;
 
 // This ordinal value is reserved for Epitaphs.
-#define FIDL_EPITAPH_ORDINAL 0xFFFFFFFF
+enum {
+  kFidlOrdinalEpitaph = 0xFFFFFFFFFFFFFFFF,
+};
 
 // Assumptions.
 
@@ -374,4 +479,4 @@
 
 __END_CDECLS
 
-#endif // ZIRCON_FIDL_H_
+#endif  // SYSROOT_ZIRCON_FIDL_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/debug/arm64.h b/arch/x64/sysroot/include/zircon/hw/debug/arm64.h
new file mode 100644
index 0000000..b0b6ea3
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/debug/arm64.h
@@ -0,0 +1,278 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
+#define SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
+
+#include <stdint.h>
+
+// ARM64 Hardware Debug Resources
+// =================================================================================================
+
+// Hardware Breakpoints ----------------------------------------------------------------------------
+//
+// Hardware breakpoints permits to stop a thread when it executes an address setup in one of the
+// hw breakpoints registers. They will work independent whether the address in question is
+// read-only or not.
+
+// ARMv8 assures at least 2 hardware breakpoints.
+#define ARM64_MIN_HW_BREAKPOINTS 2
+#define ARM64_MAX_HW_BREAKPOINTS 16
+
+// Access macros:
+// All the relevant register fields are exposed through macros.
+// For convenience of use, use the get/set macros:
+//
+// uint64_t ARM64_<REG>_<FIELD>_GET(uint64_t reg)
+// void ARM64_<REG>_<FIELD>_SET(uint64_t* reg, uint64_t value)
+//
+// Examples:
+// uint64_t bas = ARM64_DBGBCR_BAS_GET(dbgbcr);
+// ARM64_DBGBCR_BAS_SET(&dbgbcr, modified_bas);
+
+// DBGBCR<n>: Debug Control Register for HW Breakpoint #n.
+//
+// Control register for HW breakpoints. There is one foreach HW breakpoint present within the
+// system. They go numbering by DBGBCR0, DBGBCR1, ... until the value defined in ID_AADFR0_EL1.
+//
+// For each control register, there is an equivalent DBGBVR<n> that holds the address the thread
+// will compare against.
+
+// The following fields are accepted by the user. All other fields are ignored (masked).
+//
+// - E
+
+// This mask is applied when to DBGBCR. Any set values on those fields will be overwritten.
+//
+// - PMC = 0b10
+// - BAS = 0b1111
+// - HMC = 0
+// - SSC = 0
+// - LBN = 0
+// - BT  = 0
+
+// Enable/disable the breakpoint.
+#define ARM64_DBGBCR_E 1lu  // Bit 0
+#define ARM64_DBGBCR_E_SHIFT 0u
+#define ARM64_DBGBCR_E_MASK (ARM64_DBGBCR_E << ARM64_DBGBCR_E_SHIFT)
+#define ARM64_DBGBCR_E_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_E_MASK, ARM64_DBGBCR_E_SHIFT)
+#define ARM64_DBGBCR_E_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_E_MASK, \
+                                          ARM64_DBGBCR_E_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_PMC 0b11lu  // Bits 1-2.
+#define ARM64_DBGBCR_PMC_SHIFT 1u
+#define ARM64_DBGBCR_PMC_MASK (ARM64_DBGBCR_PMC << ARM64_DBGBCR_PMC_SHIFT)
+#define ARM64_DBGBCR_PMC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_PMC_MASK, ARM64_DBGBCR_PMC_SHIFT)
+#define ARM64_DBGBCR_PMC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_PMC_MASK, \
+                                          ARM64_DBGBCR_PMC_SHIFT)
+
+// Byte Address Select. Defines which half-words triggers the breakpoint.
+// In AArch64 implementations (which zircon targets), is res1.
+#define ARM64_DBGBCR_BAS 0b1111lu  // Bits 5-8.
+#define ARM64_DBGBCR_BAS_SHIFT 5u
+#define ARM64_DBGBCR_BAS_MASK (ARM64_DBGBCR_BAS << ARM64_DBGBCR_BAS_SHIFT)
+#define ARM64_DBGBCR_BAS_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_BAS_MASK, ARM64_DBGBCR_BAS_SHIFT)
+#define ARM64_DBGBCR_BAS_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_BAS_MASK, \
+                                          ARM64_DBGBCR_BAS_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_HMC 0b1lu  // Bit 13.
+#define ARM64_DBGBCR_HMC_SHIFT 13u
+#define ARM64_DBGBCR_HMC_MASK (ARM64_DBGBCR_HMC << ARM64_DBGBCR_HMC_SHIFT)
+#define ARM64_DBGBCR_HMC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_HMC_MASK, ARM64_DBGBCR_HMC_SHIFT)
+#define ARM64_DBGBCR_HMC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_HMC_MASK, \
+                                          ARM64_DBGBCR_HMC_SHIFT)
+
+// PMC, HMC, SSC define the environment where the breakpoint will trigger.
+#define ARM64_DBGBCR_SSC 0b11lu  // Bits 14-15.
+#define ARM64_DBGBCR_SSC_SHIFT 14u
+#define ARM64_DBGBCR_SSC_MASK (ARM64_DBGBCR_SSC << ARM64_DBGBCR_SSC_SHIFT)
+#define ARM64_DBGBCR_SSC_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_SSC_MASK, ARM64_DBGBCR_SSC_SHIFT)
+#define ARM64_DBGBCR_SSC_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_SSC_MASK, \
+                                          ARM64_DBGBCR_SSC_SHIFT)
+
+// Linked Breakpoint Number. Zircon doesn't use this feature. Always zero.
+#define ARM64_DBGBCR_LBN 0b1111lu  // Bits 16-19.
+#define ARM64_DBGBCR_LBN_SHIFT 16u
+#define ARM64_DBGBCR_LBN_MASK (ARM64_DBGBCR_LBN << ARM64_DBGBCR_LBN_SHIFT)
+#define ARM64_DBGBCR_LBN_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_LBN_MASK, ARM64_DBGBCR_LBN_SHIFT)
+#define ARM64_DBGBCR_LBN_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_LBN_MASK, \
+                                          ARM64_DBGBCR_LBN_SHIFT)
+
+// Breakpoint Type. Zircon only uses unlinked address match (zero).
+#define ARM64_DBGBCR_BT 0b1111lu  // Bits 20-23.
+#define ARM64_DBGBCR_BT_SHIFT 20u
+#define ARM64_DBGBCR_BT_MASK (ARM64_DBGBCR_BT << ARM64_DBGBCR_BT_SHIFT)
+#define ARM64_DBGBCR_BT_GET(dbgbcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgbcr), ARM64_DBGBCR_BT_MASK, ARM64_DBGBCR_BT_SHIFT)
+#define ARM64_DBGBCR_BT_SET(dbgbcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgbcr), (value), ARM64_DBGBCR_BT_MASK, \
+                                          ARM64_DBGBCR_BT_SHIFT)
+
+// Watchpoints ------------------------------------------------------------------------------------
+
+// Watchpoints permits to stop a thread when it read/writes to a particular address in memory.
+// This will work even if the address is read-only memory (for a read, of course).
+
+// ARMv8 assures at least 2 watchpoints.
+#define ARM64_MIN_HW_WATCHPOINTS 2
+#define ARM64_MAX_HW_WATCHPOINTS 16
+
+// DBGWCR<n>: Watchpoint Control Register.
+//
+// Control register for watchpoints. There is one for each watchpoint present within the system.
+// They go numbering by DBGWCR0, DBGWCR1, ... until the value defined ID_AAFR0_EL1.
+// For each control register, there is an equivalent DBGWCR<n> that holds the address the thread
+// will compare against. How this address is interpreted depends upon the configuration of the
+// associated control register.
+
+// The following fields are accepted by the user. All other fields are ignored (masked).
+//
+// - E
+// - BAS
+// - TODO(donosoc): Expose LSC.
+
+// This mask is applied when to DBGWCR. Any set values on those fields will be overwritten.
+//
+// - PAC = 0b10
+// - LSC = 0b10: Write watchpoint. TODO(donosoc): Expose to users so they can define it.
+// - HMC = 0
+// - SSC = 0b01
+// - LBN = 0
+// - WT  = 0
+
+// Enable/disable the watchpoint.
+#define ARM64_DBGWCR_E 1lu  // Bit 1.
+#define ARM64_DBGWCR_E_SHIFT 0u
+#define ARM64_DBGWCR_E_MASK (ARM64_DBGWCR_E << ARM64_DBGWCR_E_SHIFT)
+#define ARM64_DBGWCR_E_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_E_MASK, ARM64_DBGWCR_E_SHIFT)
+#define ARM64_DBGWCR_E_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_E_MASK, \
+                                          ARM64_DBGWCR_E_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_PAC 0b11lu  // Bits 1-2.
+#define ARM64_DBGWCR_PAC_SHIFT 1u
+#define ARM64_DBGWCR_PAC_MASK (ARM64_DBGWCR_PAC << ARM64_DBGWCR_PAC_SHIFT)
+#define ARM64_DBGWCR_PAC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_PAC_MASK, ARM64_DBGWCR_PAC_SHIFT)
+#define ARM64_DBGWCR_PAC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_PAC_MASK, \
+                                          ARM64_DBGWCR_PAC_SHIFT)
+
+// Load/Store Control.
+//
+// On what event the watchpoint trigger:
+// 01: Read from address.
+// 10: Write to address.
+// 11: Read/Write to address.
+#define ARM64_DBGWCR_LSC 0b11lu  // Bits 3-4.
+#define ARM64_DBGWCR_LSC_SHIFT 3u
+#define ARM64_DBGWCR_LSC_MASK (ARM64_DBGWCR_LSC << ARM64_DBGWCR_LSC_SHIFT)
+#define ARM64_DBGWCR_LSC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_LSC_MASK, ARM64_DBGWCR_LSC_SHIFT)
+#define ARM64_DBGWCR_LSC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_LSC_MASK, \
+                                          ARM64_DBGWCR_LSC_SHIFT)
+
+// Byte Address Select.
+//
+// Each bit defines what bytes to match onto:
+// 0bxxxx'xxx1: Match DBGWVR<n> + 0
+// 0bxxxx'xx1x: Match DBGWVR<n> + 1
+// 0bxxxx'x1xx: Match DBGWVR<n> + 2
+// 0bxxxx'1xxx: Match DBGWVR<n> + 3
+// 0bxxx1'xxxx: Match DBGWVR<n> + 4
+// 0bxx1x'xxxx: Match DBGWVR<n> + 5
+// 0bx1xx'xxxx: Match DBGWVR<n> + 6
+// 0b1xxx'xxxx: Match DBGWVR<n> + 7
+#define ARM64_DBGWCR_BAS 0b11111111lu  // Bits 5-12.
+#define ARM64_DBGWCR_BAS_SHIFT 5u
+#define ARM64_DBGWCR_BAS_MASK (ARM64_DBGWCR_BAS << ARM64_DBGWCR_BAS_SHIFT)
+#define ARM64_DBGWCR_BAS_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_BAS_MASK, ARM64_DBGWCR_BAS_SHIFT)
+#define ARM64_DBGWCR_BAS_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_BAS_MASK, \
+                                          ARM64_DBGWCR_BAS_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_HMC 1lu  // Bit 13.
+#define ARM64_DBGWCR_HMC_SHIFT 13u
+#define ARM64_DBGWCR_HMC_MASK (ARM64_DBGWCR_HMC << ARM64_DBGWCR_HMC_SHIFT)
+#define ARM64_DBGWCR_HMC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_HMC_MASK, ARM64_DBGWCR_HMC_SHIFT)
+#define ARM64_DBGWCR_HMC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_HMC_MASK, \
+                                          ARM64_DBGWCR_HMC_SHIFT)
+
+// PAC, SSC, HMC define the environment where the watchpoint will trigger.
+#define ARM64_DBGWCR_SSC 0b11lu  // Bits 14-15.
+#define ARM64_DBGWCR_SSC_SHIFT 14u
+#define ARM64_DBGWCR_SSC_MASK (ARM64_DBGWCR_SSC << ARM64_DBGWCR_SSC_SHIFT)
+#define ARM64_DBGWCR_SSC_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_SSC_MASK, ARM64_DBGWCR_SSC_SHIFT)
+#define ARM64_DBGWCR_SSC_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_SSC_MASK, \
+                                          ARM64_DBGWCR_SSC_SHIFT)
+
+// Linked Breakpoint Number. Zircon doesn't use this feature. Always zero.
+#define ARM64_DBGWCR_LBN 0b1111lu  // Bits 16-19.
+#define ARM64_DBGWCR_LBN_SHIFT 16u
+#define ARM64_DBGWCR_LBN_MASK (ARM64_DBGWCR_LBN << ARM64_DBGWCR_LBN_SHIFT)
+#define ARM64_DBGWCR_LBN_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_LBN_MASK, ARM64_DBGWCR_LBN_SHIFT)
+#define ARM64_DBGWCR_LBN_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_LBN_MASK, \
+                                          ARM64_DBGWCR_LBN_SHIFT)
+
+// Watchpoint Type. Zircon always use unlinked (0).
+#define ARM64_DBGWCR_WT 1lu  // Bit 20.
+#define ARM64_DBGWCR_WT_SHIFT 20u
+#define ARM64_DBGWCR_WT_MASK (ARM64_DBGWCR_WT << ARM64_DBGWCR_WT_SHIFT)
+#define ARM64_DBGWCR_WT_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_WT_MASK, ARM64_DBGWCR_WT_SHIFT)
+#define ARM64_DBGWCR_WT_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_WT_MASK, \
+                                          ARM64_DBGWCR_WT_SHIFT)
+
+// Mask. How many address bits to mask.
+// This permits the watchpoint to track up to 2G worth of addresses.
+// TODO(donosoc): Initially the debugger is going for parity with x64, which only permits 8 bytes.
+//                Eventually expose the ability to track bigger ranges.
+#define ARM64_DBGWCR_MSK 0b11111lu  // Bits 24-28.
+#define ARM64_DBGWCR_MSK_SHIFT 24u
+#define ARM64_DBGWCR_MSK_MASK (ARM64_DBGWCR_MSK << ARM64_DBGWCR_MSK_SHIFT)
+#define ARM64_DBGWCR_MSK_GET(dbgwcr) \
+  __arm64_internal_hw_debug_get_reg_value((dbgwcr), ARM64_DBGWCR_MSK_MASK, ARM64_DBGWCR_MSK_SHIFT)
+#define ARM64_DBGWCR_MSK_SET(dbgwcr, value)                                         \
+  __arm64_internal_hw_debug_set_reg_value((dbgwcr), (value), ARM64_DBGWCR_MSK_MASK, \
+                                          ARM64_DBGWCR_MSK_SHIFT)
+
+// Helper functions ================================================================================
+
+inline uint32_t __arm64_internal_hw_debug_get_reg_value(uint32_t reg, uint32_t mask,
+                                                        uint32_t shift) {
+  return (reg & mask) >> shift;
+}
+
+inline void __arm64_internal_hw_debug_set_reg_value(uint32_t* reg, uint32_t value, uint32_t mask,
+                                                    uint32_t shift) {
+  *reg &= ~mask;
+  *reg |= (value << shift) & mask;
+}
+
+#endif  // SYSROOT_ZIRCON_HW_DEBUG_ARM64_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/debug/x86.h b/arch/x64/sysroot/include/zircon/hw/debug/x86.h
new file mode 100644
index 0000000..413b63a
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/debug/x86.h
@@ -0,0 +1,421 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_HW_DEBUG_X86_H_
+#define SYSROOT_ZIRCON_HW_DEBUG_X86_H_
+
+#include <stdint.h>
+
+// x86/x64 Hardware Debug Resources
+// =================================================================================================
+
+// Hardware Breakpoints ----------------------------------------------------------------------------
+//
+// Hardware breakpoints permits to stop a thread when it executes an address setup in one of the
+// hw breakpoints registers. They will work independent whether the address in question is
+// read-only or not.
+
+// Access macros:
+// All the relevant register fields are exposed through macros.
+// For convenience of use, use the get/set macros:
+//
+// uint64_t X86_<REG>_<FIELD>_GET(uint64_t reg)
+// void X86_<REG>_<FIELD>_SET(uint64_t* reg, uint64_t value)
+//
+// Examples:
+// uint64_t rw0 = X86_DBG_CONTROL_RW0_GET(dr7);
+// X86_DBG_CONTROL_RW0_SET(&dr7, modified_rw0);
+
+// DR6: Debug Status Register.
+//
+// This register is updated when the CPU encounters a #DB harware exception. This registers permits
+// users to interpret the result of an exception, such as if it was a single-step, hardware
+// breakpoint, etc.
+//
+// No bit is writeable from userspace. All values will be ignored.
+
+// Whether the address-breakpoint register 0 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B0 1ul
+#define X86_DBG_STATUS_B0_SHIFT 0
+#define X86_DBG_STATUS_B0_MASK (X86_DBG_STATUS_B0 << X86_DBG_STATUS_B0_SHIFT)
+#define X86_DBG_STATUS_B0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B0_MASK, X86_DBG_STATUS_B0_SHIFT)
+#define X86_DBG_STATUS_B0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B0_MASK, \
+                                        X86_DBG_STATUS_B0_SHIFT)
+
+// Whether the address-breakpoint register 1 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B1 1ul
+#define X86_DBG_STATUS_B1_SHIFT 1
+#define X86_DBG_STATUS_B1_MASK (X86_DBG_STATUS_B1 << X86_DBG_STATUS_B1_SHIFT)
+#define X86_DBG_STATUS_B1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B1_MASK, X86_DBG_STATUS_B1_SHIFT)
+#define X86_DBG_STATUS_B1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B1_MASK, \
+                                        X86_DBG_STATUS_B1_SHIFT)
+
+// Whether the address-breakpoint register 2 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B2 1ul
+#define X86_DBG_STATUS_B2_SHIFT 2
+#define X86_DBG_STATUS_B2_MASK (X86_DBG_STATUS_B2 << X86_DBG_STATUS_B2_SHIFT)
+#define X86_DBG_STATUS_B2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B2_MASK, X86_DBG_STATUS_B2_SHIFT)
+#define X86_DBG_STATUS_B2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B2_MASK, \
+                                        X86_DBG_STATUS_B2_SHIFT)
+
+// Whether the address-breakpoint register 3 detects an enabled breakpoint condition, as specified
+// by the DR7 register. It is cleared to 0 otherwise.
+#define X86_DBG_STATUS_B3 1ul
+#define X86_DBG_STATUS_B3_SHIFT 3
+#define X86_DBG_STATUS_B3_MASK (X86_DBG_STATUS_B3 << X86_DBG_STATUS_B3_SHIFT)
+#define X86_DBG_STATUS_B3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_B3_MASK, X86_DBG_STATUS_B3_SHIFT)
+#define X86_DBG_STATUS_B3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_B3_MASK, \
+                                        X86_DBG_STATUS_B3_SHIFT)
+
+// Whether there were any software accesses to any debug register (DR0, DR7) while the
+// general-detect condition was enabled in DR7.
+#define X86_DBG_STATUS_BD 1ul
+#define X86_DBG_STATUS_BD_SHIFT 13
+#define X86_DBG_STATUS_BD_MASK (X86_DBG_STATUS_BD << X86_DBG_STATUS_BD_SHIFT)
+#define X86_DBG_STATUS_BD_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BD_MASK, X86_DBG_STATUS_BD_SHIFT)
+#define X86_DBG_STATUS_BD_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BD_MASK, \
+                                        X86_DBG_STATUS_BD_SHIFT)
+
+// Set to 1 whether the #DB exception occurs as a result of a single-step exception. Single step
+// has the highest priority among debug exceptions. Other status bits can be set within the DR6
+// register among this bit, so callers should also check for those.
+#define X86_DBG_STATUS_BS 1ul
+#define X86_DBG_STATUS_BS_SHIFT 14
+#define X86_DBG_STATUS_BS_MASK (X86_DBG_STATUS_BS << X86_DBG_STATUS_BS_SHIFT)
+#define X86_DBG_STATUS_BS_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BS_MASK, X86_DBG_STATUS_BS_SHIFT)
+#define X86_DBG_STATUS_BS_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BS_MASK, \
+                                        X86_DBG_STATUS_BS_SHIFT)
+
+// Set to 1 when the exception occurred as a result of a intel task switch to another intel task
+// with a TSS T-bit set to 1. This is not used by zircon.
+#define X86_DBG_STATUS_BT 1ul
+#define X86_DBG_STATUS_BT_SHIFT 15
+#define X86_DBG_STATUS_BT_MASK (X86_DBG_STATUS_BT << X86_DBG_STATUS_BT_SHIFT)
+#define X86_DBG_STATUS_BT_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_STATUS_BT_MASK, X86_DBG_STATUS_BT_SHIFT)
+#define X86_DBG_STATUS_BT_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_STATUS_BT_MASK, \
+                                        X86_DBG_STATUS_BT_SHIFT)
+
+// DR7: Debug Control Register.
+//
+// This register is used to establish the breakpoint conditions for the address breakpoint registers
+// (DR0-DR3) and to enable debug exceptions for each of them individually. DR7 is also used to
+// enable general-detect breakpoint condition (not permitted by zircon).
+//
+// The following fields are accepted by the user. All other fields are ignored (masked):
+//
+// - L0, L1, L2, L3
+// - LEN0, LEN1, LEN2, LEN3
+// - RW0, RW1, RW2, RW3
+
+// Local Breakpoint Enable 0.
+// Enables debug exceptions to occur when the corresponding address register (DR0) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L0 1ul
+#define X86_DBG_CONTROL_L0_SHIFT 0
+#define X86_DBG_CONTROL_L0_MASK (X86_DBG_CONTROL_L0 << X86_DBG_CONTROL_L0_SHIFT)
+#define X86_DBG_CONTROL_L0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L0_MASK, X86_DBG_CONTROL_L0_SHIFT)
+#define X86_DBG_CONTROL_L0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L0_MASK, \
+                                        X86_DBG_CONTROL_L0_SHIFT)
+
+// Global Breakpoint Enable 0.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR0) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G0 1ul
+#define X86_DBG_CONTROL_G0_SHIFT 1
+#define X86_DBG_CONTROL_G0_MASK (X86_DBG_CONTROL_G0 << X86_DBG_CONTROL_G0_SHIFT)
+#define X86_DBG_CONTROL_G0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G0_MASK, X86_DBG_CONTROL_G0_SHIFT)
+#define X86_DBG_CONTROL_G0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G0_MASK, \
+                                        X86_DBG_CONTROL_G0_SHIFT)
+
+// Local Breakpoint Enable 1.
+// Enables debug exceptions to occur when the corresponding address register (DR1) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L1 1ul
+#define X86_DBG_CONTROL_L1_SHIFT 2
+#define X86_DBG_CONTROL_L1_MASK (X86_DBG_CONTROL_L1 << X86_DBG_CONTROL_L1_SHIFT)
+#define X86_DBG_CONTROL_L1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L1_MASK, X86_DBG_CONTROL_L1_SHIFT)
+#define X86_DBG_CONTROL_L1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L1_MASK, \
+                                        X86_DBG_CONTROL_L1_SHIFT)
+
+// Global Breakpoint Enable 1.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR1) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G1 1ul
+#define X86_DBG_CONTROL_G1_SHIFT 3
+#define X86_DBG_CONTROL_G1_MASK (X86_DBG_CONTROL_G1 << X86_DBG_CONTROL_G1_SHIFT)
+#define X86_DBG_CONTROL_G1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G1_MASK, X86_DBG_CONTROL_G1_SHIFT)
+#define X86_DBG_CONTROL_G1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G1_MASK, \
+                                        X86_DBG_CONTROL_G1_SHIFT)
+
+// Local Breakpoint Enable 2.
+// Enables debug exceptions to occur when the corresponding address register (DR2) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L2 1ul
+#define X86_DBG_CONTROL_L2_SHIFT 4
+#define X86_DBG_CONTROL_L2_MASK (X86_DBG_CONTROL_L2 << X86_DBG_CONTROL_L2_SHIFT)
+#define X86_DBG_CONTROL_L2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L2_MASK, X86_DBG_CONTROL_L2_SHIFT)
+#define X86_DBG_CONTROL_L2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L2_MASK, \
+                                        X86_DBG_CONTROL_L2_SHIFT)
+
+// Global Breakpoint Enable 2.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR2) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G2 1ul
+#define X86_DBG_CONTROL_G2_SHIFT 5
+#define X86_DBG_CONTROL_G2_MASK (X86_DBG_CONTROL_G2 << X86_DBG_CONTROL_G2_SHIFT)
+#define X86_DBG_CONTROL_G2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G2_MASK, X86_DBG_CONTROL_G2_SHIFT)
+#define X86_DBG_CONTROL_G2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G2_MASK, \
+                                        X86_DBG_CONTROL_G2_SHIFT)
+
+// Local Breakpoint Enable 3.
+// Enables debug exceptions to occur when the corresponding address register (DR3) detects a
+// breakpoint condition on the current intel task. This bit is never cleared by the processor.
+#define X86_DBG_CONTROL_L3 1ul
+#define X86_DBG_CONTROL_L3_SHIFT 6
+#define X86_DBG_CONTROL_L3_MASK (X86_DBG_CONTROL_L3 << X86_DBG_CONTROL_L3_SHIFT)
+#define X86_DBG_CONTROL_L3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_L3_MASK, X86_DBG_CONTROL_L3_SHIFT)
+#define X86_DBG_CONTROL_L3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_L3_MASK, \
+                                        X86_DBG_CONTROL_L3_SHIFT)
+
+// Global Breakpoint Enable 3.
+// Enables debug exceptions to occur when the corresponding address breakpoint (DR3) detects a
+// breakpoint condition while executing *any* intel task. This bit is not cleared by the processor.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_G3 1u
+#define X86_DBG_CONTROL_G3_SHIFT 7
+#define X86_DBG_CONTROL_G3_MASK (X86_DBG_CONTROL_G3 << X86_DBG_CONTROL_G3_SHIFT)
+#define X86_DBG_CONTROL_G3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_G3_MASK, X86_DBG_CONTROL_G3_SHIFT)
+#define X86_DBG_CONTROL_G3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_G3_MASK, \
+                                        X86_DBG_CONTROL_G3_SHIFT)
+
+// Local Enable [Legacy Implementations].
+// Enables exact breakpoints on the while executing the current intel task. This bit is ignored by
+// implementations of the AMD64 architecture.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_LE 1ul
+#define X86_DBG_CONTROL_LE_SHIFT 8
+#define X86_DBG_CONTROL_LE_MASK (X86_DBG_CONTROL_LE << X86_DBG_CONTROL_LE_SHIFT)
+#define X86_DBG_CONTROL_LE_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LE_MASK, X86_DBG_CONTROL_LE_SHIFT)
+#define X86_DBG_CONTROL_LE_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LE_MASK, \
+                                        X86_DBG_CONTROL_LE_SHIFT)
+
+// Global Enable [Legacy Implementations].
+// Enables exact breakpoints on the while executing *any* intel task. This bit is ignored by
+// implementations of the AMD64 architecture.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_GE 1ul
+#define X86_DBG_CONTROL_GE_SHIFT 9
+#define X86_DBG_CONTROL_GE_MASK (X86_DBG_CONTROL_GE << X86_DBG_CONTROL_GE_SHIFT)
+#define X86_DBG_CONTROL_GE_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_GE_MASK, X86_DBG_CONTROL_GE_SHIFT)
+#define X86_DBG_CONTROL_GE_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_GE_MASK, \
+                                        X86_DBG_CONTROL_GE_SHIFT)
+
+// General Detect Enable.
+// Whether an attempt to execute a "MOV DR<n>" instruction will trigger a debug exception. This bit
+// is cleared when a #DB handler is entered, so the handler can read/write to those registers.
+// This exception occurs before executing the instruction and DR6.DB is set the the processor.
+// Debuggers can use this bit to prevent the currently executing prgram from interfering with the
+// debug operations.
+// Zircon does not permit to set this bit.
+#define X86_DBG_CONTROL_GD 1ul
+#define X86_DBG_CONTROL_GD_SHIFT 13
+#define X86_DBG_CONTROL_GD_MASK (X86_DBG_CONTROL_GD << X86_DBG_CONTROL_GD_SHIFT)
+#define X86_DBG_CONTROL_GD_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_GD_MASK, X86_DBG_CONTROL_GD_SHIFT)
+#define X86_DBG_CONTROL_GD_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_GD_MASK, \
+                                        X86_DBG_CONTROL_GD_SHIFT)
+
+// Read/Write 0.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR0).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW0 3ul
+#define X86_DBG_CONTROL_RW0_SHIFT 16
+#define X86_DBG_CONTROL_RW0_MASK (X86_DBG_CONTROL_RW0 << X86_DBG_CONTROL_RW0_SHIFT)
+#define X86_DBG_CONTROL_RW0_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW0_MASK, X86_DBG_CONTROL_RW0_SHIFT)
+#define X86_DBG_CONTROL_RW0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW0_MASK, \
+                                        X86_DBG_CONTROL_RW0_SHIFT)
+
+// Length 0.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR0). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN0 3ul
+#define X86_DBG_CONTROL_LEN0_SHIFT 18
+#define X86_DBG_CONTROL_LEN0_MASK (X86_DBG_CONTROL_LEN0 << X86_DBG_CONTROL_LEN0_SHIFT)
+#define X86_DBG_CONTROL_LEN0_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN0_MASK, \
+                                        X86_DBG_CONTROL_LEN0_SHIFT)
+#define X86_DBG_CONTROL_LEN0_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN0_MASK, \
+                                        X86_DBG_CONTROL_LEN0_SHIFT)
+
+// Read/Write 1.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR1).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW1 3ul
+#define X86_DBG_CONTROL_RW1_SHIFT 20
+#define X86_DBG_CONTROL_RW1_MASK (X86_DBG_CONTROL_RW1 << X86_DBG_CONTROL_RW1_SHIFT)
+#define X86_DBG_CONTROL_RW1_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW1_MASK, X86_DBG_CONTROL_RW1_SHIFT)
+#define X86_DBG_CONTROL_RW1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW1_MASK, \
+                                        X86_DBG_CONTROL_RW1_SHIFT)
+
+// Length 1.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR1). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN1 3ul
+#define X86_DBG_CONTROL_LEN1_SHIFT 22
+#define X86_DBG_CONTROL_LEN1_MASK (X86_DBG_CONTROL_LEN1 << X86_DBG_CONTROL_LEN1_SHIFT)
+#define X86_DBG_CONTROL_LEN1_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN1_MASK, \
+                                        X86_DBG_CONTROL_LEN1_SHIFT)
+#define X86_DBG_CONTROL_LEN1_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN1_MASK, \
+                                        X86_DBG_CONTROL_LEN1_SHIFT)
+
+// Read/Write 2.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR2).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW2 3ul
+#define X86_DBG_CONTROL_RW2_SHIFT 24
+#define X86_DBG_CONTROL_RW2_MASK (X86_DBG_CONTROL_RW2 << X86_DBG_CONTROL_RW2_SHIFT)
+#define X86_DBG_CONTROL_RW2_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW2_MASK, X86_DBG_CONTROL_RW2_SHIFT)
+#define X86_DBG_CONTROL_RW2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW2_MASK, \
+                                        X86_DBG_CONTROL_RW2_SHIFT)
+
+// Length 2.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR2). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN2 3ul
+#define X86_DBG_CONTROL_LEN2_SHIFT 26
+#define X86_DBG_CONTROL_LEN2_MASK (X86_DBG_CONTROL_LEN2 << X86_DBG_CONTROL_LEN2_SHIFT)
+#define X86_DBG_CONTROL_LEN2_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN2_MASK, \
+                                        X86_DBG_CONTROL_LEN2_SHIFT)
+#define X86_DBG_CONTROL_LEN2_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN2_MASK, \
+                                        X86_DBG_CONTROL_LEN2_SHIFT)
+
+// Read/Write 3.
+// Controls the breakpoint conditions used by the corresponding address breakpoint register (DR3).
+// The values are:
+// - 00: Only instruction execution.
+// - 01: Only data write.
+// - 10: Dependant by CR4.DE. Not supported by Zircon.
+//   - CR4.DE = 0: Undefined.
+//   - CR4.DE = 1: Only on I/0 read/write.
+// - 11: Only on data read/write.
+#define X86_DBG_CONTROL_RW3 3ul
+#define X86_DBG_CONTROL_RW3_SHIFT 28
+#define X86_DBG_CONTROL_RW3_MASK (X86_DBG_CONTROL_RW3 << X86_DBG_CONTROL_RW3_SHIFT)
+#define X86_DBG_CONTROL_RW3_GET(reg) \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_RW3_MASK, X86_DBG_CONTROL_RW3_SHIFT)
+#define X86_DBG_CONTROL_RW3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_RW3_MASK, \
+                                        X86_DBG_CONTROL_RW3_SHIFT)
+
+// Length 3.
+// Controls the range used in comparing a memory address with the corresponding address breakpoint
+// register (DR3). The values are:
+// - 00: 1 byte.
+// - 01: 2 byte. DR0 must be 2 byte aligned.
+// - 10: 8 byte. DR0 must be 8 byte aligned.
+// - 11: 4 byte. DR0 must be 4 byte aligned.
+#define X86_DBG_CONTROL_LEN3 3ul
+#define X86_DBG_CONTROL_LEN3_SHIFT 30
+#define X86_DBG_CONTROL_LEN3_MASK (X86_DBG_CONTROL_LEN3 << X86_DBG_CONTROL_LEN3_SHIFT)
+#define X86_DBG_CONTROL_LEN3_GET(reg)                                     \
+  __x86_internal_hw_debug_get_reg_value((reg), X86_DBG_CONTROL_LEN3_MASK, \
+                                        X86_DBG_CONTROL_LEN3_SHIFT)
+#define X86_DBG_CONTROL_LEN3_SET(reg, value)                                       \
+  __x86_internal_hw_debug_set_reg_value((reg), (value), X86_DBG_CONTROL_LEN3_MASK, \
+                                        X86_DBG_CONTROL_LEN3_SHIFT)
+
+// Helper functions ================================================================================
+
+inline uint64_t __x86_internal_hw_debug_get_reg_value(uint64_t reg, uint64_t mask, uint64_t shift) {
+  return (reg & mask) >> shift;
+}
+
+inline void __x86_internal_hw_debug_set_reg_value(uint64_t* reg, uint64_t value, uint64_t mask,
+                                                  uint64_t shift) {
+  *reg &= ~mask;
+  *reg |= (value << shift) & mask;
+}
+
+#endif  // SYSROOT_ZIRCON_HW_DEBUG_X86_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/gpt.h b/arch/x64/sysroot/include/zircon/hw/gpt.h
index c3112f5..d93a23c 100644
--- a/arch/x64/sysroot/include/zircon/hw/gpt.h
+++ b/arch/x64/sysroot/include/zircon/hw/gpt.h
@@ -2,59 +2,224 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_GPT_H_
+#define SYSROOT_ZIRCON_HW_GPT_H_
 
+#include <assert.h>
 #include <stdbool.h>
 #include <stdint.h>
-
 #include <zircon/compiler.h>
 
-#define GPT_MAGIC (0x5452415020494645ull) // 'EFI PART'
+#define GPT_MAGIC (0x5452415020494645ull)  // 'EFI PART'
 #define GPT_HEADER_SIZE 0x5c
-#define GPT_ENTRY_SIZE  0x80
+#define GPT_ENTRY_SIZE 0x80
 #define GPT_GUID_LEN 16
 #define GPT_GUID_STRLEN 37
 #define GPT_NAME_LEN 72
 
 typedef struct gpt_header {
-    uint64_t magic;
-    uint32_t revision;
-    uint32_t size;
-    uint32_t crc32;
-    uint32_t reserved0;
-    uint64_t current;
-    uint64_t backup;
-    uint64_t first;
-    uint64_t last;
-    uint8_t guid[GPT_GUID_LEN];
-    uint64_t entries;
-    uint32_t entries_count;
-    uint32_t entries_size;
-    uint32_t entries_crc;
+  uint64_t magic;              // Magic number.
+  uint32_t revision;           // Revision.
+  uint32_t size;               // Size of the header.
+  uint32_t crc32;              // Checksum of this header.
+  uint32_t reserved0;          // Reserved field.
+  uint64_t current;            // Block where this table is stored.
+  uint64_t backup;             // Block where other copy of partition table is stored.
+  uint64_t first;              // First usable block. Block after primary partition table ends.
+  uint64_t last;               // Last usable block. Block before backup partition table starts.
+  uint8_t guid[GPT_GUID_LEN];  // Disk GUID.
+  uint64_t entries;            // Starting block where entries for this partition tables are found.
+                               // Value equals 2 for primary copy.
+  uint32_t entries_count;      // Total number of entries.
+  uint32_t entries_size;       // Size of each entry.
+  uint32_t entries_crc;        // Checksum of the entire entries array.
 } __PACKED gpt_header_t;
 
-typedef struct gpt_entry {
-    uint8_t type[GPT_GUID_LEN];
-    uint8_t guid[GPT_GUID_LEN];
-    uint64_t first;
-    uint64_t last;
-    uint64_t flags;
-    uint8_t name[GPT_NAME_LEN];  // UTF-16 on disk
-} __PACKED gpt_entry_t;
+static_assert(GPT_HEADER_SIZE == sizeof(gpt_header_t), "Gpt header size invalid");
 
+typedef struct gpt_entry {
+  uint8_t type[GPT_GUID_LEN];
+  uint8_t guid[GPT_GUID_LEN];
+  uint64_t first;
+  uint64_t last;
+  uint64_t flags;
+  uint8_t name[GPT_NAME_LEN];  // UTF-16 on disk
+} gpt_entry_t;
+
+static_assert(GPT_ENTRY_SIZE == sizeof(gpt_entry_t), "Gpt entry size invalid");
+
+// GUIDs are specified in mixed-endian, to avoid manual errors use this macro.
+// Example usage: GPT_GUID(0x00112233, 0x4455, 0x6677, 0x8899, 0xAABBCCDDEEFF)
+// clang-format off
+#define GPT_GUID(group0, group1, group2, group3, group4) { \
+  /* group0: 4 bytes, little-endian. */                    \
+  (group0 >> 0) & 0xFF,                                    \
+  (group0 >> 8) & 0xFF,                                    \
+  (group0 >> 16) & 0xFF,                                   \
+  (group0 >> 24) & 0xFF,                                   \
+  /* group1: 2 bytes, little-endian. */                    \
+  (group1 >> 0) & 0xFF,                                    \
+  (group1 >> 8) & 0xFF,                                    \
+  /* group2: 2 bytes, little-endian. */                    \
+  (group2 >> 0) & 0xFF,                                    \
+  (group2 >> 8) & 0xFF,                                    \
+  /* group3: 2 bytes, big-endian. */                       \
+  (group3 >> 8) & 0xFF,                                    \
+  (group3 >> 0) & 0xFF,                                    \
+  /* group4: 6 bytes, big-endian. */                       \
+  (group4 >> 40) & 0xFF,                                   \
+  (group4 >> 32) & 0xFF,                                   \
+  (group4 >> 24) & 0xFF,                                   \
+  (group4 >> 16) & 0xFF,                                   \
+  (group4 >> 8) & 0xFF,                                    \
+  (group4 >> 0) & 0xFF                                     \
+}
+// clang-format on
+
+// == GPT partition definitions ==
+//
+// These are some common partition definitions used across various boards.
+// The general scheme is:
+//   |type|: identical for slotted partitions, e.g. zircon_{a,b,r} will all
+//           share the same type GUID
+//   |guid|: unspecified and generally expected to be random
+//   |name|: specific name for uniquely identifying partitions
+//
+// New boards should adopt this scheme when possible, but see below for a
+// slightly different legacy scheme used by existing boards.
+
+// clang-format off
+
+// bootloader_{a,b,r}
+//
+// These partitions are optional and may be used to hold bootloader and/or
+// other firmware images. The format is SoC-specific.
+#define GPT_BOOTLOADER_A_NAME         "bootloader_a"
+#define GPT_BOOTLOADER_B_NAME         "bootloader_b"
+#define GPT_BOOTLOADER_R_NAME         "bootloader_r"
+#define GPT_BOOTLOADER_ABR_TYPE_GUID  GPT_GUID(0xfe8a2634, 0x5e2e, 0x46ba, 0x99e3, 0x3a192091a350)
+
+// durable
+//
+// This partition holds mutable data that must remain intact across factory
+// reset. It differs from durable_boot only in that it is larger, ignored by
+// bootloaders, and is expected to have a filesystem.
+//
+// This partition is expected to be written to by Fuchsia during normal
+// operation. It is expected to be read by Fuchsia, but not by any bootloader
+// or firmware. It is expected to have a filesystem with encryption built in.
+// Use of this partition increases attack surface and should be minimized.
+#define GPT_DURABLE_NAME              "durable"
+#define GPT_DURABLE_TYPE_GUID         GPT_GUID(0xd9fd4535, 0x106c, 0x4cec, 0x8d37, 0xdfc020ca87cb)
+
+// durable_boot
+//
+// This partition holds A/B/R metadata and other very small mutable data that
+// must remain intact across factory reset. There is no filesystem and the
+// content layout is fixed.
+//
+// This partition is expected to be written to by Fuchsia and the main
+// bootloader during normal operation. It is expected to be read by bootloaders
+// very early in boot. It has no encryption or integrity check built in. Use of
+// this partition increases attack surface and should be minimized.
+#define GPT_DURABLE_BOOT_NAME         "durable_boot"
+#define GPT_DURABLE_BOOT_TYPE_GUID    GPT_GUID(0xa409e16b, 0x78aa, 0x4acc, 0x995c, 0x302352621a41)
+
+// factory
+//
+// This partition holds factory-provisioned data used by the Fuchsia-based
+// system and is read-only.
+//
+// It is expected that this partition is only written in the factory and has a
+// simple file system. It is not encrypted, but is checked for integrity by
+// Fuchsia. Bootloaders and firmware are expected to ignore this partition.
+#define GPT_FACTORY_NAME              "factory"
+#define GPT_FACTORY_TYPE_GUID         GPT_GUID(0xf95d940e, 0xcaba, 0x4578, 0x9b93, 0xbb6c90f29d3e)
+
+// factory_boot
+//
+// This partition holds factory-provisioned data used by the bootloader and is
+// read-only. It must be small enough to be loaded into memory and verified
+// during boot.
+//
+// It is expected that this partition is only written in the factory and has a
+// simple structured format, not a filesystem. It is not encrypted but is
+// checked for integrity by the verified boot process. It is expected to be read
+// only by the main bootloader, not by Fuchsia.
+#define GPT_FACTORY_BOOT_NAME         "factory_boot"
+#define GPT_FACTORY_BOOT_TYPE_GUID    GPT_GUID(0x10b8dbaa, 0xd2bf, 0x42a9, 0x98c6, 0xa7c5db3701e7)
+
+// fvm
+//
+// This partition is owned by the Fuchsia Volume Manager. It will be used for
+// both system and user data.
+#define GPT_FVM_NAME                  "fvm"
+#define GPT_FVM_TYPE_GUID             GPT_GUID(0x49fd7cb8, 0xdf15, 0x4e73, 0xb9d9, 0x992070127f0f)
+
+// vbmeta_{a,b,r}
+//
+// These partitions each hold verified boot metadata for a particular A/B/R
+// slot. The format is defined by libavb.
+//
+// These partitions are expected to be written in the factory and during an OTA
+// update. They are expected to be read by the main bootloader and possibly by
+// Fuchsia. They are not encrypted, but are checked for integrity as part of the
+// verified boot process.
+#define GPT_VBMETA_A_NAME             "vbmeta_a"
+#define GPT_VBMETA_B_NAME             "vbmeta_b"
+#define GPT_VBMETA_R_NAME             "vbmeta_r"
+#define GPT_VBMETA_ABR_TYPE_GUID      GPT_GUID(0x421a8bfc, 0x85d9, 0x4d85, 0xacda, 0xb64eec0133e9)
+
+// zircon_{a,b,r}
+//
+// These partitions each hold a complete Zircon boot image, including an
+// embedded bootfs image, for a particular A/B/R slot.
+//
+// These partitions are expected to be written in the factory and during an OTA
+// update. They are expected to be read only by the main bootloader. They are
+// not encrypted but are checked for integrity as part of the verified boot
+// process.
+#define GPT_ZIRCON_A_NAME             "zircon_a"
+#define GPT_ZIRCON_B_NAME             "zircon_b"
+#define GPT_ZIRCON_R_NAME             "zircon_r"
+#define GPT_ZIRCON_ABR_TYPE_GUID      GPT_GUID(0x9b37fff6, 0x2e58, 0x466a, 0x983a, 0xf7926d0b04e0)
+
+// Microsoft basic data partition
+//
+// These partitions usually contain FAT filesystems. They are mounted by the fat
+// implementation at //src/storage/fuchsia-fatfs.
+// These partitions do not have an expected label.
+#define GPT_MICROSOFT_BASIC_DATA_TYPE_GUID \
+    GPT_GUID(0xebd0a0a2, 0xb9e5, 0x4433, 0x87c0, 0x68b6b72699c7)
+
+// clang-format on
+
+// == Legacy GPT partition definitions ==
+//
+// These definitions instead use the following scheme:
+//   |type|: unique for each partition, e.g. zircon_{a,b,r} will each have their
+//           own type GUID
+//   |guid|: unspecified and generally expected to be random
+//   |name|: specific name, can use this or |type| find an individual partition
+
+// clang-format off
+#define GUID_EMPTY_STRING "00000000-0000-0000-0000-000000000000"
 #define GUID_EMPTY_VALUE {                         \
     0x00, 0x00, 0x00, 0x00,                        \
     0x00, 0x00,                                    \
     0x00, 0x00,                                    \
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
 }
+#define GUID_EMPTY_NAME "empty"
 
+#define GUID_EFI_STRING "C12A7328-F81F-11D2-BA4B-00A0C93EC93B"
 #define GUID_EFI_VALUE {                           \
     0x28, 0x73, 0x2a, 0xc1,                        \
     0x1f, 0xf8,                                    \
     0xd2, 0x11,                                    \
     0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b \
 }
+#define GUID_EFI_NAME "fuchsia-esp"
 
 // GUID for a system partition
 #define GUID_SYSTEM_STRING "606B000B-B7C7-4653-A7D5-B737332C899D"
@@ -64,6 +229,7 @@
     0x53, 0x46,                                    \
     0xa7, 0xd5, 0xb7, 0x37, 0x33, 0x2c, 0x89, 0x9d \
 }
+#define GUID_SYSTEM_NAME "fuchsia-system"
 
 // GUID for a data partition
 #define GUID_DATA_STRING "08185F0C-892D-428A-A789-DBEEC8F55E6A"
@@ -73,6 +239,7 @@
     0x8a, 0x42,                                    \
     0xa7, 0x89, 0xdb, 0xee, 0xc8, 0xf5, 0x5e, 0x6a \
 }
+#define GUID_DATA_NAME "fuchsia-data"
 
 // GUID for a installer partition
 #define GUID_INSTALL_STRING "48435546-4953-2041-494E-5354414C4C52"
@@ -82,6 +249,7 @@
     0x41, 0x20,                                    \
     0x49, 0x4E, 0x53, 0x54, 0x41, 0x4C, 0x4C, 0x52 \
 }
+#define GUID_INSTALL_NAME "fuchsia-install"
 
 #define GUID_BLOB_STRING "2967380E-134C-4CBB-B6DA-17E7CE1CA45D"
 #define GUID_BLOB_VALUE {                          \
@@ -90,6 +258,7 @@
     0xbb, 0x4c,                                    \
     0xb6, 0xda, 0x17, 0xe7, 0xce, 0x1c, 0xa4, 0x5d \
 }
+#define GUID_BLOB_NAME "fuchsia-blob"
 
 #define GUID_FVM_STRING "41D0E340-57E3-954E-8C1E-17ECAC44CFF5"
 #define GUID_FVM_VALUE {                           \
@@ -98,75 +267,188 @@
     0x4e, 0x95,                                    \
     0x8c, 0x1e, 0x17, 0xec, 0xac, 0x44, 0xcf, 0xf5 \
 }
+#define GUID_FVM_NAME "fuchsia-fvm"
 
 #define GUID_ZIRCON_A_STRING "DE30CC86-1F4A-4A31-93C4-66F147D33E05"
-#define GUID_ZIRCON_A_VALUE { \
-    0x86, 0xcc, 0x30, 0xde, \
-    0x4a, 0x1f, \
-    0x31, 0x4a, \
+#define GUID_ZIRCON_A_VALUE {                       \
+    0x86, 0xcc, 0x30, 0xde,                         \
+    0x4a, 0x1f,                                     \
+    0x31, 0x4a,                                     \
     0x93, 0xc4, 0x66, 0xf1, 0x47, 0xd3, 0x3e, 0x05, \
 }
+#define GUID_ZIRCON_A_NAME "zircon-a"
 
 #define GUID_ZIRCON_B_STRING "23CC04DF-C278-4CE7-8471-897D1A4BCDF7"
-#define GUID_ZIRCON_B_VALUE { \
-    0xdf, 0x04, 0xcc, 0x23, \
-    0x78, 0xc2, \
-    0xe7, 0x4c, \
+#define GUID_ZIRCON_B_VALUE {                      \
+    0xdf, 0x04, 0xcc, 0x23,                        \
+    0x78, 0xc2,                                    \
+    0xe7, 0x4c,                                    \
     0x84, 0x71, 0x89, 0x7d, 0x1a, 0x4b, 0xcd, 0xf7 \
 }
+#define GUID_ZIRCON_B_NAME "zircon-b"
 
 #define GUID_ZIRCON_R_STRING "A0E5CF57-2DEF-46BE-A80C-A2067C37CD49"
-#define GUID_ZIRCON_R_VALUE { \
-    0x57, 0xcf, 0xe5, 0xa0, \
-    0xef, 0x2d, \
-    0xbe, 0x46, \
+#define GUID_ZIRCON_R_VALUE {                      \
+    0x57, 0xcf, 0xe5, 0xa0,                        \
+    0xef, 0x2d,                                    \
+    0xbe, 0x46,                                    \
     0xa8, 0x0c, 0xa2, 0x06, 0x7c, 0x37, 0xcd, 0x49 \
 }
+#define GUID_ZIRCON_R_NAME "zircon-r"
 
 #define GUID_SYS_CONFIG_STRING "4E5E989E-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_SYS_CONFIG_VALUE { \
+#define GUID_SYS_CONFIG_VALUE {                    \
     0x9e, 0x98, 0x5e, 0x4e,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_SYS_CONFIG_NAME "sys-config"
 
 #define GUID_FACTORY_CONFIG_STRING "5A3A90BE-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_FACTORY_CONFIG_VALUE { \
+#define GUID_FACTORY_CONFIG_VALUE {                \
     0xbe, 0x90, 0x3a, 0x5a,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_FACTORY_CONFIG_NAME "factory-config"
 
 #define GUID_BOOTLOADER_STRING "5ECE94FE-4C86-11E8-A15B-480FCF35F8E6"
-#define GUID_BOOTLOADER_VALUE { \
+#define GUID_BOOTLOADER_VALUE {                    \
     0xfe, 0x94, 0xce, 0x5e,                        \
     0x86, 0x4c,                                    \
     0xe8, 0x11,                                    \
     0xa1, 0x5b, 0x48, 0x0f, 0xcf, 0x35, 0xf8, 0xe6 \
 }
+#define GUID_BOOTLOADER_NAME "bootloader"
 
 #define GUID_TEST_STRING "8B94D043-30BE-4871-9DFA-D69556E8C1F3"
-#define GUID_TEST_VALUE { \
+#define GUID_TEST_VALUE {                          \
     0x43, 0xD0, 0x94, 0x8b,                        \
     0xbe, 0x30,                                    \
-    0x71, 0x38,                                    \
+    0x71, 0x48,                                    \
     0x9d, 0xfa, 0xd6, 0x95, 0x56, 0xe8, 0xc1, 0xf3 \
 }
+#define GUID_TEST_NAME "guid-test"
 
 #define GUID_VBMETA_A_STRING "A13B4D9A-EC5F-11E8-97D8-6C3BE52705BF"
-#define GUID_VBMETA_A_VALUE { \
+#define GUID_VBMETA_A_VALUE {                      \
     0x9a, 0x4d, 0x3b, 0xa1,                        \
     0x5f, 0xec,                                    \
-    0xd8, 0x97,                                    \
-    0x6c, 0x3b, 0x6c, 0x3b, 0xe2, 0x27, 0x05, 0xbf \
+    0xe8, 0x11,                                    \
+    0x97, 0xd8, 0x6c, 0x3b, 0xe5, 0x27, 0x05, 0xbf \
 }
+#define GUID_VBMETA_A_NAME "vbmeta_a"
 
 #define GUID_VBMETA_B_STRING "A288ABF2-EC5F-11E8-97D8-6C3BE52705BF"
-#define GUID_VBMETA_B_VALUE { \
+#define GUID_VBMETA_B_VALUE {                      \
     0xf2, 0xab, 0x88, 0xa2,                        \
     0x5f, 0xec,                                    \
-    0xd8, 0x97,                                    \
-    0x6c, 0x3b, 0x6c, 0x3b, 0xe2, 0x27, 0x05, 0xbf \
+    0xe8, 0x11,                                    \
+    0x97, 0xd8, 0x6c, 0x3b, 0xe5, 0x27, 0x05, 0xbf \
 }
+#define GUID_VBMETA_B_NAME "vbmeta_b"
+
+#define GUID_VBMETA_R_STRING "6A2460C3-CD11-4E8B-80A8-12CCE268ED0A"
+#define GUID_VBMETA_R_VALUE {                      \
+    0xc3, 0x60, 0x24, 0x6a,                        \
+    0x11, 0xcd,                                    \
+    0x8b, 0x4e,                                    \
+    0x80, 0xa8, 0x12, 0xcc, 0xe2, 0x68, 0xed, 0x0a \
+}
+#define GUID_VBMETA_R_NAME "vbmeta_r"
+
+#define GUID_ABR_META_STRING "1D75395D-F2C6-476B-A8B7-45CC1C97B476"
+#define GUID_ABR_META_VALUE {                      \
+    0x5d, 0x39, 0x75, 0x1d,                        \
+    0xc6, 0xf2,                                    \
+    0x6b, 0x47,                                    \
+    0xa8, 0xb7, 0x45, 0xcc, 0x1c, 0x97, 0xb4, 0x76 \
+}
+#define GUID_ABR_META_NAME "misc"
+
+#define GUID_CROS_KERNEL_STRING "FE3A2A5D-4F32-41A7-B725-ACCC3285A309"
+#define GUID_CROS_KERNEL_VALUE {                   \
+    0x5d, 0x2a, 0x3a, 0xfe,                        \
+    0x32, 0x4f,                                    \
+    0xa7, 0x41,                                    \
+    0xb7, 0x25, 0xac, 0xcc, 0x32, 0x85, 0xa3, 0x09 \
+}
+#define GUID_CROS_KERNEL_NAME "cros-kernel"
+
+#define GUID_CROS_ROOTFS_STRING "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC"
+#define GUID_CROS_ROOTFS_VALUE {                   \
+    0x02, 0xe2, 0xb8, 0x3C,                        \
+    0x7e, 0x3b,                                    \
+    0xdd, 0x47,                                    \
+    0x8a, 0x3c, 0x7f, 0xf2, 0xa1, 0x3c, 0xfc, 0xec \
+}
+#define GUID_CROS_ROOTFS_NAME "cros-rootfs"
+
+#define GUID_CROS_RESERVED_STRING "2E0A753D-9E48-43B0-8337-B15192CB1B5E"
+#define GUID_CROS_RESERVED_VALUE {                 \
+    0x3d, 0x75, 0x0a, 0x2e,                        \
+    0x48, 0x9e,                                    \
+    0xb0, 0x43,                                    \
+    0x83, 0x37, 0xb1, 0x51, 0x92, 0xcb, 0x1b, 0x5e \
+}
+#define GUID_CROS_RESERVED_NAME "cros-reserved"
+
+#define GUID_CROS_FIRMWARE_STRING "CAB6E88E-ABF3-4102-A07A-D4BB9BE3C1D3"
+#define GUID_CROS_FIRMWARE_VALUE {                 \
+    0x8e, 0xe8, 0xb6, 0xca,                        \
+    0xf3, 0xab,                                    \
+    0x02, 0x41,                                    \
+    0xa0, 0x7a, 0xd4, 0xbb, 0x9b, 0xe3, 0xc1, 0xd3 \
+}
+#define GUID_CROS_FIRMWARE_NAME "cros-firmware"
+
+#define GUID_CROS_DATA_STRING "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
+#define GUID_CROS_DATA_VALUE {                     \
+    0xa2, 0xa0, 0xd0, 0xeb,                        \
+    0xe5, 0xb9,                                    \
+    0x33, 0x44,                                    \
+    0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 \
+}
+#define GUID_CROS_DATA_NAME "cros-data"
+
+#define GUID_BIOS_STRING "21686148-6449-6E6F-744E-656564454649"
+#define GUID_BIOS_VALUE {                          \
+    0x48, 0x61, 0x68, 0x21,                        \
+    0x49, 0x64,                                    \
+    0x6f, 0x6e,                                    \
+    0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 \
+}
+#define GUID_BIOS_NAME "bios"
+
+#define GUID_EMMC_BOOT1_STRING "900B0FC5-90CD-4D4F-84F9-9F8ED579DB88"
+#define GUID_EMMC_BOOT1_VALUE {                    \
+    0xc5, 0x0f, 0x0b, 0x90,                        \
+    0xcd, 0x90,                                    \
+    0x4f, 0x4d,                                    \
+    0x84, 0xf9, 0x9f, 0x8e, 0xd5, 0x79, 0xdb, 0x88 \
+}
+#define GUID_EMMC_BOOT1_NAME "emmc-boot1"
+
+#define GUID_EMMC_BOOT2_STRING "B2B2E8D1-7C10-4EBC-A2D0-4614568260AD"
+#define GUID_EMMC_BOOT2_VALUE {                    \
+    0xd1, 0xe8, 0xb2, 0xb2,                        \
+    0x10, 0x7c,                                    \
+    0xbc, 0x4e,                                    \
+    0xa2, 0xd0, 0x46, 0x14, 0x56, 0x82, 0x60, 0xad \
+}
+#define GUID_EMMC_BOOT2_NAME "emmc-boot2"
+
+#define GUID_LINUX_FILESYSTEM_DATA_STRING "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
+#define GUID_LINUX_FILESYSTEM_DATA_VALUE {         \
+    0xaf, 0x3d, 0xc6, 0x0f,                        \
+    0x83, 0x84,                                    \
+    0x72, 0x47,                                    \
+    0x8e, 0x79, 0x3d, 0x69, 0xd8, 0x47, 0x7d, 0xe4 \
+}
+#define GUID_LINUX_FILESYSTEM_DATA_NAME "linux-filesystem"
+
+// clang-format on
+
+#endif  // SYSROOT_ZIRCON_HW_GPT_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/i2c.h b/arch/x64/sysroot/include/zircon/hw/i2c.h
index a8f0f4b..e35b6f1 100644
--- a/arch/x64/sysroot/include/zircon/hw/i2c.h
+++ b/arch/x64/sysroot/include/zircon/hw/i2c.h
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_I2C_H_
+#define SYSROOT_ZIRCON_HW_I2C_H_
 
 #define I2C_CLASS_HID 1
+
+#endif  // SYSROOT_ZIRCON_HW_I2C_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/pci.h b/arch/x64/sysroot/include/zircon/hw/pci.h
index 06c7023..7de1bca 100644
--- a/arch/x64/sysroot/include/zircon/hw/pci.h
+++ b/arch/x64/sysroot/include/zircon/hw/pci.h
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_HW_PCI_H_
-#define ZIRCON_HW_PCI_H_
+#ifndef SYSROOT_ZIRCON_HW_PCI_H_
+#define SYSROOT_ZIRCON_HW_PCI_H_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // Structure for passing around PCI address information
 typedef struct pci_bdf {
-    uint8_t bus_id;
-    uint8_t device_id;
-    uint8_t function_id;
+  uint8_t bus_id;
+  uint8_t device_id;
+  uint8_t function_id;
 } pci_bdf_t;
 
 // TODO(cja): This header is used for the transition of these defines from
@@ -43,8 +43,8 @@
 
 #define PCI_INVALID_VENDOR_ID (0xFFFF)
 
-#endif // WITH_KERNEL_PCIE
+#endif  // WITH_KERNEL_PCIE
 
-__END_CDECLS;
+__END_CDECLS
 
-#endif // ZIRCON_HW_PCI_H_
+#endif  // SYSROOT_ZIRCON_HW_PCI_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-audio.h b/arch/x64/sysroot/include/zircon/hw/usb-audio.h
deleted file mode 100644
index 7af2994..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-audio.h
+++ /dev/null
@@ -1,524 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS;
-
-////////////////////////////////////////////////////
-//
-// General Audio interface constants
-//
-////////////////////////////////////////////////////
-
-// audio interface subclasses
-#define USB_SUBCLASS_AUDIO_CONTROL              0x01
-#define USB_SUBCLASS_AUDIO_STREAMING            0x02
-#define USB_SUBCLASS_MIDI_STREAMING             0x03
-
-// audio class specific descriptor types
-#define USB_AUDIO_CS_DEVICE                     0x21
-#define USB_AUDIO_CS_CONFIGURATION              0x22
-#define USB_AUDIO_CS_STRING                     0x23
-#define USB_AUDIO_CS_INTERFACE                  0x24
-#define USB_AUDIO_CS_ENDPOINT                   0x25
-
-////////////////////////////////////////////////////
-//
-// Audio Control interface constants
-//
-////////////////////////////////////////////////////
-
-// audio class specific AC interface descriptor subtypes
-#define USB_AUDIO_AC_HEADER                     0x01
-#define USB_AUDIO_AC_INPUT_TERMINAL             0x02
-#define USB_AUDIO_AC_OUTPUT_TERMINAL            0x03
-#define USB_AUDIO_AC_MIXER_UNIT                 0x04
-#define USB_AUDIO_AC_SELECTOR_UNIT              0x05
-#define USB_AUDIO_AC_FEATURE_UNIT               0x06
-#define USB_AUDIO_AC_PROCESSING_UNIT            0x07
-#define USB_AUDIO_AC_EXTENSION_UNIT             0x08
-
-// processing unit process types
-#define USB_AUDIO_UP_DOWN_MIX_PROCESS           0x01
-#define USB_AUDIO_DOLBY_PROLOGIC_PROCESS        0x02
-#define USB_AUDIO_3D_STEREO_EXTENDER_PROCESS    0x03
-#define USB_AUDIO_REVERBERATION_PROCESS         0x04
-#define USB_AUDIO_CHORUS_PROCESS                0x05
-#define USB_AUDIO_DYN_RANGE_COMP_PROCESS        0x06
-
-// audio class specific endpoint descriptor subtypes
-#define USB_AUDIO_EP_GENERAL                    0x01
-
-// audio class specific request codes
-#define USB_AUDIO_SET_CUR                       0x01
-#define USB_AUDIO_GET_CUR                       0x81
-#define USB_AUDIO_SET_MIN                       0x02
-#define USB_AUDIO_GET_MIN                       0x82
-#define USB_AUDIO_SET_MAX                       0x03
-#define USB_AUDIO_GET_MAX                       0x83
-#define USB_AUDIO_SET_RES                       0x04
-#define USB_AUDIO_GET_RES                       0x84
-#define USB_AUDIO_SET_MEM                       0x05
-#define USB_AUDIO_GET_MEM                       0x85
-#define USB_AUDIO_GET_STAT                      0xFF
-
-// terminal control selectors
-#define USB_AUDIO_COPY_PROTECT_CONTROL          0x01
-
-// feature unit control selectors
-#define USB_AUDIO_MUTE_CONTROL                  0x01
-#define USB_AUDIO_VOLUME_CONTROL                0x02
-#define USB_AUDIO_BASS_CONTROL                  0x03
-#define USB_AUDIO_MID_CONTROL                   0x04
-#define USB_AUDIO_TREBLE_CONTROL                0x05
-#define USB_AUDIO_GRAPHIC_EQUALIZER_CONTROL     0x06
-#define USB_AUDIO_AUTOMATIC_GAIN_CONTROL        0x07
-#define USB_AUDIO_DELAY_CONTROL                 0x08
-#define USB_AUDIO_BASS_BOOST_CONTROL            0x09
-#define USB_AUDIO_LOUDNESS_CONTROL              0x0A
-
-// feature unit control support bitmasks
-#define USB_AUDIO_FU_BMA_MUTE                   (1u << 0u)
-#define USB_AUDIO_FU_BMA_VOLUME                 (1u << 1u)
-#define USB_AUDIO_FU_BMA_BASS                   (1u << 2u)
-#define USB_AUDIO_FU_BMA_MID                    (1u << 3u)
-#define USB_AUDIO_FU_BMA_TREBLE                 (1u << 4u)
-#define USB_AUDIO_FU_BMA_GRAPHIC_EQUALIZER      (1u << 5u)
-#define USB_AUDIO_FU_BMA_AUTOMATIC_GAIN         (1u << 6u)
-#define USB_AUDIO_FU_BMA_DELAY                  (1u << 7u)
-#define USB_AUDIO_FU_BMA_BASS_BOOST             (1u << 8u)
-#define USB_AUDIO_FU_BMA_LOUDNESS               (1u << 9u)
-
-// up/down mix processing unit control selectors
-#define USB_AUDIO_UD_ENABLE_CONTROL             0x01
-#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
-#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
-
-// Dolby Prologic processing unit control selectors
-#define USB_AUDIO_DP_ENABLE_CONTROL             0x01
-#define USB_AUDIO_DP_MODE_SELECT_CONTROL        0x02
-
-// 3D stereo extender processing unit control selectors
-#define USB_AUDIO_3D_ENABLE_CONTROL             0x01
-#define USB_AUDIO_SPACIOUSNESS_CONTROL          0x03
-
-// reverberation processing unit control selectors
-#define USB_AUDIO_RV_ENABLE_CONTROL             0x01
-#define USB_AUDIO_REVERB_LEVEL_CONTROL          0x02
-#define USB_AUDIO_REVERB_TIME_CONTROL           0x03
-#define USB_AUDIO_REVERB_FEEDBACK_CONTROL       0x04
-
-// chorus processing unit control selectors
-#define USB_AUDIO_CH_ENABLE_CONTROL             0x01
-#define USB_AUDIO_CHORUS_LEVEL_CONTROL          0x02
-#define USB_AUDIO_CHORUS_RATE_CONTROL           0x03
-#define USB_AUDIO_CHORUS_DEPTH_CONTROL          0x04
-
-// dynamic range compressor processing unit control selectors
-#define USB_AUDIO_DR_ENABLE_CONTROL             0x01
-#define USB_AUDIO_COMPRESSION_RATE_CONTROL      0x02
-#define USB_AUDIO_MAXAMPL_CONTROL               0x03
-#define USB_AUDIO_THRESHOLD_CONTROL             0x04
-#define USB_AUDIO_ATTACK_TIME                   0x05
-#define USB_AUDIO_RELEASE_TIME                  0x06
-
-// extension unit control selectors
-#define USB_AUDIO_XU_ENABLE_CONTROL             0x01
-
-// endpoint control selectors
-#define USB_AUDIO_SAMPLING_FREQ_CONTROL         0x01
-#define USB_AUDIO_PITCH_CONTROL                 0x02
-
-// USB audio terminal types
-#define USB_AUDIO_TERMINAL_USB_UNDEFINED                0x0100
-#define USB_AUDIO_TERMINAL_USB_STREAMING                0x0101
-#define USB_AUDIO_TERMINAL_USB_VENDOR                   0x01FF
-#define USB_AUDIO_TERMINAL_INPUT_UNDEFINED              0x0200
-#define USB_AUDIO_TERMINAL_MICROPHONE                   0x0201
-#define USB_AUDIO_TERMINAL_DESKTOP_MICROPHONE           0x0202
-#define USB_AUDIO_TERMINAL_PERSONAL_MICROPHONE          0x0203
-#define USB_AUDIO_TERMINAL_OMNI_DIRECTIONAL_MICROPHONE  0x0204
-#define USB_AUDIO_TERMINAL_MICROPHONE_ARRAY             0x0205
-#define USB_AUDIO_TERMINAL_PROCESSING_MICROPHONE_ARRAY  0x0206
-#define USB_AUDIO_TERMINAL_OUTPUT_UNDEFINED             0x0300
-#define USB_AUDIO_TERMINAL_SPEAKER                      0x0301
-#define USB_AUDIO_TERMINAL_HEADPHONES                   0x0302
-#define USB_AUDIO_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO   0x0303
-#define USB_AUDIO_TERMINAL_DESKTOP_SPEAKER              0x0304
-#define USB_AUDIO_TERMINAL_ROOM_SPEAKER                 0x0305
-#define USB_AUDIO_TERMINAL_COMMUNICATION_SPEAKER        0x0306
-#define USB_AUDIO_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER     0x0307
-#define USB_AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED      0x0400
-#define USB_AUDIO_TERMINAL_HANDSET                      0x0401
-#define USB_AUDIO_TERMINAL_HEADSET                      0x0402
-#define USB_AUDIO_TERMINAL_SPEAKERPHONE                 0x0403
-#define USB_AUDIO_TERMINAL_ECHO_SUPPRESSING_SPEAKERPHONE 0x0404
-#define USB_AUDIO_TERMINAL_ECHO_CANCELING_SPEAKERPHONE  0x0405
-#define USB_AUDIO_TERMINAL_TELEPHONY_UNDEFINED          0x0500
-#define USB_AUDIO_TERMINAL_PHONE_LINE                   0x0501
-#define USB_AUDIO_TERMINAL_TELEPHONE                    0x0502
-#define USB_AUDIO_TERMINAL_DOWN_LINE_PHONE              0x0503
-#define USB_AUDIO_TERMINAL_EXTERNAL_UNDEFINED           0x0600
-#define USB_AUDIO_TERMINAL_ANALOG_CONNECTOR             0x0601
-#define USB_AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE      0x0602
-#define USB_AUDIO_TERMINAL_LINE_CONNECTOR               0x0603
-#define USB_AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR       0x0604
-#define USB_AUDIO_TERMINAL_SPDIF_INTERFACE              0x0605
-#define USB_AUDIO_TERMINAL_1394_DA_STREAM               0x0606
-#define USB_AUDIO_TERMINAL_1394_DV_STREAM_SOUNDTRACK    0x0607
-#define USB_AUDIO_TERMINAL_EMBEDDED_UNDEFINED           0x0700
-#define USB_AUDIO_TERMINAL_LEVEL_CALIBRATION_NOISE_SOURCE 0x0701
-#define USB_AUDIO_TERMINAL_EQUALIZATION_NOISE           0x0702
-#define USB_AUDIO_TERMINAL_CD_PLAYER                    0x0703
-#define USB_AUDIO_TERMINAL_DAT                          0x0704
-#define USB_AUDIO_TERMINAL_DCC                          0x0705
-#define USB_AUDIO_TERMINAL_MINI_DISK                    0x0706
-#define USB_AUDIO_TERMINAL_ANALOG_TAPE                  0x0707
-#define USB_AUDIO_TERMINAL_PHONOGRAPH                   0x0708
-#define USB_AUDIO_TERMINAL_VCR_AUDIO                    0x0709
-#define USB_AUDIO_TERMINAL_VIDEO_DISK_AUDIO             0x070A
-#define USB_AUDIO_TERMINAL_DVD_AUDIO                    0x070B
-#define USB_AUDIO_TERMINAL_TV_TUNER_AUDIO               0x070C
-#define USB_AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO     0x070D
-#define USB_AUDIO_TERMINAL_CABLE_TUNER_AUDIO            0x070E
-#define USB_AUDIO_TERMINAL_DSS_AUDIO                    0x070F
-#define USB_AUDIO_TERMINAL_RADIO_RECEIVER               0x0710
-#define USB_AUDIO_TERMINAL_RADIO_TRANSMITTER            0x0711
-#define USB_AUDIO_TERMINAL_MULTI_TRACK_RECORDER         0x0712
-#define USB_AUDIO_TERMINAL_SYNTHESIZER                  0x0713
-
-////////////////////////////////////////////////////
-//
-// Audio streaming interface constants
-//
-////////////////////////////////////////////////////
-
-// Audio stream class-specific AS interface descriptor subtypes
-#define USB_AUDIO_AS_GENERAL                    0x01
-#define USB_AUDIO_AS_FORMAT_TYPE                0x02
-#define USB_AUDIO_AS_FORMAT_SPECIFIC            0x03
-
-// wFormatTag values present in the class specific AS header
-// Defined in Section A.1 of USB Device Class Definition for Audio Data Formats
-#define USB_AUDIO_AS_FT_TYPE_I_UNDEFINED        0x0000
-#define USB_AUDIO_AS_FT_PCM                     0x0001
-#define USB_AUDIO_AS_FT_PCM8                    0x0002
-#define USB_AUDIO_AS_FT_IEEE_FLOAT              0x0003
-#define USB_AUDIO_AS_FT_ALAW                    0x0004
-#define USB_AUDIO_AS_FT_MULAW                   0x0005
-#define USB_AUDIO_AS_FT_TYPE_II_UNDEFINED       0x1000
-#define USB_AUDIO_AS_FT_MPEG                    0x1001
-#define USB_AUDIO_AS_FT_AC3                     0x1002
-#define USB_AUDIO_AS_FT_TYPE_III_UNDEFINED      0x2000
-#define USB_AUDIO_AS_FT_IEC1937_AC3             0x2001
-#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L1        0x2002
-#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L23       0x2003
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_EXT       0x2004
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L1_LS     0x2005
-#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L23_LS    0x2006
-
-// Audio stream class-specific format-specific types
-#define USB_AUDIO_FORMAT_TYPE_UNDEFINED         0x00
-#define USB_AUDIO_FORMAT_TYPE_I                 0x01
-#define USB_AUDIO_FORMAT_TYPE_II                0x02
-#define USB_AUDIO_FORMAT_TYPE_III               0x03
-
-////////////////////////////////////////////////////
-//
-// MIDI streaming interface constants
-//
-////////////////////////////////////////////////////
-
-// MIDI class specific MS interface descriptor subtypes
-#define USB_MIDI_MS_HEADER                      0x01
-#define USB_MIDI_IN_JACK                        0x02
-#define USB_MIDI_OUT_JACK                       0x03
-#define USB_MIDI_ELEMENT                        0x04
-
-// MIDI class specific MS endpoint descriptor subtypes
-#define USB_MIDI_MS_GENERAL                     0x01
-
-// MIDI IN and OUT jack types
-#define USB_MIDI_JACK_EMBEDDED                  0x01
-#define USB_MIDI_JACK_INTERNAL                  0x02
-
-// MIDI endpoint control selectors
-#define USB_MIDI_ASSOCIATION_CONTROL            0x01
-
-
-// Top level header structure shared by all USB audio descriptors.
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;
-} __PACKED usb_audio_desc_header;
-
-// Audio Control Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_HEADER
-    uint16_t bcdADC;
-    uint16_t wTotalLength;
-    uint8_t bInCollection;
-    uint8_t baInterfaceNr[];
-} __PACKED usb_audio_ac_header_desc;
-
-// Common header structure shared by all unit and terminal descriptors found in
-// an Audio Control interface descriptor.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_.*_(TERMINAL|UNIT)
-    uint8_t bID;
-} __PACKED usb_audio_ac_ut_desc;
-
-// Common header structure shared by all terminal descriptors found in an Audio
-// Control interface descriptor.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_(INPUT|OUTPUT)_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-} __PACKED usb_audio_ac_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_INPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t iTerminal;
-} __PACKED usb_audio_ac_input_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_OUTPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bSourceID;
-    uint8_t iTerminal;
-} __PACKED usb_audio_ac_output_terminal_desc;
-
-// Note: Mixer unit descriptors contain two inlined variable length arrays, each
-// with descriptor data following them.  They are therefor described using 3
-// structure definitions which are logically concatenated, but separated by the
-// inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_MIXER_UNIT
-    uint8_t bUnitID;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_mixer_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_mixer_unit_desc_1;
-
-typedef struct {
-    uint8_t iMixer;
-} __PACKED usb_audio_ac_mixer_unit_desc_2;
-
-// Note: Selector unit descriptors contain an inlined variable length array with
-// descriptor data following it.  They are therefor described using 2 structure
-// definitions which are logically concatenated, but separated by the inline
-// array.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_SELECTOR_UNIT
-    uint8_t bUnitID;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_selector_unit_desc_0;
-
-typedef struct {
-    uint8_t iSelector;
-} __PACKED usb_audio_ac_selector_unit_desc_1;
-
-// Note: Feature unit descriptors contain an inlined variable length array with
-// descriptor data following it.  They are therefor described using 2 structure
-// definitions which are logically concatenated, but separated by the inline
-// array.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_FEATURE_UNIT
-    uint8_t bUnitID;
-    uint8_t bSourceID;
-    uint8_t bControlSize;
-    uint8_t bmaControls[];
-} __PACKED usb_audio_ac_feature_unit_desc_0;
-
-typedef struct {
-    uint8_t iFeature;
-} __PACKED usb_audio_ac_feature_unit_desc_1;
-
-// Note: Processing unit descriptors contain two inlined variable length arrays,
-// each with descriptor data following them.  They are therefor described using
-// 3 structure definitions which are logically concatinated, but separated by
-// the inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_PROCESSING_UNIT
-    uint8_t bUnitID;
-    uint16_t wProcessType;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_processing_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bControlSize;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_processing_unit_desc_1;
-
-typedef struct {
-    uint8_t iProcessing;
-    // Note: The Process-specific control structure follows this with the
-    // structure type determined by wProcessType
-    // TODO(johngro) : Define the process specific control structures.  As of
-    // the 1.0 revision of the USB audio spec, the types to be defined are...
-    //
-    // ** Up/Down-mix
-    // ** Dolby Prologic
-    // ** 3D-Stereo Extender
-    // ** Reverberation
-    // ** Chorus
-    // ** Dynamic Range Compressor
-} __PACKED usb_audio_ac_processing_unit_desc_2;
-
-// Note: Extension unit descriptors contain two inlined variable length arrays,
-// each with descriptor data following them.  They are therefor described using
-// 3 structure definitions which are logically concatenated, but separated by
-// the inline arrays.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_EXTENSION_UNIT
-    uint8_t bUnitID;
-    uint16_t wExtensionCode;
-    uint8_t bNrInPins;
-    uint8_t baSourceID[];
-} __PACKED usb_audio_ac_extension_unit_desc_0;
-
-typedef struct {
-    uint8_t bNrChannels;
-    uint16_t wChannelConfig;
-    uint8_t iChannelNames;
-    uint8_t bControlSize;
-    uint8_t bmControls[];
-} __PACKED usb_audio_ac_extension_unit_desc_1;
-
-typedef struct {
-    uint8_t iExtension;
-} __PACKED usb_audio_ac_extension_unit_desc_2;
-
-// Audio Streaming Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_GENERAL
-    uint8_t bTerminalLink;
-    uint8_t bDelay;
-    uint16_t wFormatTag;
-} __PACKED usb_audio_as_header_desc;
-
-typedef struct {
-    uint8_t freq[3];            // 24 bit unsigned integer, little-endian
-} __PACKED usb_audio_as_samp_freq;
-
-// Common header used by all format type descriptors
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
-    uint8_t bFormatType;
-} __PACKED usb_audio_as_format_type_hdr;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
-    uint8_t bFormatType;            // USB_AUDIO_FORMAT_TYPE_I
-    uint8_t bNrChannels;
-    uint8_t bSubFrameSize;
-    uint8_t bBitResolution;
-    uint8_t bSamFreqType;           // number of sampling frequencies
-    usb_audio_as_samp_freq tSamFreq[]; // list of sampling frequencies (3 bytes each)
-} __PACKED usb_audio_as_format_type_i_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_AUDIO_EP_GENERAL
-    uint8_t bmAttributes;
-    uint8_t bLockDelayUnits;
-    uint16_t wLockDelay;
-} __PACKED usb_audio_as_isoch_ep_desc;
-
-// MIDI Streaming Interface descriptor definitions
-//
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_HEADER
-    uint16_t bcdMSC;
-    uint16_t wTotalLength;
-} __PACKED usb_midi_ms_header_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_IN_JACK
-    uint8_t bJackType;
-    uint8_t bJackID;
-    uint8_t iJack;
-} __PACKED usb_midi_ms_in_jack_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_MIDI_OUT_JACK
-    uint8_t bJackType;
-    uint8_t bJackID;
-    uint8_t bNrInputPins;
-    uint8_t baSourceID;
-    uint8_t baSourcePin;
-} __PACKED usb_midi_ms_out_jack_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_GENERAL
-    uint8_t bNumEmbMIDIJack;
-    uint8_t baAssocJackID[];
-} __PACKED usb_midi_ms_endpoint_desc;
-
-__END_CDECLS;
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-cdc.h b/arch/x64/sysroot/include/zircon/hw/usb-cdc.h
deleted file mode 100644
index f64a422..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-cdc.h
+++ /dev/null
@@ -1,138 +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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-
-/* CDC Subclasses for the Communications Interface Class */
-#define USB_CDC_SUBCLASS_DIRECT_LINE       0x01
-#define USB_CDC_SUBCLASS_ABSTRACT          0x02
-#define USB_CDC_SUBCLASS_TELEPHONE         0x03
-#define USB_CDC_SUBCLASS_MULTI_CHANNEL     0x04
-#define USB_CDC_SUBCLASS_CAPI              0x05
-#define USB_CDC_SUBCLASS_ETHERNET          0x06
-#define USB_CDC_SUBCLASS_ATM               0x07
-#define USB_CDC_SUBCLASS_WIRELESS_HANDSET  0x08
-#define USB_CDC_SUBCLASS_DEVICE_MGMT       0x09
-#define USB_CDC_SUBCLASS_MOBILE_DIRECT     0x0A
-#define USB_CDC_SUBCLASS_OBEX              0x0B
-#define USB_CDC_SUBCLASS_ETHERNET_EMU      0x0C
-#define USB_CDC_SUBCLASS_NETWORK_CTRL      0x0D
-
-/* CDC Descriptor SubTypes */
-#define USB_CDC_DST_HEADER                    0x00
-#define USB_CDC_DST_CALL_MGMT                 0x01
-#define USB_CDC_DST_ABSTRACT_CTRL_MGMT        0x02
-#define USB_CDC_DST_DIRECT_LINE_MGMT          0x03
-#define USB_CDC_DST_TELEPHONE_RINGER          0x04
-#define USB_CDC_DST_TELEPHONE_CALL_REPORTING  0x05
-#define USB_CDC_DST_UNION                     0x06
-#define USB_CDC_DST_COUNTRY_SELECTION         0x07
-#define USB_CDC_DST_TELEPHONE_OP_MODES        0x08
-#define USB_CDC_DST_USB_TERMINAL              0x09
-#define USB_CDC_DST_NETWORK_CHANNEL           0x0A
-#define USB_CDC_DST_PROTOCOL_UNIT             0x0B
-#define USB_CDC_DST_EXTENSION_UNIT            0x0C
-#define USB_CDC_DST_MULTI_CHANNEL_MGMT        0x0D
-#define USB_CDC_DST_CAPI_CTRL_MGMT            0x0E
-#define USB_CDC_DST_ETHERNET                  0x0F
-#define USB_CDC_DST_ATM_NETWORKING            0x10
-#define USB_CDC_DST_WIRELESS_HANDSET_CTRL     0x11
-#define USB_CDC_DST_MOBILE_DIRECT_LINE        0x12
-#define USB_CDC_DST_MDLM_DETAIL               0x13
-#define USB_CDC_DST_DEVICE_MGMT               0x14
-#define USB_CDC_DST_OBEX                      0x15
-#define USB_CDC_DST_COMMAND_SET               0x16
-#define USB_CDC_DST_COMMAND_SET_DETAIL        0x17
-#define USB_CDC_DST_TELEPHONE_CTRL            0x18
-#define USB_CDC_DST_OBEX_SERVICE_ID           0x19
-#define USB_CDC_DST_NCM                       0x1A
-
-/* CDC Class-Specific Notification Codes */
-#define USB_CDC_NC_NETWORK_CONNECTION       0x00
-#define USB_CDC_NC_RESPONSE_AVAILABLE       0x01
-#define USB_CDC_NC_SERIAL_STATE             0x20
-#define USB_CDC_NC_CONNECTION_SPEED_CHANGE  0x2A
-
-/* CDC Ethernet Class-Specific Request Codes */
-#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
-#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
-#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
-#define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
-#define USB_CDC_GET_ETHERNET_STATISTIC          0x44
-
-/* CDC Class-Specific Requests */
-#define USB_CDC_SEND_ENCAPSULATED_COMMAND   0x00
-#define USB_CDC_GET_ENCAPSULATED_RESPONSE   0x01
-
-__BEGIN_CDECLS;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_HEADER
-    uint16_t bcdCDC;
-} __attribute__ ((packed)) usb_cs_header_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_CALL_MGMT
-    uint8_t bmCapabilities;
-    uint8_t bDataInterface;
-} __attribute__ ((packed)) usb_cs_call_mgmt_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_ABSTRACT_CTRL_MGMT
-    uint8_t bmCapabilities;
-} __attribute__ ((packed)) usb_cs_abstract_ctrl_mgmt_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
-    uint8_t bControlInterface;
-    uint8_t bSubordinateInterface[];
-} __attribute__ ((packed)) usb_cs_union_interface_descriptor_t;
-
-// fixed size version of usb_cs_union_interface_descriptor_t
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
-    uint8_t bControlInterface;
-    uint8_t bSubordinateInterface;
-} __attribute__ ((packed)) usb_cs_union_interface_descriptor_1_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
-    uint8_t bDescriptorSubType; // USB_CDC_DST_ETHERNET
-    uint8_t iMACAddress;
-    uint32_t bmEthernetStatistics;
-    uint16_t wMaxSegmentSize;
-    uint16_t wNumberMCFilters;
-    uint8_t bNumberPowerFilters;
-} __attribute__ ((packed)) usb_cs_ethernet_interface_descriptor_t;
-
-typedef struct {
-    uint8_t bmRequestType;
-    uint8_t bNotification;
-    uint16_t wValue;
-    uint16_t wIndex;
-    uint16_t wLength;
-} __attribute__ ((packed)) usb_cdc_notification_t;
-
-typedef struct {
-    usb_cdc_notification_t notification;
-    uint32_t downlink_br;
-    uint32_t uplink_br;
- } __attribute__ ((packed)) usb_cdc_speed_change_notification_t;
-
-__END_CDECLS;
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-hid.h b/arch/x64/sysroot/include/zircon/hw/usb-hid.h
deleted file mode 100644
index d8be878..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-hid.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-__BEGIN_CDECLS;
-
-/* HID Request Values */
-#define USB_HID_GET_REPORT                  0x01
-#define USB_HID_GET_IDLE                    0x02
-#define USB_HID_GET_PROTOCOL                0x03
-#define USB_HID_SET_REPORT                  0x09
-#define USB_HID_SET_IDLE                    0x0A
-#define USB_HID_SET_PROTOCOL                0x0B
-
-typedef struct {
-    uint8_t bDescriptorType;
-    uint16_t wDescriptorLength;
-} __attribute__((packed)) usb_hid_descriptor_entry_t;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;
-    uint16_t bcdHID;
-    uint8_t bCountryCode;
-    uint8_t bNumDescriptors;
-    usb_hid_descriptor_entry_t descriptors[];
-} __attribute__((packed)) usb_hid_descriptor_t;
-
-__END_CDECLS;
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-hub.h b/arch/x64/sysroot/include/zircon/hw/usb-hub.h
deleted file mode 100644
index 2a8b395..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-hub.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-__BEGIN_CDECLS;
-
-// Hub request types
-#define USB_RECIP_HUB   (USB_TYPE_CLASS | USB_RECIP_DEVICE)
-#define USB_RECIP_PORT  (USB_TYPE_CLASS | USB_RECIP_OTHER)
-
-// Hub requests
-#define USB_HUB_SET_DEPTH       12
-
-// Hub descriptor types
-#define USB_HUB_DESC_TYPE       0x29
-#define USB_HUB_DESC_TYPE_SS    0x2A    // for superspeed hubs
-
-// Hub Class Feature Selectors (USB 2.0 spec Table 11.17)
-#define USB_FEATURE_C_HUB_LOCAL_POWER   0
-#define USB_FEATURE_C_HUB_OVER_CURRENT  1
-#define USB_FEATURE_PORT_CONNECTION     0
-#define USB_FEATURE_PORT_ENABLE         1
-#define USB_FEATURE_PORT_SUSPEND        2
-#define USB_FEATURE_PORT_OVER_CURRENT   3
-#define USB_FEATURE_PORT_RESET          4
-#define USB_FEATURE_PORT_LINK_STATE     5
-#define USB_FEATURE_PORT_POWER          8
-#define USB_FEATURE_PORT_LOW_SPEED      9
-#define USB_FEATURE_C_PORT_CONNECTION   16
-#define USB_FEATURE_C_PORT_ENABLE       17
-#define USB_FEATURE_C_PORT_SUSPEND      18
-#define USB_FEATURE_C_PORT_OVER_CURRENT 19
-#define USB_FEATURE_C_PORT_RESET        20
-#define USB_FEATURE_PORT_TEST           21
-#define USB_FEATURE_PORT_INDICATOR      22
-#define USB_FEATURE_PORT_INDICATOR      22
-#define USB_FEATURE_PORT_U1_TIMEOUT     23
-#define USB_FEATURE_PORT_U2_TIMEOUT     24
-#define USB_FEATURE_C_PORT_LINK_STATE   25
-#define USB_FEATURE_C_PORT_CONFIG_ERROR 26
-#define USB_FEATURE_PORT_REMOTE_WAKE_MASK 27
-#define USB_FEATURE_BH_PORT_RESET       28
-#define USB_FEATURE_C_BH_PORT_RESET     29
-#define USB_FEATURE_FORCE_LINKPM_ACCEPT 30
-
-typedef struct {
-    uint8_t bDescLength;
-    uint8_t bDescriptorType;
-    uint8_t bNbrPorts;
-    uint16_t wHubCharacteristics;
-    uint8_t bPowerOn2PwrGood;
-    uint8_t bHubContrCurrent;
-    union {
-        // USB 2.0
-        struct {
-            // variable length depending on number of ports
-            uint8_t  DeviceRemovable[4];
-            uint8_t  PortPwrCtrlMask[4];
-        }  __attribute__ ((packed)) hs;
-        // USB 3.0
-        struct {
-            uint8_t bHubHdrDecLat;
-            uint16_t wHubDelay;
-            uint16_t DeviceRemovable;
-        } __attribute__ ((packed)) ss;
-    } __attribute__ ((packed));
-} __attribute__ ((packed)) usb_hub_descriptor_t;
-
-typedef struct {
-    uint16_t wHubStatus;
-    uint16_t wHubChange;
-} __attribute__ ((packed)) usb_hub_status_t;
-
-// wHubStatus bits
-#define USB_HUB_LOCAL_POWER         (1 << 0)
-#define USB_HUB_OVER_CURRENT        (1 << 1)
-
-typedef struct {
-    uint16_t wPortStatus;
-    uint16_t wPortChange;
-} __attribute__ ((packed)) usb_port_status_t;
-
-// Port Status bits
-#define USB_PORT_CONNECTION         (1 << 0)
-#define USB_PORT_ENABLE             (1 << 1)
-#define USB_PORT_SUSPEND            (1 << 2)    // USB 2.0 only
-#define USB_PORT_OVER_CURRENT       (1 << 3)
-#define USB_PORT_RESET              (1 << 4)
-#define USB_PORT_POWER              (1 << 8)    // USB 2.0 only
-#define USB_PORT_LOW_SPEED          (1 << 9)    // USB 2.0 only
-#define USB_PORT_HIGH_SPEED         (1 << 10)   // USB 2.0 only
-#define USB_PORT_TEST_MODE          (1 << 11)   // USB 2.0 only
-#define USB_PORT_INDICATOR_CONTROL  (1 << 12)   // USB 2.0 only
-
-// Port Status Changed bits
-#define USB_C_PORT_CONNECTION       (1 << 0)
-#define USB_C_PORT_ENABLE           (1 << 1)    // USB 2.0 only
-#define USB_C_PORT_SUSPEND          (1 << 2)    // USB 2.0 only
-#define USB_C_PORT_OVER_CURRENT     (1 << 3)
-#define USB_C_PORT_RESET            (1 << 4)
-#define USB_C_BH_PORT_RESET         (1 << 5)    // USB 3.0 only
-#define USB_C_PORT_LINK_STATE       (1 << 6)    // USB 3.0 only
-#define USB_C_PORT_CONFIG_ERROR     (1 << 7)    // USB 3.0 only
-#define USB_C_PORT_POWER            (1 << 8)    // USB 2.0 only
-#define USB_C_PORT_LOW_SPEED        (1 << 9)    // USB 2.0 only
-#define USB_C_PORT_HIGH_SPEED       (1 << 10)   // USB 2.0 only
-#define USB_C_PORT_TEST_MODE        (1 << 11)   // USB 2.0 only
-#define USB_C_PORT_INDICATOR_CONTROL (1 << 12)   // USB 2.0 only
-
-__END_CDECLS;
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-mass-storage.h b/arch/x64/sysroot/include/zircon/hw/usb-mass-storage.h
deleted file mode 100644
index f2d1d80..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-mass-storage.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// 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.
-
-#pragma once
-
-// clang-format off
-
-// SCSI commands
-#define UMS_TEST_UNIT_READY          0x00
-#define UMS_REQUEST_SENSE            0x03
-#define UMS_INQUIRY                  0x12
-#define UMS_MODE_SELECT6             0x15
-#define UMS_MODE_SENSE6              0x1A
-#define UMS_START_STOP_UNIT          0x1B
-#define UMS_TOGGLE_REMOVABLE         0x1E
-#define UMS_READ_FORMAT_CAPACITIES   0x23
-#define UMS_READ_CAPACITY10          0x25
-#define UMS_READ10                   0x28
-#define UMS_WRITE10                  0x2A
-#define UMS_SYNCHRONIZE_CACHE        0x35
-#define UMS_MODE_SELECT10            0x55
-#define UMS_MODE_SENSE10             0x5A
-#define UMS_READ16                   0x88
-#define UMS_WRITE16                  0x8A
-#define UMS_READ_CAPACITY16          0x9E
-#define UMS_READ12                   0xA8
-#define UMS_WRITE12                  0xAA
-
-// control request values
-#define USB_REQ_RESET               0xFF
-#define USB_REQ_GET_MAX_LUN         0xFE
-
-// error codes for CSW processing
-typedef uint32_t csw_status_t;
-#define CSW_SUCCESS      ((csw_status_t)0)
-#define CSW_FAILED       ((csw_status_t)1)
-#define CSW_PHASE_ERROR  ((csw_status_t)2)
-#define CSW_INVALID      ((csw_status_t)3)
-#define CSW_TAG_MISMATCH ((csw_status_t)4)
-
-// signatures in header and status
-#define CBW_SIGNATURE               0x43425355
-#define CSW_SIGNATURE               0x53425355
-
-// transfer lengths
-#define UMS_INQUIRY_TRANSFER_LENGTH                0x24
-#define UMS_REQUEST_SENSE_TRANSFER_LENGTH          0x12
-#define UMS_READ_FORMAT_CAPACITIES_TRANSFER_LENGTH 0xFC
-
-// 6 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint16_t    lba;    // logical block address
-    uint8_t     length;
-    uint8_t     control;
-} __PACKED scsi_command6_t;
-static_assert(sizeof(scsi_command6_t) == 6, "");
-
-// 10 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint32_t    lba;    // logical block address
-    uint8_t     misc2;
-    uint8_t     length_hi; // break length into two pieces to avoid odd alignment
-    uint8_t     length_lo;
-    uint8_t     control;
-} __PACKED scsi_command10_t;
-static_assert(sizeof(scsi_command10_t) == 10, "");
-
-// 12 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint32_t    lba;    // logical block address
-    uint32_t    length;
-    uint8_t     misc2;
-    uint8_t     control;
-} __PACKED scsi_command12_t;
-static_assert(sizeof(scsi_command12_t) == 12, "");
-
-// 16 Byte SCSI command
-// This is big endian
-typedef struct {
-    uint8_t     opcode;
-    uint8_t     misc;
-    uint64_t    lba;    // logical block address
-    uint32_t    length;
-    uint8_t     misc2;
-    uint8_t     control;
-} __PACKED scsi_command16_t;
-static_assert(sizeof(scsi_command16_t) == 16, "");
-
-// SCSI Read Capacity 10 payload
-// This is big endian
-typedef struct {
-    uint32_t    lba;
-    uint32_t    block_length;
-} __PACKED scsi_read_capacity_10_t;
-static_assert(sizeof(scsi_read_capacity_10_t) == 8, "");
-
-// SCSI Read Capacity 16 payload
-// This is big endian
-typedef struct {
-    uint64_t    lba;
-    uint32_t    block_length;
-    uint8_t     ptype_prot_en;  // bit 0: PROT_EN, bits 1-3: P_TYPE
-    uint8_t     resesrved[19];
-} __PACKED scsi_read_capacity_16_t;
-static_assert(sizeof(scsi_read_capacity_16_t) == 32, "");
-
-// SCSI Mode Sense 6 command
-typedef struct {
-    uint8_t     opcode; // UMS_MODE_SENSE6
-    uint8_t     disable_block_desc;
-    uint8_t     page;
-    uint8_t     subpage;
-    uint8_t     allocation_length;
-    uint8_t     control;
-} __PACKED scsi_mode_sense_6_command_t;
-static_assert(sizeof(scsi_mode_sense_6_command_t) == 6, "");
-
-// SCSI Mode Sense 6 data response
-typedef struct {
-    uint8_t     mode_data_length;
-    uint8_t     medium_type;
-    uint8_t     device_specific_param;
-    uint8_t     block_desc_length;
-} __PACKED scsi_mode_sense_6_data_t;
-#define MODE_SENSE_DSP_RO   0x80    //  bit 7 of device_specific_param: read-only
-
-// Command Block Wrapper
-typedef struct {
-    uint32_t    dCBWSignature;      // CBW_SIGNATURE
-    uint32_t    dCBWTag;
-    uint32_t    dCBWDataTransferLength;
-    uint8_t     bmCBWFlags;
-    uint8_t     bCBWLUN;
-    uint8_t     bCBWCBLength;
-    uint8_t     CBWCB[16];
-} __PACKED ums_cbw_t;
-static_assert(sizeof(ums_cbw_t) == 31, "");
-
-// Command Status Wrapper
-typedef struct {
-    uint32_t    dCSWSignature;      // CSW_SIGNATURE
-    uint32_t    dCSWTag;
-    uint32_t    dCSWDataResidue;
-    uint8_t     bmCSWStatus;
-} __PACKED ums_csw_t;
-static_assert(sizeof(ums_csw_t) == 13, "");
diff --git a/arch/x64/sysroot/include/zircon/hw/usb-video.h b/arch/x64/sysroot/include/zircon/hw/usb-video.h
deleted file mode 100644
index 1ff6e22..0000000
--- a/arch/x64/sysroot/include/zircon/hw/usb-video.h
+++ /dev/null
@@ -1,304 +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.
-
-#pragma once
-
-// clang-format off
-
-#include <zircon/compiler.h>
-
-__BEGIN_CDECLS;
-
-// video interface subclasses
-#define USB_SUBCLASS_VIDEO_CONTROL                 0x01
-#define USB_SUBCLASS_VIDEO_STREAMING               0x02
-#define USB_SUBCLASS_VIDEO_INTERFACE_COLLECTION    0x03
-
-// video class specific descriptor types
-#define USB_VIDEO_CS_DEVICE                        0x21
-#define USB_VIDEO_CS_CONFIGURATION                 0x22
-#define USB_VIDEO_CS_STRING                        0x23
-#define USB_VIDEO_CS_INTERFACE                     0x24
-#define USB_VIDEO_CS_ENDPOINT                      0x25
-
-// video class specific VC interface descriptor subtypes
-#define USB_VIDEO_VC_HEADER                        0x01
-#define USB_VIDEO_VC_INPUT_TERMINAL                0x02
-#define USB_VIDEO_VC_OUTPUT_TERMINAL               0x03
-#define USB_VIDEO_VC_SELECTOR_UNIT                 0x04
-#define USB_VIDEO_VC_PROCESSING_UNIT               0x05
-#define USB_VIDEO_VC_EXTENSION_UNIT                0x06
-#define USB_VIDEO_VC_ENCODING_UNIT                 0x07
-
-// video class specific VS interface descriptor subtypes
-#define USB_VIDEO_VS_INPUT_HEADER                  0x01
-#define USB_VIDEO_VS_OUTPUT_HEADER                 0x02
-#define USB_VIDEO_VS_STILL_IMAGE_FRAME             0x03
-#define USB_VIDEO_VS_FORMAT_UNCOMPRESSED           0x04
-#define USB_VIDEO_VS_FRAME_UNCOMPRESSED            0x05
-#define USB_VIDEO_VS_FORMAT_MJPEG                  0x06
-#define USB_VIDEO_VS_FRAME_MJPEG                   0x07
-#define USB_VIDEO_VS_FORMAT_MPEG2TS                0x0A
-#define USB_VIDEO_VS_FORMAT_DV                     0x0C
-#define USB_VIDEO_VS_COLORFORMAT                   0x0D
-#define USB_VIDEO_VS_FORMAT_FRAME_BASED            0x10
-#define USB_VIDEO_VS_FRAME_FRAME_BASED             0x11
-#define USB_VIDEO_VS_FORMAT_STREAM_BASED           0x12
-#define USB_VIDEO_VS_FORMAT_H264                   0x13
-#define USB_VIDEO_VS_FRAME_H264                    0x14
-#define USB_VIDEO_VS_FORMAT_H264_SIMULCAST         0x15
-#define USB_VIDEO_VS_FORMAT_VP8                    0x16
-#define USB_VIDEO_VS_FRAME_VP8                     0x17
-#define USB_VIDEO_VS_FORMAT_VP8_SIMULCAST          0x18
-
-// video class specific endpoint descriptor subtypes
-#define USB_VIDEO_EP_GENERAL                       0x01
-#define USB_VIDEO_EP_ENDPOINT                      0x02
-#define USB_VIDEO_EP_INTERRUPT                     0x03
-
-// video class specific request codes
-#define USB_VIDEO_SET_CUR                          0x01
-#define USB_VIDEO_SET_CUR_ALL                      0x11
-#define USB_VIDEO_GET_CUR                          0x81
-#define USB_VIDEO_GET_MIN                          0x82
-#define USB_VIDEO_GET_MAX                          0x83
-#define USB_VIDEO_GET_RES                          0x84
-#define USB_VIDEO_GET_LEN                          0x85
-#define USB_VIDEO_GET_INFO                         0x86
-#define USB_VIDEO_GET_DEF                          0x87
-#define USB_VIDEO_GET_CUR_ALL                      0x91
-#define USB_VIDEO_GET_MIN_ALL                      0x92
-#define USB_VIDEO_GET_MAX_ALL                      0x93
-#define USB_VIDEO_GET_RES_ALL                      0x94
-#define USB_VIDEO_GET_DEF_ALL                      0x97
-
-// video streaming interface control selectors
-#define USB_VIDEO_VS_PROBE_CONTROL                 0x01
-#define USB_VIDEO_VS_COMMIT_CONTROL                0x02
-#define USB_VIDEO_VS_STILL_PROBE_CONTROL           0x03
-#define USB_VIDEO_VS_STILL_COMMIT_CONTROL          0x04
-#define USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL   0x05
-#define USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL     0x06
-#define USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL    0x07
-#define USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL  0x08
-#define USB_VIDEO_VS_SYNCH_DELAY_CONTROL           0x09
-
-// header for usb_video_vc_* below
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;
-} __PACKED usb_video_vc_desc_header;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_HEADER
-    uint16_t bcdUVC;
-    uint16_t wTotalLength;
-    uint32_t dwClockFrequency;
-    uint8_t bInCollection;
-    uint8_t baInterfaceNr[];
-} __PACKED usb_video_vc_header_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_INPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t iTerminal;
-} __PACKED usb_video_vc_input_terminal_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_OUTPUT_TERMINAL
-    uint8_t bTerminalID;
-    uint16_t wTerminalType;
-    uint8_t bAssocTerminal;
-    uint8_t bSourceID;
-    uint8_t iTerminal;
-} __PACKED usb_video_vc_output_terminal_desc;
-
-// class specific VC interrupt endpoint descriptor
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_ENDPOINT
-    uint8_t bDescriptorSubtype;     // USB_ENDPOINT_INTERRUPT
-    uint16_t wMaxTransferSize;
-} __PACKED usb_video_vc_interrupt_endpoint_desc;
-
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubtype;     // USB_VIDEO_VS_HEADER
-    uint8_t bNumFormats;
-    uint16_t wTotalLength;
-    uint8_t bEndpointAddress;
-    uint8_t bmInfo;
-    uint8_t bTerminalLink;
-    uint8_t bStillCaptureMethod;
-    uint8_t bTriggerSupport;
-    uint8_t bTriggerUsage;
-    uint8_t bControlSize;
-    uint8_t bmaControls[];
-} __PACKED usb_video_vs_input_header_desc;
-
-#define GUID_LENGTH 16
-
-// A GUID consists of a:
-//  - four-byte integer
-//  - two-byte integer
-//  - two-byte integer
-//  - eight-byte array
-//
-// The string representation uses big endian format, so to convert it
-// to a byte array we need to reverse the byte order of the three integers.
-//
-// See USB Video Class revision 1.5, FAQ section 2.9
-// for GUID Data Structure Layout.
-
-#define USB_VIDEO_GUID_YUY2_STRING "32595559-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_YUY2_VALUE { \
-    0x59, 0x55, 0x59, 0x32, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_NV12_STRING "3231564E-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_NV12_VALUE { \
-    0x4e, 0x56, 0x31, 0x32, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_M420_STRING "3032344D-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_M420_VALUE { \
-    0x4d, 0x34, 0x32, 0x30, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-#define USB_VIDEO_GUID_I420_STRING "30323449-0000-0010-8000-00AA00389B71"
-#define USB_VIDEO_GUID_I420_VALUE { \
-    0x49, 0x34, 0x32, 0x30, \
-    0x00, 0x00, \
-    0x10, 0x00, \
-    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
-}
-
-// USB Video Payload Uncompressed
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_UNCOMPRESSED
-    uint8_t bFormatIndex;
-    uint8_t bNumFrameDescriptors;
-    uint8_t guidFormat[GUID_LENGTH];
-    uint8_t bBitsPerPixel;
-    uint8_t bDefaultFrameIndex;
-    uint8_t bAspectRatioX;
-    uint8_t bAspectRatioY;
-    uint8_t bmInterfaceFlags;
-    uint8_t bCopyProtect;
-} __PACKED usb_video_vs_uncompressed_format_desc;
-
-// USB Video Payload MJPEG
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_MJPEG
-    uint8_t bFormatIndex;
-    uint8_t bNumFrameDescriptors;
-    uint8_t bmFlags;
-    uint8_t bDefaultFrameIndex;
-    uint8_t bAspectRatioX;
-    uint8_t bAspectRatioY;
-    uint8_t bmInterfaceFlags;
-    uint8_t bCopyProtect;
-} __PACKED usb_video_vs_mjpeg_format_desc;
-
-// Uncompressed and MJPEG formats have the same frame descriptor structure.
-typedef struct {
-    uint8_t bLength;
-    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
-    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FRAME_UNCOMPRESSED / USB_VIDEO_VS_FRAME_MJPEG
-    uint8_t bFrameIndex;
-    uint8_t bmCapabilities;
-    uint16_t wWidth;
-    uint16_t wHeight;
-    uint32_t dwMinBitRate;
-    uint32_t dwMaxBitRate;
-    uint32_t dwMaxVideoFrameBufferSize;
-    uint32_t dwDefaultFrameInterval;
-    uint8_t bFrameIntervalType;
-    uint32_t dwFrameInterval[];
-} __PACKED usb_video_vs_frame_desc;
-
-// Stream negotiation
-#define USB_VIDEO_BM_HINT_FRAME_INTERVAL        (1 << 0)
-#define USB_VIDEO_BM_HINT_KEY_FRAME_RATE        (1 << 1)
-#define USB_VIDEO_BM_HINT_P_FRAME_RATE          (1 << 2)
-#define USB_VIDEO_BM_HINT_COMP_QUALITY          (1 << 3)
-#define USB_VIDEO_BM_HINT_COMP_WINDOW_SIZE      (1 << 4)
-
-typedef struct {
-   uint16_t bmHint;
-   uint8_t bFormatIndex;
-   uint8_t bFrameIndex;
-   uint32_t dwFrameInterval;
-   uint16_t wKeyFrameRate;
-   uint16_t wPFrameRate;
-   uint16_t wCompQuality;
-   uint16_t wCompWindowSize;
-   uint16_t wDelay;
-   uint32_t dwMaxVideoFrameSize;
-   uint32_t dwMaxPayloadTransferSize;
-   // The following fields are optional.
-   uint32_t dwClockFrequency;
-   uint8_t bmFramingInfo;
-   uint8_t bPreferedVersion;
-   uint8_t bMinVersion;
-   uint8_t bMaxVersion;
-   uint8_t bUsage;
-   uint8_t bBitDepthLuma;
-   uint8_t bmSettings;
-   uint8_t bMaxNumberOfRefFramesPlus1;
-   uint16_t bmRateControlModes;
-   uint32_t bmLayoutPerStream;
-} __PACKED usb_video_vc_probe_and_commit_controls;
-
-// For accessing payload bmHeaderInfo bitmap
-#define USB_VIDEO_VS_PAYLOAD_HEADER_FID         (1 << 0)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_EOF         (1 << 1)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_PTS         (1 << 2)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_SCR         (1 << 3)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_RES         (1 << 4)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_STI         (1 << 5)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_ERR         (1 << 6)
-#define USB_VIDEO_VS_PAYLOAD_HEADER_EOH         (1 << 7)
-
-// Common header for all payloads.
-typedef struct {
-    uint8_t bHeaderLength;
-    uint8_t bmHeaderInfo;
-
-} __PACKED usb_video_vs_payload_header;
-
-typedef struct {
-    uint8_t bHeaderLength;
-    uint8_t bmHeaderInfo;
-    uint32_t dwPresentationTime;
-    uint32_t scrSourceTimeClock;
-    // Frame number when the source clock was sampled.
-    uint16_t scrSourceClockSOFCounter;
-} __PACKED usb_video_vs_uncompressed_payload_header;
-
-__END_CDECLS;
-
diff --git a/arch/x64/sysroot/include/zircon/hw/usb.h b/arch/x64/sysroot/include/zircon/hw/usb.h
index 697f7f0..c62e948 100644
--- a/arch/x64/sysroot/include/zircon/hw/usb.h
+++ b/arch/x64/sysroot/include/zircon/hw/usb.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_HW_USB_H_
+#define SYSROOT_ZIRCON_HW_USB_H_
 
 // clang-format off
 
@@ -10,7 +11,7 @@
 #include <stdint.h>
 #include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // maximum number of endpoints per device
 #define USB_MAX_EPS                     32
@@ -59,11 +60,28 @@
 #define USB_CLASS_DIAGNOSTIC                0xdc
 #define USB_CLASS_WIRELESS                  0xe0
 #define USB_CLASS_MISC                      0xef
+#define USB_CLASS_APPLICATION_SPECIFIC      0xfe
 #define USB_CLASS_VENDOR                    0xFf
 
+#define USB_SUBCLASS_COMM_ACM               0x02
+
+#define USB_SUBCLASS_WIRELESS_MISC          0x01
+#define USB_PROTOCOL_WIRELESS_MISC_RNDIS    0x03
+
+#define USB_SUBCLASS_MSC_RNDIS              0x04
+#define USB_PROTOCOL_MSC_RNDIS_ETHERNET     0x01
+
 #define USB_SUBCLASS_MSC_SCSI               0x06
 #define USB_PROTOCOL_MSC_BULK_ONLY          0x50
 
+#define USB_SUBCLASS_DFU                    0x01
+#define USB_PROTOCOL_DFU                    0x02
+
+#define USB_SUBCLASS_VENDOR                 0xFF
+#define USB_PROTOCOL_TEST_FTDI              0x01
+#define USB_PROTOCOL_TEST_HID_ONE_ENDPOINT  0x02
+#define USB_PROTOCOL_TEST_HID_TWO_ENDPOINT  0x03
+
 /* Descriptor Types */
 #define USB_DT_DEVICE                      0x01
 #define USB_DT_CONFIG                      0x02
@@ -196,6 +214,9 @@
     uint16_t wMaxPacketSize;
     uint8_t bInterval;
 } __attribute__ ((packed)) usb_endpoint_descriptor_t;
+#define usb_ep_num(ep)          ((ep)->bEndpointAddress & USB_ENDPOINT_NUM_MASK)
+// usb_ep_num2() useful with you have bEndpointAddress outside of a descriptor.
+#define usb_ep_num2(addr)       ((addr) & USB_ENDPOINT_NUM_MASK)
 #define usb_ep_direction(ep)    ((ep)->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
 #define usb_ep_type(ep)         ((ep)->bmAttributes & USB_ENDPOINT_TYPE_MASK)
 #define usb_ep_sync_type(ep)    ((ep)->bmAttributes & USB_ENDPOINT_SYNCHRONIZATION_MASK)
@@ -207,6 +228,18 @@
 
 typedef struct {
     uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_DEVICE_QUALIFIER
+    uint16_t bcdUSB;
+    uint8_t bDeviceClass;
+    uint8_t bDeviceSubClass;
+    uint8_t bDeviceProtocol;
+    uint8_t bMaxPacketSize0;
+    uint8_t bNumConfigurations;
+    uint8_t bReserved;
+} __attribute__ ((packed)) usb_device_qualifier_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
     uint8_t bDescriptorType;    // USB_DT_SS_EP_COMPANION
     uint8_t bMaxBurst;
     uint8_t bmAttributes;
@@ -239,4 +272,18 @@
     uint8_t bDescriptorSubType;
 } __attribute__ ((packed)) usb_cs_interface_descriptor_t;
 
-__END_CDECLS;
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_STRING
+    uint16_t wLangIds[127];
+} __attribute__ ((packed)) usb_langid_desc_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_STRING
+    uint16_t code_points[127];
+} __attribute__ ((packed)) usb_string_desc_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/audio.h b/arch/x64/sysroot/include/zircon/hw/usb/audio.h
new file mode 100644
index 0000000..4e68f87
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/audio.h
@@ -0,0 +1,527 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_AUDIO_H_
+#define SYSROOT_ZIRCON_HW_USB_AUDIO_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+////////////////////////////////////////////////////
+//
+// General Audio interface constants
+//
+////////////////////////////////////////////////////
+
+// audio interface subclasses
+#define USB_SUBCLASS_AUDIO_CONTROL              0x01
+#define USB_SUBCLASS_AUDIO_STREAMING            0x02
+#define USB_SUBCLASS_MIDI_STREAMING             0x03
+
+// audio class specific descriptor types
+#define USB_AUDIO_CS_DEVICE                     0x21
+#define USB_AUDIO_CS_CONFIGURATION              0x22
+#define USB_AUDIO_CS_STRING                     0x23
+#define USB_AUDIO_CS_INTERFACE                  0x24
+#define USB_AUDIO_CS_ENDPOINT                   0x25
+
+////////////////////////////////////////////////////
+//
+// Audio Control interface constants
+//
+////////////////////////////////////////////////////
+
+// audio class specific AC interface descriptor subtypes
+#define USB_AUDIO_AC_HEADER                     0x01
+#define USB_AUDIO_AC_INPUT_TERMINAL             0x02
+#define USB_AUDIO_AC_OUTPUT_TERMINAL            0x03
+#define USB_AUDIO_AC_MIXER_UNIT                 0x04
+#define USB_AUDIO_AC_SELECTOR_UNIT              0x05
+#define USB_AUDIO_AC_FEATURE_UNIT               0x06
+#define USB_AUDIO_AC_PROCESSING_UNIT            0x07
+#define USB_AUDIO_AC_EXTENSION_UNIT             0x08
+
+// processing unit process types
+#define USB_AUDIO_UP_DOWN_MIX_PROCESS           0x01
+#define USB_AUDIO_DOLBY_PROLOGIC_PROCESS        0x02
+#define USB_AUDIO_3D_STEREO_EXTENDER_PROCESS    0x03
+#define USB_AUDIO_REVERBERATION_PROCESS         0x04
+#define USB_AUDIO_CHORUS_PROCESS                0x05
+#define USB_AUDIO_DYN_RANGE_COMP_PROCESS        0x06
+
+// audio class specific endpoint descriptor subtypes
+#define USB_AUDIO_EP_GENERAL                    0x01
+
+// audio class specific request codes
+#define USB_AUDIO_SET_CUR                       0x01
+#define USB_AUDIO_GET_CUR                       0x81
+#define USB_AUDIO_SET_MIN                       0x02
+#define USB_AUDIO_GET_MIN                       0x82
+#define USB_AUDIO_SET_MAX                       0x03
+#define USB_AUDIO_GET_MAX                       0x83
+#define USB_AUDIO_SET_RES                       0x04
+#define USB_AUDIO_GET_RES                       0x84
+#define USB_AUDIO_SET_MEM                       0x05
+#define USB_AUDIO_GET_MEM                       0x85
+#define USB_AUDIO_GET_STAT                      0xFF
+
+// terminal control selectors
+#define USB_AUDIO_COPY_PROTECT_CONTROL          0x01
+
+// feature unit control selectors
+#define USB_AUDIO_MUTE_CONTROL                  0x01
+#define USB_AUDIO_VOLUME_CONTROL                0x02
+#define USB_AUDIO_BASS_CONTROL                  0x03
+#define USB_AUDIO_MID_CONTROL                   0x04
+#define USB_AUDIO_TREBLE_CONTROL                0x05
+#define USB_AUDIO_GRAPHIC_EQUALIZER_CONTROL     0x06
+#define USB_AUDIO_AUTOMATIC_GAIN_CONTROL        0x07
+#define USB_AUDIO_DELAY_CONTROL                 0x08
+#define USB_AUDIO_BASS_BOOST_CONTROL            0x09
+#define USB_AUDIO_LOUDNESS_CONTROL              0x0A
+
+// feature unit control support bitmasks
+#define USB_AUDIO_FU_BMA_MUTE                   (1u << 0u)
+#define USB_AUDIO_FU_BMA_VOLUME                 (1u << 1u)
+#define USB_AUDIO_FU_BMA_BASS                   (1u << 2u)
+#define USB_AUDIO_FU_BMA_MID                    (1u << 3u)
+#define USB_AUDIO_FU_BMA_TREBLE                 (1u << 4u)
+#define USB_AUDIO_FU_BMA_GRAPHIC_EQUALIZER      (1u << 5u)
+#define USB_AUDIO_FU_BMA_AUTOMATIC_GAIN         (1u << 6u)
+#define USB_AUDIO_FU_BMA_DELAY                  (1u << 7u)
+#define USB_AUDIO_FU_BMA_BASS_BOOST             (1u << 8u)
+#define USB_AUDIO_FU_BMA_LOUDNESS               (1u << 9u)
+
+// up/down mix processing unit control selectors
+#define USB_AUDIO_UD_ENABLE_CONTROL             0x01
+#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
+#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
+
+// Dolby Prologic processing unit control selectors
+#define USB_AUDIO_DP_ENABLE_CONTROL             0x01
+#define USB_AUDIO_DP_MODE_SELECT_CONTROL        0x02
+
+// 3D stereo extender processing unit control selectors
+#define USB_AUDIO_3D_ENABLE_CONTROL             0x01
+#define USB_AUDIO_SPACIOUSNESS_CONTROL          0x03
+
+// reverberation processing unit control selectors
+#define USB_AUDIO_RV_ENABLE_CONTROL             0x01
+#define USB_AUDIO_REVERB_LEVEL_CONTROL          0x02
+#define USB_AUDIO_REVERB_TIME_CONTROL           0x03
+#define USB_AUDIO_REVERB_FEEDBACK_CONTROL       0x04
+
+// chorus processing unit control selectors
+#define USB_AUDIO_CH_ENABLE_CONTROL             0x01
+#define USB_AUDIO_CHORUS_LEVEL_CONTROL          0x02
+#define USB_AUDIO_CHORUS_RATE_CONTROL           0x03
+#define USB_AUDIO_CHORUS_DEPTH_CONTROL          0x04
+
+// dynamic range compressor processing unit control selectors
+#define USB_AUDIO_DR_ENABLE_CONTROL             0x01
+#define USB_AUDIO_COMPRESSION_RATE_CONTROL      0x02
+#define USB_AUDIO_MAXAMPL_CONTROL               0x03
+#define USB_AUDIO_THRESHOLD_CONTROL             0x04
+#define USB_AUDIO_ATTACK_TIME                   0x05
+#define USB_AUDIO_RELEASE_TIME                  0x06
+
+// extension unit control selectors
+#define USB_AUDIO_XU_ENABLE_CONTROL             0x01
+
+// endpoint control selectors
+#define USB_AUDIO_SAMPLING_FREQ_CONTROL         0x01
+#define USB_AUDIO_PITCH_CONTROL                 0x02
+
+// USB audio terminal types
+#define USB_AUDIO_TERMINAL_USB_UNDEFINED                0x0100
+#define USB_AUDIO_TERMINAL_USB_STREAMING                0x0101
+#define USB_AUDIO_TERMINAL_USB_VENDOR                   0x01FF
+#define USB_AUDIO_TERMINAL_INPUT_UNDEFINED              0x0200
+#define USB_AUDIO_TERMINAL_MICROPHONE                   0x0201
+#define USB_AUDIO_TERMINAL_DESKTOP_MICROPHONE           0x0202
+#define USB_AUDIO_TERMINAL_PERSONAL_MICROPHONE          0x0203
+#define USB_AUDIO_TERMINAL_OMNI_DIRECTIONAL_MICROPHONE  0x0204
+#define USB_AUDIO_TERMINAL_MICROPHONE_ARRAY             0x0205
+#define USB_AUDIO_TERMINAL_PROCESSING_MICROPHONE_ARRAY  0x0206
+#define USB_AUDIO_TERMINAL_OUTPUT_UNDEFINED             0x0300
+#define USB_AUDIO_TERMINAL_SPEAKER                      0x0301
+#define USB_AUDIO_TERMINAL_HEADPHONES                   0x0302
+#define USB_AUDIO_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO   0x0303
+#define USB_AUDIO_TERMINAL_DESKTOP_SPEAKER              0x0304
+#define USB_AUDIO_TERMINAL_ROOM_SPEAKER                 0x0305
+#define USB_AUDIO_TERMINAL_COMMUNICATION_SPEAKER        0x0306
+#define USB_AUDIO_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER     0x0307
+#define USB_AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED      0x0400
+#define USB_AUDIO_TERMINAL_HANDSET                      0x0401
+#define USB_AUDIO_TERMINAL_HEADSET                      0x0402
+#define USB_AUDIO_TERMINAL_SPEAKERPHONE                 0x0403
+#define USB_AUDIO_TERMINAL_ECHO_SUPPRESSING_SPEAKERPHONE 0x0404
+#define USB_AUDIO_TERMINAL_ECHO_CANCELING_SPEAKERPHONE  0x0405
+#define USB_AUDIO_TERMINAL_TELEPHONY_UNDEFINED          0x0500
+#define USB_AUDIO_TERMINAL_PHONE_LINE                   0x0501
+#define USB_AUDIO_TERMINAL_TELEPHONE                    0x0502
+#define USB_AUDIO_TERMINAL_DOWN_LINE_PHONE              0x0503
+#define USB_AUDIO_TERMINAL_EXTERNAL_UNDEFINED           0x0600
+#define USB_AUDIO_TERMINAL_ANALOG_CONNECTOR             0x0601
+#define USB_AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE      0x0602
+#define USB_AUDIO_TERMINAL_LINE_CONNECTOR               0x0603
+#define USB_AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR       0x0604
+#define USB_AUDIO_TERMINAL_SPDIF_INTERFACE              0x0605
+#define USB_AUDIO_TERMINAL_1394_DA_STREAM               0x0606
+#define USB_AUDIO_TERMINAL_1394_DV_STREAM_SOUNDTRACK    0x0607
+#define USB_AUDIO_TERMINAL_EMBEDDED_UNDEFINED           0x0700
+#define USB_AUDIO_TERMINAL_LEVEL_CALIBRATION_NOISE_SOURCE 0x0701
+#define USB_AUDIO_TERMINAL_EQUALIZATION_NOISE           0x0702
+#define USB_AUDIO_TERMINAL_CD_PLAYER                    0x0703
+#define USB_AUDIO_TERMINAL_DAT                          0x0704
+#define USB_AUDIO_TERMINAL_DCC                          0x0705
+#define USB_AUDIO_TERMINAL_MINI_DISK                    0x0706
+#define USB_AUDIO_TERMINAL_ANALOG_TAPE                  0x0707
+#define USB_AUDIO_TERMINAL_PHONOGRAPH                   0x0708
+#define USB_AUDIO_TERMINAL_VCR_AUDIO                    0x0709
+#define USB_AUDIO_TERMINAL_VIDEO_DISK_AUDIO             0x070A
+#define USB_AUDIO_TERMINAL_DVD_AUDIO                    0x070B
+#define USB_AUDIO_TERMINAL_TV_TUNER_AUDIO               0x070C
+#define USB_AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO     0x070D
+#define USB_AUDIO_TERMINAL_CABLE_TUNER_AUDIO            0x070E
+#define USB_AUDIO_TERMINAL_DSS_AUDIO                    0x070F
+#define USB_AUDIO_TERMINAL_RADIO_RECEIVER               0x0710
+#define USB_AUDIO_TERMINAL_RADIO_TRANSMITTER            0x0711
+#define USB_AUDIO_TERMINAL_MULTI_TRACK_RECORDER         0x0712
+#define USB_AUDIO_TERMINAL_SYNTHESIZER                  0x0713
+
+////////////////////////////////////////////////////
+//
+// Audio streaming interface constants
+//
+////////////////////////////////////////////////////
+
+// Audio stream class-specific AS interface descriptor subtypes
+#define USB_AUDIO_AS_GENERAL                    0x01
+#define USB_AUDIO_AS_FORMAT_TYPE                0x02
+#define USB_AUDIO_AS_FORMAT_SPECIFIC            0x03
+
+// wFormatTag values present in the class specific AS header
+// Defined in Section A.1 of USB Device Class Definition for Audio Data Formats
+#define USB_AUDIO_AS_FT_TYPE_I_UNDEFINED        0x0000
+#define USB_AUDIO_AS_FT_PCM                     0x0001
+#define USB_AUDIO_AS_FT_PCM8                    0x0002
+#define USB_AUDIO_AS_FT_IEEE_FLOAT              0x0003
+#define USB_AUDIO_AS_FT_ALAW                    0x0004
+#define USB_AUDIO_AS_FT_MULAW                   0x0005
+#define USB_AUDIO_AS_FT_TYPE_II_UNDEFINED       0x1000
+#define USB_AUDIO_AS_FT_MPEG                    0x1001
+#define USB_AUDIO_AS_FT_AC3                     0x1002
+#define USB_AUDIO_AS_FT_TYPE_III_UNDEFINED      0x2000
+#define USB_AUDIO_AS_FT_IEC1937_AC3             0x2001
+#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L1        0x2002
+#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L23       0x2003
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_EXT       0x2004
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L1_LS     0x2005
+#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L23_LS    0x2006
+
+// Audio stream class-specific format-specific types
+#define USB_AUDIO_FORMAT_TYPE_UNDEFINED         0x00
+#define USB_AUDIO_FORMAT_TYPE_I                 0x01
+#define USB_AUDIO_FORMAT_TYPE_II                0x02
+#define USB_AUDIO_FORMAT_TYPE_III               0x03
+
+////////////////////////////////////////////////////
+//
+// MIDI streaming interface constants
+//
+////////////////////////////////////////////////////
+
+// MIDI class specific MS interface descriptor subtypes
+#define USB_MIDI_MS_HEADER                      0x01
+#define USB_MIDI_IN_JACK                        0x02
+#define USB_MIDI_OUT_JACK                       0x03
+#define USB_MIDI_ELEMENT                        0x04
+
+// MIDI class specific MS endpoint descriptor subtypes
+#define USB_MIDI_MS_GENERAL                     0x01
+
+// MIDI IN and OUT jack types
+#define USB_MIDI_JACK_EMBEDDED                  0x01
+#define USB_MIDI_JACK_INTERNAL                  0x02
+
+// MIDI endpoint control selectors
+#define USB_MIDI_ASSOCIATION_CONTROL            0x01
+
+
+// Top level header structure shared by all USB audio descriptors.
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;
+} __PACKED usb_audio_desc_header;
+
+// Audio Control Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_HEADER
+    uint16_t bcdADC;
+    uint16_t wTotalLength;
+    uint8_t bInCollection;
+    uint8_t baInterfaceNr[];
+} __PACKED usb_audio_ac_header_desc;
+
+// Common header structure shared by all unit and terminal descriptors found in
+// an Audio Control interface descriptor.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_.*_(TERMINAL|UNIT)
+    uint8_t bID;
+} __PACKED usb_audio_ac_ut_desc;
+
+// Common header structure shared by all terminal descriptors found in an Audio
+// Control interface descriptor.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_(INPUT|OUTPUT)_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+} __PACKED usb_audio_ac_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_INPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t iTerminal;
+} __PACKED usb_audio_ac_input_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_OUTPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bSourceID;
+    uint8_t iTerminal;
+} __PACKED usb_audio_ac_output_terminal_desc;
+
+// Note: Mixer unit descriptors contain two inlined variable length arrays, each
+// with descriptor data following them.  They are therefor described using 3
+// structure definitions which are logically concatenated, but separated by the
+// inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_MIXER_UNIT
+    uint8_t bUnitID;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_mixer_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_mixer_unit_desc_1;
+
+typedef struct {
+    uint8_t iMixer;
+} __PACKED usb_audio_ac_mixer_unit_desc_2;
+
+// Note: Selector unit descriptors contain an inlined variable length array with
+// descriptor data following it.  They are therefor described using 2 structure
+// definitions which are logically concatenated, but separated by the inline
+// array.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_SELECTOR_UNIT
+    uint8_t bUnitID;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_selector_unit_desc_0;
+
+typedef struct {
+    uint8_t iSelector;
+} __PACKED usb_audio_ac_selector_unit_desc_1;
+
+// Note: Feature unit descriptors contain an inlined variable length array with
+// descriptor data following it.  They are therefor described using 2 structure
+// definitions which are logically concatenated, but separated by the inline
+// array.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_FEATURE_UNIT
+    uint8_t bUnitID;
+    uint8_t bSourceID;
+    uint8_t bControlSize;
+    uint8_t bmaControls[];
+} __PACKED usb_audio_ac_feature_unit_desc_0;
+
+typedef struct {
+    uint8_t iFeature;
+} __PACKED usb_audio_ac_feature_unit_desc_1;
+
+// Note: Processing unit descriptors contain two inlined variable length arrays,
+// each with descriptor data following them.  They are therefor described using
+// 3 structure definitions which are logically concatenated, but separated by
+// the inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_PROCESSING_UNIT
+    uint8_t bUnitID;
+    uint16_t wProcessType;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_processing_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bControlSize;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_processing_unit_desc_1;
+
+typedef struct {
+    uint8_t iProcessing;
+    // Note: The Process-specific control structure follows this with the
+    // structure type determined by wProcessType
+    // TODO(johngro) : Define the process specific control structures.  As of
+    // the 1.0 revision of the USB audio spec, the types to be defined are...
+    //
+    // ** Up/Down-mix
+    // ** Dolby Prologic
+    // ** 3D-Stereo Extender
+    // ** Reverberation
+    // ** Chorus
+    // ** Dynamic Range Compressor
+} __PACKED usb_audio_ac_processing_unit_desc_2;
+
+// Note: Extension unit descriptors contain two inlined variable length arrays,
+// each with descriptor data following them.  They are therefor described using
+// 3 structure definitions which are logically concatenated, but separated by
+// the inline arrays.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_EXTENSION_UNIT
+    uint8_t bUnitID;
+    uint16_t wExtensionCode;
+    uint8_t bNrInPins;
+    uint8_t baSourceID[];
+} __PACKED usb_audio_ac_extension_unit_desc_0;
+
+typedef struct {
+    uint8_t bNrChannels;
+    uint16_t wChannelConfig;
+    uint8_t iChannelNames;
+    uint8_t bControlSize;
+    uint8_t bmControls[];
+} __PACKED usb_audio_ac_extension_unit_desc_1;
+
+typedef struct {
+    uint8_t iExtension;
+} __PACKED usb_audio_ac_extension_unit_desc_2;
+
+// Audio Streaming Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_GENERAL
+    uint8_t bTerminalLink;
+    uint8_t bDelay;
+    uint16_t wFormatTag;
+} __PACKED usb_audio_as_header_desc;
+
+typedef struct {
+    uint8_t freq[3];            // 24 bit unsigned integer, little-endian
+} __PACKED usb_audio_as_samp_freq;
+
+// Common header used by all format type descriptors
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
+    uint8_t bFormatType;
+} __PACKED usb_audio_as_format_type_hdr;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
+    uint8_t bFormatType;            // USB_AUDIO_FORMAT_TYPE_I
+    uint8_t bNrChannels;
+    uint8_t bSubFrameSize;
+    uint8_t bBitResolution;
+    uint8_t bSamFreqType;           // number of sampling frequencies
+    usb_audio_as_samp_freq tSamFreq[]; // list of sampling frequencies (3 bytes each)
+} __PACKED usb_audio_as_format_type_i_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_AUDIO_EP_GENERAL
+    uint8_t bmAttributes;
+    uint8_t bLockDelayUnits;
+    uint16_t wLockDelay;
+} __PACKED usb_audio_as_isoch_ep_desc;
+
+// MIDI Streaming Interface descriptor definitions
+//
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_HEADER
+    uint16_t bcdMSC;
+    uint16_t wTotalLength;
+} __PACKED usb_midi_ms_header_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_IN_JACK
+    uint8_t bJackType;
+    uint8_t bJackID;
+    uint8_t iJack;
+} __PACKED usb_midi_ms_in_jack_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_MIDI_OUT_JACK
+    uint8_t bJackType;
+    uint8_t bJackID;
+    uint8_t bNrInputPins;
+    uint8_t baSourceID;
+    uint8_t baSourcePin;
+} __PACKED usb_midi_ms_out_jack_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_GENERAL
+    uint8_t bNumEmbMIDIJack;
+    uint8_t baAssocJackID[];
+} __PACKED usb_midi_ms_endpoint_desc;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_AUDIO_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/cdc.h b/arch/x64/sysroot/include/zircon/hw/usb/cdc.h
new file mode 100644
index 0000000..67ac8c7
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/cdc.h
@@ -0,0 +1,150 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_CDC_H_
+#define SYSROOT_ZIRCON_HW_USB_CDC_H_
+
+#include <stdint.h>
+
+// clang-format off
+
+#include <zircon/compiler.h>
+
+/* CDC Subclasses for the Communications Interface Class */
+#define USB_CDC_SUBCLASS_DIRECT_LINE       0x01
+#define USB_CDC_SUBCLASS_ABSTRACT          0x02
+#define USB_CDC_SUBCLASS_TELEPHONE         0x03
+#define USB_CDC_SUBCLASS_MULTI_CHANNEL     0x04
+#define USB_CDC_SUBCLASS_CAPI              0x05
+#define USB_CDC_SUBCLASS_ETHERNET          0x06
+#define USB_CDC_SUBCLASS_ATM               0x07
+#define USB_CDC_SUBCLASS_WIRELESS_HANDSET  0x08
+#define USB_CDC_SUBCLASS_DEVICE_MGMT       0x09
+#define USB_CDC_SUBCLASS_MOBILE_DIRECT     0x0A
+#define USB_CDC_SUBCLASS_OBEX              0x0B
+#define USB_CDC_SUBCLASS_ETHERNET_EMU      0x0C
+#define USB_CDC_SUBCLASS_NETWORK_CTRL      0x0D
+
+/* CDC Descriptor SubTypes */
+#define USB_CDC_DST_HEADER                    0x00
+#define USB_CDC_DST_CALL_MGMT                 0x01
+#define USB_CDC_DST_ABSTRACT_CTRL_MGMT        0x02
+#define USB_CDC_DST_DIRECT_LINE_MGMT          0x03
+#define USB_CDC_DST_TELEPHONE_RINGER          0x04
+#define USB_CDC_DST_TELEPHONE_CALL_REPORTING  0x05
+#define USB_CDC_DST_UNION                     0x06
+#define USB_CDC_DST_COUNTRY_SELECTION         0x07
+#define USB_CDC_DST_TELEPHONE_OP_MODES        0x08
+#define USB_CDC_DST_USB_TERMINAL              0x09
+#define USB_CDC_DST_NETWORK_CHANNEL           0x0A
+#define USB_CDC_DST_PROTOCOL_UNIT             0x0B
+#define USB_CDC_DST_EXTENSION_UNIT            0x0C
+#define USB_CDC_DST_MULTI_CHANNEL_MGMT        0x0D
+#define USB_CDC_DST_CAPI_CTRL_MGMT            0x0E
+#define USB_CDC_DST_ETHERNET                  0x0F
+#define USB_CDC_DST_ATM_NETWORKING            0x10
+#define USB_CDC_DST_WIRELESS_HANDSET_CTRL     0x11
+#define USB_CDC_DST_MOBILE_DIRECT_LINE        0x12
+#define USB_CDC_DST_MDLM_DETAIL               0x13
+#define USB_CDC_DST_DEVICE_MGMT               0x14
+#define USB_CDC_DST_OBEX                      0x15
+#define USB_CDC_DST_COMMAND_SET               0x16
+#define USB_CDC_DST_COMMAND_SET_DETAIL        0x17
+#define USB_CDC_DST_TELEPHONE_CTRL            0x18
+#define USB_CDC_DST_OBEX_SERVICE_ID           0x19
+#define USB_CDC_DST_NCM                       0x1A
+
+/* CDC Class-Specific Notification Codes */
+#define USB_CDC_NC_NETWORK_CONNECTION       0x00
+#define USB_CDC_NC_RESPONSE_AVAILABLE       0x01
+#define USB_CDC_NC_SERIAL_STATE             0x20
+#define USB_CDC_NC_CONNECTION_SPEED_CHANGE  0x2A
+
+/* CDC Ethernet Class-Specific Request Codes */
+#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS  0x40
+#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER  0x41
+#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER  0x42
+#define USB_CDC_SET_ETHERNET_PACKET_FILTER      0x43
+#define USB_CDC_GET_ETHERNET_STATISTIC          0x44
+
+/* CDC Ethernet Packet Filter Modes Bits */
+#define USB_CDC_PACKET_TYPE_PROMISCUOUS   (1 << 0)
+#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1)
+#define USB_CDC_PACKET_TYPE_DIRECTED      (1 << 2)
+#define USB_CDC_PACKET_TYPE_BROADCAST     (1 << 3)
+#define USB_CDC_PACKET_TYPE_MULTICAST     (1 << 4)
+
+/* CDC Class-Specific Requests */
+#define USB_CDC_SEND_ENCAPSULATED_COMMAND   0x00
+#define USB_CDC_GET_ENCAPSULATED_RESPONSE   0x01
+
+__BEGIN_CDECLS
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_HEADER
+    uint16_t bcdCDC;
+} __attribute__ ((packed)) usb_cs_header_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_CALL_MGMT
+    uint8_t bmCapabilities;
+    uint8_t bDataInterface;
+} __attribute__ ((packed)) usb_cs_call_mgmt_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_ABSTRACT_CTRL_MGMT
+    uint8_t bmCapabilities;
+} __attribute__ ((packed)) usb_cs_abstract_ctrl_mgmt_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
+    uint8_t bControlInterface;
+    uint8_t bSubordinateInterface[];
+} __attribute__ ((packed)) usb_cs_union_interface_descriptor_t;
+
+// fixed size version of usb_cs_union_interface_descriptor_t
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_UNION
+    uint8_t bControlInterface;
+    uint8_t bSubordinateInterface;
+} __attribute__ ((packed)) usb_cs_union_interface_descriptor_1_t;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;    // USB_DT_CS_INTERFACE
+    uint8_t bDescriptorSubType; // USB_CDC_DST_ETHERNET
+    uint8_t iMACAddress;
+    uint32_t bmEthernetStatistics;
+    uint16_t wMaxSegmentSize;
+    uint16_t wNumberMCFilters;
+    uint8_t bNumberPowerFilters;
+} __attribute__ ((packed)) usb_cs_ethernet_interface_descriptor_t;
+
+typedef struct {
+    uint8_t bmRequestType;
+    uint8_t bNotification;
+    uint16_t wValue;
+    uint16_t wIndex;
+    uint16_t wLength;
+} __attribute__ ((packed)) usb_cdc_notification_t;
+
+typedef struct {
+    usb_cdc_notification_t notification;
+    uint32_t downlink_br;
+    uint32_t uplink_br;
+ } __attribute__ ((packed)) usb_cdc_speed_change_notification_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_CDC_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/dfu.h b/arch/x64/sysroot/include/zircon/hw/usb/dfu.h
new file mode 100644
index 0000000..7ca40f0
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/dfu.h
@@ -0,0 +1,82 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_DFU_H_
+#define SYSROOT_ZIRCON_HW_USB_DFU_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// USB DFU Spec, Rev 1.1
+
+// DFU Class-Specific Request Values
+// Table 3.2
+#define USB_DFU_DETACH     0x00
+#define USB_DFU_DNLOAD     0x01
+#define USB_DFU_UPLOAD     0x02
+#define USB_DFU_GET_STATUS 0x03
+#define USB_DFU_CLR_STATUS 0x04
+#define USB_DFU_GET_STATE  0x05
+#define USB_DFU_ABORT      0x06
+
+// DFU Class-Specific Descriptor Types
+// Table 4.1.3
+#define USB_DFU_CS_FUNCTIONAL 0x21
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;  // USB_DFU_CS_FUNCTIONAL
+    uint8_t bmAttributes;
+    uint16_t wDetachTimeOut;
+    uint16_t wTransferSize;
+    uint16_t bcdDFUVersion;
+} __PACKED usb_dfu_func_desc_t;
+
+// DFU_GET_STATUS Response
+// Section 6.1.2
+typedef struct {
+    uint8_t bStatus;
+    uint8_t bwPollTimeout[3];  // 24 bit unsigned integer
+    uint8_t bState;
+    uint8_t bString;
+} __PACKED usb_dfu_get_status_data_t;
+
+// DFU Device Status Values
+#define USB_DFU_STATUS_OK                     0x00
+#define USB_DFU_STATUS_ERR_TARGET             0x01
+#define USB_DFU_STATUS_ERR_FILE               0x02
+#define USB_DFU_STATUS_ERR_WRITE              0x03
+#define USB_DFU_STATUS_ERR_ERASE              0x04
+#define USB_DFU_STATUS_ERR_CHECK_ERASED       0x05
+#define USB_DFU_STATUS_ERR_PROG               0x06
+#define USB_DFU_STATUS_ERR_VERIFY             0x07
+#define USB_DFU_STATUS_ERR_ADDRESS            0x08
+#define USB_DFU_STATUS_ERR_NOT_DONE           0x09
+#define USB_DFU_STATUS_ERR_FIRMWARE           0x0A
+#define USB_DFU_STATUS_ERR_VENDOR             0x0B
+#define USB_DFU_STATUS_ERR_USER               0x0C
+#define USB_DFU_STATUS_ERR_POR                0x0D
+#define USB_DFU_STATUS_ERR_UNKNOWN            0x0E
+#define USB_DFU_STATUS_ERR_STALLED_PKT        0x0F
+
+// DFU Device State Values
+#define USB_DFU_STATE_APP_IDLE                0x00
+#define USB_DFU_STATE_APP_DETACH              0x01
+#define USB_DFU_STATE_DFU_IDLE                0x02
+#define USB_DFU_STATE_DFU_DNLOAD_SYNC         0x03
+#define USB_DFU_STATE_DFU_DNBUSY              0x04
+#define USB_DFU_STATE_DFU_DNLOAD_IDLE         0x05
+#define USB_DFU_STATE_DFU_MANIFEST_SYNC       0x06
+#define USB_DFU_STATE_DFU_MANIFEST            0x07
+#define USB_DFU_STATE_DFU_MANIFEST_WAIT_RESET 0x08
+#define USB_DFU_STATE_DFU_UPLOAD_IDLE         0x09
+#define USB_DFU_STATE_DFU_ERROR               0x0A
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_DFU_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/hid.h b/arch/x64/sysroot/include/zircon/hw/usb/hid.h
new file mode 100644
index 0000000..97dea4e
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/hid.h
@@ -0,0 +1,46 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_HID_H_
+#define SYSROOT_ZIRCON_HW_USB_HID_H_
+
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+__BEGIN_CDECLS
+
+// clang-format off
+
+// HID Request Values.
+#define USB_HID_GET_REPORT                  0x01
+#define USB_HID_GET_IDLE                    0x02
+#define USB_HID_GET_PROTOCOL                0x03
+#define USB_HID_SET_REPORT                  0x09
+#define USB_HID_SET_IDLE                    0x0A
+#define USB_HID_SET_PROTOCOL                0x0B
+
+// HID USB protocols
+#define USB_HID_PROTOCOL_KBD 0x01
+#define USB_HID_PROTOCOL_MOUSE 0x02
+#define USB_HID_SUBCLASS_BOOT 0x01
+
+// clang-format on
+
+typedef struct {
+  uint8_t bDescriptorType;
+  uint16_t wDescriptorLength;
+} __attribute__((packed)) usb_hid_descriptor_entry_t;
+
+typedef struct {
+  uint8_t bLength;
+  uint8_t bDescriptorType;
+  uint16_t bcdHID;
+  uint8_t bCountryCode;
+  uint8_t bNumDescriptors;
+  usb_hid_descriptor_entry_t descriptors[];
+} __attribute__((packed)) usb_hid_descriptor_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_HID_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/hub.h b/arch/x64/sysroot/include/zircon/hw/usb/hub.h
new file mode 100644
index 0000000..10ed110
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/hub.h
@@ -0,0 +1,120 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_HUB_H_
+#define SYSROOT_ZIRCON_HW_USB_HUB_H_
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+// clang-format off
+
+__BEGIN_CDECLS
+
+// Hub request types
+#define USB_RECIP_HUB   (USB_TYPE_CLASS | USB_RECIP_DEVICE)
+#define USB_RECIP_PORT  (USB_TYPE_CLASS | USB_RECIP_OTHER)
+
+// Hub requests
+#define USB_HUB_SET_DEPTH       12
+
+// Hub descriptor types
+#define USB_HUB_DESC_TYPE       0x29
+#define USB_HUB_DESC_TYPE_SS    0x2A    // for superspeed hubs
+
+// Hub Class Feature Selectors (USB 2.0 spec Table 11.17)
+#define USB_FEATURE_C_HUB_LOCAL_POWER   0
+#define USB_FEATURE_C_HUB_OVER_CURRENT  1
+#define USB_FEATURE_PORT_CONNECTION     0
+#define USB_FEATURE_PORT_ENABLE         1
+#define USB_FEATURE_PORT_SUSPEND        2
+#define USB_FEATURE_PORT_OVER_CURRENT   3
+#define USB_FEATURE_PORT_RESET          4
+#define USB_FEATURE_PORT_LINK_STATE     5
+#define USB_FEATURE_PORT_POWER          8
+#define USB_FEATURE_PORT_LOW_SPEED      9
+#define USB_FEATURE_C_PORT_CONNECTION   16
+#define USB_FEATURE_C_PORT_ENABLE       17
+#define USB_FEATURE_C_PORT_SUSPEND      18
+#define USB_FEATURE_C_PORT_OVER_CURRENT 19
+#define USB_FEATURE_C_PORT_RESET        20
+#define USB_FEATURE_PORT_TEST           21
+#define USB_FEATURE_PORT_INDICATOR      22
+#define USB_FEATURE_PORT_INDICATOR      22
+#define USB_FEATURE_PORT_U1_TIMEOUT     23
+#define USB_FEATURE_PORT_U2_TIMEOUT     24
+#define USB_FEATURE_C_PORT_LINK_STATE   25
+#define USB_FEATURE_C_PORT_CONFIG_ERROR 26
+#define USB_FEATURE_PORT_REMOTE_WAKE_MASK 27
+#define USB_FEATURE_BH_PORT_RESET       28
+#define USB_FEATURE_C_BH_PORT_RESET     29
+#define USB_FEATURE_FORCE_LINKPM_ACCEPT 30
+
+typedef struct {
+    uint8_t bDescLength;
+    uint8_t bDescriptorType;
+    uint8_t bNbrPorts;
+    uint16_t wHubCharacteristics;
+    uint8_t bPowerOn2PwrGood;
+    uint8_t bHubContrCurrent;
+    union {
+        // USB 2.0
+        struct {
+            // variable length depending on number of ports
+            uint8_t  DeviceRemovable[4];
+            uint8_t  PortPwrCtrlMask[4];
+        }  __attribute__ ((packed)) hs;
+        // USB 3.0
+        struct {
+            uint8_t bHubHdrDecLat;
+            uint16_t wHubDelay;
+            uint16_t DeviceRemovable;
+        } __attribute__ ((packed)) ss;
+    } __attribute__ ((packed));
+} __attribute__ ((packed)) usb_hub_descriptor_t;
+
+typedef struct {
+    uint16_t wHubStatus;
+    uint16_t wHubChange;
+} __attribute__ ((packed)) usb_hub_status_t;
+
+// wHubStatus bits
+#define USB_HUB_LOCAL_POWER         (1 << 0)
+#define USB_HUB_OVER_CURRENT        (1 << 1)
+
+typedef struct {
+    uint16_t wPortStatus;
+    uint16_t wPortChange;
+} __attribute__ ((packed)) usb_port_status_t;
+
+// Port Status bits
+#define USB_PORT_CONNECTION         (1 << 0)
+#define USB_PORT_ENABLE             (1 << 1)
+#define USB_PORT_SUSPEND            (1 << 2)    // USB 2.0 only
+#define USB_PORT_OVER_CURRENT       (1 << 3)
+#define USB_PORT_RESET              (1 << 4)
+#define USB_PORT_POWER              (1 << 8)    // USB 2.0 only
+#define USB_PORT_LOW_SPEED          (1 << 9)    // USB 2.0 only
+#define USB_PORT_HIGH_SPEED         (1 << 10)   // USB 2.0 only
+#define USB_PORT_TEST_MODE          (1 << 11)   // USB 2.0 only
+#define USB_PORT_INDICATOR_CONTROL  (1 << 12)   // USB 2.0 only
+
+// Port Status Changed bits
+#define USB_C_PORT_CONNECTION       (1 << 0)
+#define USB_C_PORT_ENABLE           (1 << 1)    // USB 2.0 only
+#define USB_C_PORT_SUSPEND          (1 << 2)    // USB 2.0 only
+#define USB_C_PORT_OVER_CURRENT     (1 << 3)
+#define USB_C_PORT_RESET            (1 << 4)
+#define USB_C_BH_PORT_RESET         (1 << 5)    // USB 3.0 only
+#define USB_C_PORT_LINK_STATE       (1 << 6)    // USB 3.0 only
+#define USB_C_PORT_CONFIG_ERROR     (1 << 7)    // USB 3.0 only
+#define USB_C_PORT_POWER            (1 << 8)    // USB 2.0 only
+#define USB_C_PORT_LOW_SPEED        (1 << 9)    // USB 2.0 only
+#define USB_C_PORT_HIGH_SPEED       (1 << 10)   // USB 2.0 only
+#define USB_C_PORT_TEST_MODE        (1 << 11)   // USB 2.0 only
+#define USB_C_PORT_INDICATOR_CONTROL (1 << 12)   // USB 2.0 only
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_HW_USB_HUB_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/ums.h b/arch/x64/sysroot/include/zircon/hw/usb/ums.h
new file mode 100644
index 0000000..6640803
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/ums.h
@@ -0,0 +1,159 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_UMS_H_
+#define SYSROOT_ZIRCON_HW_USB_UMS_H_
+
+// clang-format off
+
+// SCSI commands
+#define UMS_TEST_UNIT_READY          0x00
+#define UMS_REQUEST_SENSE            0x03
+#define UMS_INQUIRY                  0x12
+#define UMS_MODE_SELECT6             0x15
+#define UMS_MODE_SENSE6              0x1A
+#define UMS_START_STOP_UNIT          0x1B
+#define UMS_TOGGLE_REMOVABLE         0x1E
+#define UMS_READ_FORMAT_CAPACITIES   0x23
+#define UMS_READ_CAPACITY10          0x25
+#define UMS_READ10                   0x28
+#define UMS_WRITE10                  0x2A
+#define UMS_SYNCHRONIZE_CACHE        0x35
+#define UMS_MODE_SELECT10            0x55
+#define UMS_MODE_SENSE10             0x5A
+#define UMS_READ16                   0x88
+#define UMS_WRITE16                  0x8A
+#define UMS_READ_CAPACITY16          0x9E
+#define UMS_READ12                   0xA8
+#define UMS_WRITE12                  0xAA
+
+// control request values
+#define USB_REQ_RESET               0xFF
+#define USB_REQ_GET_MAX_LUN         0xFE
+
+// error codes for CSW processing
+typedef uint32_t csw_status_t;
+#define CSW_SUCCESS      ((csw_status_t)0)
+#define CSW_FAILED       ((csw_status_t)1)
+#define CSW_PHASE_ERROR  ((csw_status_t)2)
+#define CSW_INVALID      ((csw_status_t)3)
+#define CSW_TAG_MISMATCH ((csw_status_t)4)
+
+// signatures in header and status
+#define CBW_SIGNATURE               0x43425355
+#define CSW_SIGNATURE               0x53425355
+
+// transfer lengths
+#define UMS_INQUIRY_TRANSFER_LENGTH                0x24
+#define UMS_REQUEST_SENSE_TRANSFER_LENGTH          0x12
+#define UMS_READ_FORMAT_CAPACITIES_TRANSFER_LENGTH 0xFC
+
+// 6 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint16_t    lba;    // logical block address
+    uint8_t     length;
+    uint8_t     control;
+} __PACKED scsi_command6_t;
+static_assert(sizeof(scsi_command6_t) == 6, "");
+
+// 10 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint32_t    lba;    // logical block address
+    uint8_t     misc2;
+    uint8_t     length_hi; // break length into two pieces to avoid odd alignment
+    uint8_t     length_lo;
+    uint8_t     control;
+} __PACKED scsi_command10_t;
+static_assert(sizeof(scsi_command10_t) == 10, "");
+
+// 12 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint32_t    lba;    // logical block address
+    uint32_t    length;
+    uint8_t     misc2;
+    uint8_t     control;
+} __PACKED scsi_command12_t;
+static_assert(sizeof(scsi_command12_t) == 12, "");
+
+// 16 Byte SCSI command
+// This is big endian
+typedef struct {
+    uint8_t     opcode;
+    uint8_t     misc;
+    uint64_t    lba;    // logical block address
+    uint32_t    length;
+    uint8_t     misc2;
+    uint8_t     control;
+} __PACKED scsi_command16_t;
+static_assert(sizeof(scsi_command16_t) == 16, "");
+
+// SCSI Read Capacity 10 payload
+// This is big endian
+typedef struct {
+    uint32_t    lba;
+    uint32_t    block_length;
+} __PACKED scsi_read_capacity_10_t;
+static_assert(sizeof(scsi_read_capacity_10_t) == 8, "");
+
+// SCSI Read Capacity 16 payload
+// This is big endian
+typedef struct {
+    uint64_t    lba;
+    uint32_t    block_length;
+    uint8_t     ptype_prot_en;  // bit 0: PROT_EN, bits 1-3: P_TYPE
+    uint8_t     resesrved[19];
+} __PACKED scsi_read_capacity_16_t;
+static_assert(sizeof(scsi_read_capacity_16_t) == 32, "");
+
+// SCSI Mode Sense 6 command
+typedef struct {
+    uint8_t     opcode; // UMS_MODE_SENSE6
+    uint8_t     disable_block_desc;
+    uint8_t     page;
+    uint8_t     subpage;
+    uint8_t     allocation_length;
+    uint8_t     control;
+} __PACKED scsi_mode_sense_6_command_t;
+static_assert(sizeof(scsi_mode_sense_6_command_t) == 6, "");
+
+// SCSI Mode Sense 6 data response
+typedef struct {
+    uint8_t     mode_data_length;
+    uint8_t     medium_type;
+    uint8_t     device_specific_param;
+    uint8_t     block_desc_length;
+} __PACKED scsi_mode_sense_6_data_t;
+#define MODE_SENSE_DSP_RO   0x80    //  bit 7 of device_specific_param: read-only
+
+// Command Block Wrapper
+typedef struct {
+    uint32_t    dCBWSignature;      // CBW_SIGNATURE
+    uint32_t    dCBWTag;
+    uint32_t    dCBWDataTransferLength;
+    uint8_t     bmCBWFlags;
+    uint8_t     bCBWLUN;
+    uint8_t     bCBWCBLength;
+    uint8_t     CBWCB[16];
+} __PACKED ums_cbw_t;
+static_assert(sizeof(ums_cbw_t) == 31, "");
+
+// Command Status Wrapper
+typedef struct {
+    uint32_t    dCSWSignature;      // CSW_SIGNATURE
+    uint32_t    dCSWTag;
+    uint32_t    dCSWDataResidue;
+    uint8_t     bmCSWStatus;
+} __PACKED ums_csw_t;
+static_assert(sizeof(ums_csw_t) == 13, "");
+
+#endif  // SYSROOT_ZIRCON_HW_USB_UMS_H_
diff --git a/arch/x64/sysroot/include/zircon/hw/usb/video.h b/arch/x64/sysroot/include/zircon/hw/usb/video.h
new file mode 100644
index 0000000..925b5b6
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/hw/usb/video.h
@@ -0,0 +1,308 @@
+// 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.
+
+#ifndef SYSROOT_ZIRCON_HW_USB_VIDEO_H_
+#define SYSROOT_ZIRCON_HW_USB_VIDEO_H_
+
+// clang-format off
+
+#include <zircon/compiler.h>
+#include <stdint.h>
+
+__BEGIN_CDECLS;
+
+// video interface subclasses
+#define USB_SUBCLASS_VIDEO_CONTROL                 0x01
+#define USB_SUBCLASS_VIDEO_STREAMING               0x02
+#define USB_SUBCLASS_VIDEO_INTERFACE_COLLECTION    0x03
+
+// video class specific descriptor types
+#define USB_VIDEO_CS_DEVICE                        0x21
+#define USB_VIDEO_CS_CONFIGURATION                 0x22
+#define USB_VIDEO_CS_STRING                        0x23
+#define USB_VIDEO_CS_INTERFACE                     0x24
+#define USB_VIDEO_CS_ENDPOINT                      0x25
+
+// video class specific VC interface descriptor subtypes
+#define USB_VIDEO_VC_HEADER                        0x01
+#define USB_VIDEO_VC_INPUT_TERMINAL                0x02
+#define USB_VIDEO_VC_OUTPUT_TERMINAL               0x03
+#define USB_VIDEO_VC_SELECTOR_UNIT                 0x04
+#define USB_VIDEO_VC_PROCESSING_UNIT               0x05
+#define USB_VIDEO_VC_EXTENSION_UNIT                0x06
+#define USB_VIDEO_VC_ENCODING_UNIT                 0x07
+
+// video class specific VS interface descriptor subtypes
+#define USB_VIDEO_VS_INPUT_HEADER                  0x01
+#define USB_VIDEO_VS_OUTPUT_HEADER                 0x02
+#define USB_VIDEO_VS_STILL_IMAGE_FRAME             0x03
+#define USB_VIDEO_VS_FORMAT_UNCOMPRESSED           0x04
+#define USB_VIDEO_VS_FRAME_UNCOMPRESSED            0x05
+#define USB_VIDEO_VS_FORMAT_MJPEG                  0x06
+#define USB_VIDEO_VS_FRAME_MJPEG                   0x07
+#define USB_VIDEO_VS_FORMAT_MPEG2TS                0x0A
+#define USB_VIDEO_VS_FORMAT_DV                     0x0C
+#define USB_VIDEO_VS_COLORFORMAT                   0x0D
+#define USB_VIDEO_VS_FORMAT_FRAME_BASED            0x10
+#define USB_VIDEO_VS_FRAME_FRAME_BASED             0x11
+#define USB_VIDEO_VS_FORMAT_STREAM_BASED           0x12
+#define USB_VIDEO_VS_FORMAT_H264                   0x13
+#define USB_VIDEO_VS_FRAME_H264                    0x14
+#define USB_VIDEO_VS_FORMAT_H264_SIMULCAST         0x15
+#define USB_VIDEO_VS_FORMAT_VP8                    0x16
+#define USB_VIDEO_VS_FRAME_VP8                     0x17
+#define USB_VIDEO_VS_FORMAT_VP8_SIMULCAST          0x18
+
+// video class specific endpoint descriptor subtypes
+#define USB_VIDEO_EP_GENERAL                       0x01
+#define USB_VIDEO_EP_ENDPOINT                      0x02
+#define USB_VIDEO_EP_INTERRUPT                     0x03
+
+// video class specific request codes
+#define USB_VIDEO_SET_CUR                          0x01
+#define USB_VIDEO_SET_CUR_ALL                      0x11
+#define USB_VIDEO_GET_CUR                          0x81
+#define USB_VIDEO_GET_MIN                          0x82
+#define USB_VIDEO_GET_MAX                          0x83
+#define USB_VIDEO_GET_RES                          0x84
+#define USB_VIDEO_GET_LEN                          0x85
+#define USB_VIDEO_GET_INFO                         0x86
+#define USB_VIDEO_GET_DEF                          0x87
+#define USB_VIDEO_GET_CUR_ALL                      0x91
+#define USB_VIDEO_GET_MIN_ALL                      0x92
+#define USB_VIDEO_GET_MAX_ALL                      0x93
+#define USB_VIDEO_GET_RES_ALL                      0x94
+#define USB_VIDEO_GET_DEF_ALL                      0x97
+
+// video streaming interface control selectors
+#define USB_VIDEO_VS_PROBE_CONTROL                 0x01
+#define USB_VIDEO_VS_COMMIT_CONTROL                0x02
+#define USB_VIDEO_VS_STILL_PROBE_CONTROL           0x03
+#define USB_VIDEO_VS_STILL_COMMIT_CONTROL          0x04
+#define USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL   0x05
+#define USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL     0x06
+#define USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL    0x07
+#define USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL  0x08
+#define USB_VIDEO_VS_SYNCH_DELAY_CONTROL           0x09
+
+// header for usb_video_vc_* below
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;
+} __PACKED usb_video_vc_desc_header;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_HEADER
+    uint16_t bcdUVC;
+    uint16_t wTotalLength;
+    uint32_t dwClockFrequency;
+    uint8_t bInCollection;
+    uint8_t baInterfaceNr[];
+} __PACKED usb_video_vc_header_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_INPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t iTerminal;
+} __PACKED usb_video_vc_input_terminal_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VC_OUTPUT_TERMINAL
+    uint8_t bTerminalID;
+    uint16_t wTerminalType;
+    uint8_t bAssocTerminal;
+    uint8_t bSourceID;
+    uint8_t iTerminal;
+} __PACKED usb_video_vc_output_terminal_desc;
+
+// class specific VC interrupt endpoint descriptor
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_ENDPOINT
+    uint8_t bDescriptorSubtype;     // USB_ENDPOINT_INTERRUPT
+    uint16_t wMaxTransferSize;
+} __PACKED usb_video_vc_interrupt_endpoint_desc;
+
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;        // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubtype;     // USB_VIDEO_VS_HEADER
+    uint8_t bNumFormats;
+    uint16_t wTotalLength;
+    uint8_t bEndpointAddress;
+    uint8_t bmInfo;
+    uint8_t bTerminalLink;
+    uint8_t bStillCaptureMethod;
+    uint8_t bTriggerSupport;
+    uint8_t bTriggerUsage;
+    uint8_t bControlSize;
+    uint8_t bmaControls[];
+} __PACKED usb_video_vs_input_header_desc;
+
+#define GUID_LENGTH 16
+
+// A GUID consists of a:
+//  - four-byte integer
+//  - two-byte integer
+//  - two-byte integer
+//  - eight-byte array
+//
+// The string representation uses big endian format, so to convert it
+// to a byte array we need to reverse the byte order of the three integers.
+//
+// See USB Video Class revision 1.5, FAQ section 2.9
+// for GUID Data Structure Layout.
+
+#define USB_VIDEO_GUID_YUY2_STRING "32595559-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_YUY2_VALUE { \
+    0x59, 0x55, 0x59, 0x32, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_NV12_STRING "3231564E-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_NV12_VALUE { \
+    0x4e, 0x56, 0x31, 0x32, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_M420_STRING "3032344D-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_M420_VALUE { \
+    0x4d, 0x34, 0x32, 0x30, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+#define USB_VIDEO_GUID_I420_STRING "30323449-0000-0010-8000-00AA00389B71"
+#define USB_VIDEO_GUID_I420_VALUE { \
+    0x49, 0x34, 0x32, 0x30, \
+    0x00, 0x00, \
+    0x10, 0x00, \
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 \
+}
+
+// USB Video Payload Uncompressed
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_UNCOMPRESSED
+    uint8_t bFormatIndex;
+    uint8_t bNumFrameDescriptors;
+    uint8_t guidFormat[GUID_LENGTH];
+    uint8_t bBitsPerPixel;
+    uint8_t bDefaultFrameIndex;
+    uint8_t bAspectRatioX;
+    uint8_t bAspectRatioY;
+    uint8_t bmInterfaceFlags;
+    uint8_t bCopyProtect;
+} __PACKED usb_video_vs_uncompressed_format_desc;
+
+// USB Video Payload MJPEG
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FORMAT_MJPEG
+    uint8_t bFormatIndex;
+    uint8_t bNumFrameDescriptors;
+    uint8_t bmFlags;
+    uint8_t bDefaultFrameIndex;
+    uint8_t bAspectRatioX;
+    uint8_t bAspectRatioY;
+    uint8_t bmInterfaceFlags;
+    uint8_t bCopyProtect;
+} __PACKED usb_video_vs_mjpeg_format_desc;
+
+// Uncompressed and MJPEG formats have the same frame descriptor structure.
+typedef struct {
+    uint8_t bLength;
+    uint8_t bDescriptorType;         // USB_VIDEO_CS_INTERFACE
+    uint8_t bDescriptorSubType;      // USB_VIDEO_VS_FRAME_UNCOMPRESSED / USB_VIDEO_VS_FRAME_MJPEG
+    uint8_t bFrameIndex;
+    uint8_t bmCapabilities;
+    uint16_t wWidth;
+    uint16_t wHeight;
+    uint32_t dwMinBitRate;
+    uint32_t dwMaxBitRate;
+    uint32_t dwMaxVideoFrameBufferSize;
+    uint32_t dwDefaultFrameInterval;
+    uint8_t bFrameIntervalType;
+    uint32_t dwFrameInterval[];
+} __PACKED usb_video_vs_frame_desc;
+
+// Stream negotiation
+#define USB_VIDEO_BM_HINT_FRAME_INTERVAL        (1 << 0)
+#define USB_VIDEO_BM_HINT_KEY_FRAME_RATE        (1 << 1)
+#define USB_VIDEO_BM_HINT_P_FRAME_RATE          (1 << 2)
+#define USB_VIDEO_BM_HINT_COMP_QUALITY          (1 << 3)
+#define USB_VIDEO_BM_HINT_COMP_WINDOW_SIZE      (1 << 4)
+
+typedef struct {
+   uint16_t bmHint;
+   uint8_t bFormatIndex;
+   uint8_t bFrameIndex;
+   uint32_t dwFrameInterval;
+   uint16_t wKeyFrameRate;
+   uint16_t wPFrameRate;
+   uint16_t wCompQuality;
+   uint16_t wCompWindowSize;
+   uint16_t wDelay;
+   uint32_t dwMaxVideoFrameSize;
+   uint32_t dwMaxPayloadTransferSize;
+   // The following fields are optional.
+   uint32_t dwClockFrequency;
+   uint8_t bmFramingInfo;
+   uint8_t bPreferedVersion;
+   uint8_t bMinVersion;
+   uint8_t bMaxVersion;
+   uint8_t bUsage;
+   uint8_t bBitDepthLuma;
+   uint8_t bmSettings;
+   uint8_t bMaxNumberOfRefFramesPlus1;
+   uint16_t bmRateControlModes;
+   uint32_t bmLayoutPerStream;
+} __PACKED usb_video_vc_probe_and_commit_controls;
+
+// For accessing payload bmHeaderInfo bitmap
+#define USB_VIDEO_VS_PAYLOAD_HEADER_FID         (1 << 0)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_EOF         (1 << 1)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_PTS         (1 << 2)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_SCR         (1 << 3)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_RES         (1 << 4)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_STI         (1 << 5)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_ERR         (1 << 6)
+#define USB_VIDEO_VS_PAYLOAD_HEADER_EOH         (1 << 7)
+
+// Common header for all payloads.
+typedef struct {
+    uint8_t bHeaderLength;
+    uint8_t bmHeaderInfo;
+
+} __PACKED usb_video_vs_payload_header;
+
+typedef struct {
+    uint8_t bHeaderLength;
+    uint8_t bmHeaderInfo;
+    uint32_t dwPresentationTime;
+    uint32_t scrSourceTimeClock;
+    // Frame number when the source clock was sampled.
+    uint16_t scrSourceClockSOFCounter;
+} __PACKED usb_video_vs_uncompressed_payload_header;
+
+__END_CDECLS;
+
+
+#endif  // SYSROOT_ZIRCON_HW_USB_VIDEO_H_
diff --git a/arch/x64/sysroot/include/zircon/limits.h b/arch/x64/sysroot/include/zircon/limits.h
index 4c691a3..f062d5e 100644
--- a/arch/x64/sysroot/include/zircon/limits.h
+++ b/arch/x64/sysroot/include/zircon/limits.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_LIMITS_H_
-#define ZIRCON_LIMITS_H_
+#ifndef SYSROOT_ZIRCON_LIMITS_H_
+#define SYSROOT_ZIRCON_LIMITS_H_
 
 #include <stdint.h>
 
 #define ZX_PAGE_SHIFT ((uint32_t)12u)
-#define ZX_PAGE_SIZE ((uint32_t)(1u << ZX_PAGE_SHIFT))
+#define ZX_PAGE_SIZE ((uintptr_t)(1u << ZX_PAGE_SHIFT))
 #define ZX_PAGE_MASK (ZX_PAGE_SIZE - 1u)
 
-#endif // ZIRCON_LIMITS_H_
+#endif  // SYSROOT_ZIRCON_LIMITS_H_
diff --git a/arch/x64/sysroot/include/zircon/listnode.h b/arch/x64/sysroot/include/zircon/listnode.h
index b987bdf..fb64acf 100644
--- a/arch/x64/sysroot/include/zircon/listnode.h
+++ b/arch/x64/sysroot/include/zircon/listnode.h
@@ -2,303 +2,299 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_LISTNODE_H_
+#define SYSROOT_ZIRCON_LISTNODE_H_
 
-#include <zircon/compiler.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <zircon/compiler.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 #define containerof(ptr, type, member) ((type*)((uintptr_t)(ptr)-offsetof(type, member)))
 
 typedef struct list_node list_node_t;
 
 struct list_node {
-    list_node_t* prev;
-    list_node_t* next;
+  list_node_t* prev;
+  list_node_t* next;
 };
 
 #define LIST_INITIAL_VALUE(list) \
-    { &(list), &(list) }
+  { &(list), &(list) }
 #define LIST_INITIAL_CLEARED_VALUE \
-    { NULL, NULL }
+  { NULL, NULL }
 
-static inline void list_initialize(list_node_t* list) {
-    list->prev = list->next = list;
-}
+static inline void list_initialize(list_node_t* list) { list->prev = list->next = list; }
 
-static inline void list_clear_node(list_node_t* item) {
-    item->prev = item->next = 0;
-}
+static inline void list_clear_node(list_node_t* item) { item->prev = item->next = 0; }
 
 static inline bool list_in_list(const list_node_t* item) {
-    if (item->prev == 0 && item->next == 0)
-        return false;
-    else
-        return true;
+  if (item->prev == 0 && item->next == 0)
+    return false;
+  else
+    return true;
 }
 
 static inline void list_add_head(list_node_t* list, list_node_t* item) {
-    item->next = list->next;
-    item->prev = list;
-    list->next->prev = item;
-    list->next = item;
+  item->next = list->next;
+  item->prev = list;
+  list->next->prev = item;
+  list->next = item;
 }
 
 #define list_add_after(entry, new_entry) list_add_head(entry, new_entry)
 
 static inline void list_add_tail(list_node_t* list, list_node_t* item) {
-    item->prev = list->prev;
-    item->next = list;
-    list->prev->next = item;
-    list->prev = item;
+  item->prev = list->prev;
+  item->next = list;
+  list->prev->next = item;
+  list->prev = item;
 }
 
 #define list_add_before(entry, new_entry) list_add_tail(entry, new_entry)
 
 static inline void list_delete(list_node_t* item) {
-    item->next->prev = item->prev;
-    item->prev->next = item->next;
-    item->prev = item->next = 0;
+  item->next->prev = item->prev;
+  item->prev->next = item->next;
+  item->prev = item->next = 0;
 }
 
 static inline void list_replace_node(list_node_t* old_node, list_node_t* new_node) {
-    // replace a spot in a list with a new node
-    // assumes old_node is part of a list and new_node is not
-    new_node->next = old_node->next;
-    new_node->prev = old_node->prev;
-    old_node->prev = old_node->next = 0;
+  // replace a spot in a list with a new node
+  // assumes old_node is part of a list and new_node is not
+  new_node->next = old_node->next;
+  new_node->prev = old_node->prev;
+  old_node->prev = old_node->next = 0;
 
-    new_node->next->prev = new_node;
-    new_node->prev->next = new_node;
+  new_node->next->prev = new_node;
+  new_node->prev->next = new_node;
 }
 
 static inline list_node_t* list_remove_head(list_node_t* list) {
-    if (list->next != list) {
-        list_node_t* item = list->next;
-        list_delete(item);
-        return item;
-    } else {
-        return NULL;
-    }
+  if (list->next != list) {
+    list_node_t* item = list->next;
+    list_delete(item);
+    return item;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_remove_head_type(list, type, element)   \
-    ({                                               \
-        list_node_t* __nod = list_remove_head(list); \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_remove_head_type(list, type, element) \
+  ({                                               \
+    list_node_t* __nod = list_remove_head(list);   \
+    type* __t;                                     \
+    if (__nod)                                     \
+      __t = containerof(__nod, type, element);     \
+    else                                           \
+      __t = (type*)0;                              \
+    __t;                                           \
+  })
 
 static inline list_node_t* list_remove_tail(list_node_t* list) {
-    if (list->prev != list) {
-        list_node_t* item = list->prev;
-        list_delete(item);
-        return item;
-    } else {
-        return NULL;
-    }
+  if (list->prev != list) {
+    list_node_t* item = list->prev;
+    list_delete(item);
+    return item;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_remove_tail_type(list, type, element)   \
-    ({                                               \
-        list_node_t* __nod = list_remove_tail(list); \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_remove_tail_type(list, type, element) \
+  ({                                               \
+    list_node_t* __nod = list_remove_tail(list);   \
+    type* __t;                                     \
+    if (__nod)                                     \
+      __t = containerof(__nod, type, element);     \
+    else                                           \
+      __t = (type*)0;                              \
+    __t;                                           \
+  })
 
-static inline list_node_t* list_peek_head(list_node_t* list) {
-    if (list->next != list) {
-        return list->next;
-    } else {
-        return NULL;
-    }
+static inline list_node_t* list_peek_head(const list_node_t* list) {
+  if (list->next != list) {
+    return list->next;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_peek_head_type(list, type, element)     \
-    ({                                               \
-        list_node_t* __nod = list_peek_head(list);   \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_peek_head_type(list, type, element) \
+  ({                                             \
+    list_node_t* __nod = list_peek_head(list);   \
+    type* __t;                                   \
+    if (__nod)                                   \
+      __t = containerof(__nod, type, element);   \
+    else                                         \
+      __t = (type*)0;                            \
+    __t;                                         \
+  })
 
-static inline list_node_t* list_peek_tail(list_node_t* list) {
-    if (list->prev != list) {
-        return list->prev;
-    } else {
-        return NULL;
-    }
+static inline list_node_t* list_peek_tail(const list_node_t* list) {
+  if (list->prev != list) {
+    return list->prev;
+  } else {
+    return NULL;
+  }
 }
 
-#define list_peek_tail_type(list, type, element)     \
-    ({                                               \
-        list_node_t* __nod = list_peek_tail(list);   \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_peek_tail_type(list, type, element) \
+  ({                                             \
+    list_node_t* __nod = list_peek_tail(list);   \
+    type* __t;                                   \
+    if (__nod)                                   \
+      __t = containerof(__nod, type, element);   \
+    else                                         \
+      __t = (type*)0;                            \
+    __t;                                         \
+  })
 
 static inline list_node_t* list_prev(list_node_t* list, list_node_t* item) {
-    if (item->prev != list)
-        return item->prev;
-    else
-        return NULL;
+  if (item->prev != list)
+    return item->prev;
+  else
+    return NULL;
 }
 
-#define list_prev_type(list, item, type, element)    \
-    ({                                               \
-        list_node_t* __nod = list_prev(list, item);  \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_prev_type(list, item, type, element) \
+  ({                                              \
+    list_node_t* __nod = list_prev(list, item);   \
+    type* __t;                                    \
+    if (__nod)                                    \
+      __t = containerof(__nod, type, element);    \
+    else                                          \
+      __t = (type*)0;                             \
+    __t;                                          \
+  })
 
 static inline list_node_t* list_prev_wrap(list_node_t* list, list_node_t* item) {
-    if (item->prev != list)
-        return item->prev;
-    else if (item->prev->prev != list)
-        return item->prev->prev;
-    else
-        return NULL;
+  if (item->prev != list)
+    return item->prev;
+  else if (item->prev->prev != list)
+    return item->prev->prev;
+  else
+    return NULL;
 }
 
-#define list_prev_wrap_type(list, item, type, element)   \
-    ({                                                   \
-        list_node_t* __nod = list_prev_wrap(list, item); \
-        type* __t;                                       \
-        if (__nod)                                       \
-            __t = containerof(__nod, type, element);     \
-        else                                             \
-            __t = (type*)0;                              \
-        __t;                                             \
-    })
+#define list_prev_wrap_type(list, item, type, element) \
+  ({                                                   \
+    list_node_t* __nod = list_prev_wrap(list, item);   \
+    type* __t;                                         \
+    if (__nod)                                         \
+      __t = containerof(__nod, type, element);         \
+    else                                               \
+      __t = (type*)0;                                  \
+    __t;                                               \
+  })
 
 static inline list_node_t* list_next(list_node_t* list, list_node_t* item) {
-    if (item->next != list)
-        return item->next;
-    else
-        return NULL;
+  if (item->next != list)
+    return item->next;
+  else
+    return NULL;
 }
 
-#define list_next_type(list, item, type, element)    \
-    ({                                               \
-        list_node_t* __nod = list_next(list, item);  \
-        type* __t;                                   \
-        if (__nod)                                   \
-            __t = containerof(__nod, type, element); \
-        else                                         \
-            __t = (type*)0;                          \
-        __t;                                         \
-    })
+#define list_next_type(list, item, type, element) \
+  ({                                              \
+    list_node_t* __nod = list_next(list, item);   \
+    type* __t;                                    \
+    if (__nod)                                    \
+      __t = containerof(__nod, type, element);    \
+    else                                          \
+      __t = (type*)0;                             \
+    __t;                                          \
+  })
 
 static inline list_node_t* list_next_wrap(list_node_t* list, list_node_t* item) {
-    if (item->next != list)
-        return item->next;
-    else if (item->next->next != list)
-        return item->next->next;
-    else
-        return NULL;
+  if (item->next != list)
+    return item->next;
+  else if (item->next->next != list)
+    return item->next->next;
+  else
+    return NULL;
 }
 
-#define list_next_wrap_type(list, item, type, element)   \
-    ({                                                   \
-        list_node_t* __nod = list_next_wrap(list, item); \
-        type* __t;                                       \
-        if (__nod)                                       \
-            __t = containerof(__nod, type, element);     \
-        else                                             \
-            __t = (type*)0;                              \
-        __t;                                             \
-    })
+#define list_next_wrap_type(list, item, type, element) \
+  ({                                                   \
+    list_node_t* __nod = list_next_wrap(list, item);   \
+    type* __t;                                         \
+    if (__nod)                                         \
+      __t = containerof(__nod, type, element);         \
+    else                                               \
+      __t = (type*)0;                                  \
+    __t;                                               \
+  })
 
 // iterates over the list, node should be list_node_t*
 #define list_for_every(list, node) for (node = (list)->next; node != (list); node = node->next)
 
 // iterates over the list in a safe way for deletion of current node
 // node and temp_node should be list_node_t*
-#define list_for_every_safe(list, node, temp_node)                      \
-    for (node = (list)->next, temp_node = (node)->next; node != (list); \
-         node = temp_node, temp_node = (node)->next)
+#define list_for_every_safe(list, node, temp_node)                    \
+  for (node = (list)->next, temp_node = (node)->next; node != (list); \
+       node = temp_node, temp_node = (node)->next)
 
 // iterates over the list, entry should be the container structure type *
-#define list_for_every_entry(list, entry, type, member)                                 \
-    for ((entry) = containerof((list)->next, type, member); &(entry)->member != (list); \
-         (entry) = containerof((entry)->member.next, type, member))
+#define list_for_every_entry(list, entry, type, member)                               \
+  for ((entry) = containerof((list)->next, type, member); &(entry)->member != (list); \
+       (entry) = containerof((entry)->member.next, type, member))
 
 // iterates over the list in a safe way for deletion of current node
 // entry and temp_entry should be the container structure type *
 #define list_for_every_entry_safe(list, entry, temp_entry, type, member) \
-    for (entry = containerof((list)->next, type, member),                \
-        temp_entry = containerof((entry)->member.next, type, member);    \
-         &(entry)->member != (list);                                     \
-         entry = temp_entry, temp_entry = containerof((temp_entry)->member.next, type, member))
+  for (entry = containerof((list)->next, type, member),                  \
+      temp_entry = containerof((entry)->member.next, type, member);      \
+       &(entry)->member != (list);                                       \
+       entry = temp_entry, temp_entry = containerof((temp_entry)->member.next, type, member))
 
 static inline bool list_is_empty(const list_node_t* list) {
-    return (list->next == list) ? true : false;
+  return (list->next == list) ? true : false;
 }
 
 static inline size_t list_length(const list_node_t* list) {
-    size_t cnt = 0;
-    const list_node_t* node = list;
-    list_for_every(list, node) {
-        cnt++;
-    }
+  size_t cnt = 0;
+  const list_node_t* node = list;
+  list_for_every(list, node) { cnt++; }
 
-    return cnt;
+  return cnt;
 }
 
 // Splice the contents of splice_from into the list immediately following pos.
 static inline void list_splice_after(list_node_t* splice_from, list_node_t* pos) {
-    if (list_is_empty(splice_from)) {
-        return;
-    }
-    splice_from->next->prev = pos;
-    splice_from->prev->next = pos->next;
-    pos->next->prev = splice_from->prev;
-    pos->next = splice_from->next;
-    list_initialize(splice_from);
+  if (list_is_empty(splice_from)) {
+    return;
+  }
+  splice_from->next->prev = pos;
+  splice_from->prev->next = pos->next;
+  pos->next->prev = splice_from->prev;
+  pos->next = splice_from->next;
+  list_initialize(splice_from);
 }
 
 // Split the contents of list after (but not including) pos, into split_to
 // (which should be empty).
-static inline void list_split_after(list_node_t* list, list_node_t* pos,
-                                    list_node_t* split_to) {
-    if (pos->next == list) {
-        list_initialize(split_to);
-        return;
-    }
-    split_to->prev = list->prev;
-    split_to->prev->next = split_to;
-    split_to->next = pos->next;
-    split_to->next->prev = split_to;
-    pos->next = list;
-    list->prev = pos;
+static inline void list_split_after(list_node_t* list, list_node_t* pos, list_node_t* split_to) {
+  if (pos->next == list) {
+    list_initialize(split_to);
+    return;
+  }
+  split_to->prev = list->prev;
+  split_to->prev->next = split_to;
+  split_to->next = pos->next;
+  split_to->next->prev = split_to;
+  pos->next = list;
+  list->prev = pos;
 }
 
 // Moves all the contents of old_list (which may or may not be empty)
 // to new_list (which should be empty).
 static inline void list_move(list_node_t* old_list, list_node_t* new_list) {
-    list_initialize(new_list);
-    list_splice_after(old_list, new_list);
+  list_initialize(new_list);
+  list_splice_after(old_list, new_list);
 }
 
-__END_CDECLS;
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_LISTNODE_H_
diff --git a/arch/x64/sysroot/include/zircon/lookup.h b/arch/x64/sysroot/include/zircon/lookup.h
new file mode 100644
index 0000000..fffa781
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/lookup.h
@@ -0,0 +1,34 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_LOOKUP_H_
+#define SYSROOT_ZIRCON_LOOKUP_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <zircon/compiler.h>
+
+__BEGIN_CDECLS
+
+struct address {
+  int family;
+  unsigned scopeid;
+  uint8_t addr[16];
+  int sortkey;
+};
+
+/* The limit of 48 results is a non-sharp bound on the number of addresses
+ * that can fit in one 512-byte DNS packet full of v4 results and a second
+ * packet full of v6 results. Due to headers, the actual limit is lower. */
+#define MAXADDRS 48
+
+// This function is used by musl to perform an actual DNS lookup - it takes
+// a name and address family, sends a DNS query, and fills out the addresses
+// and canonical name with the response.
+int _getaddrinfo_from_dns(struct address buf[MAXADDRS], char canon[256], const char* name,
+                          int family);
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_LOOKUP_H_
diff --git a/arch/x64/sysroot/include/zircon/pixelformat.h b/arch/x64/sysroot/include/zircon/pixelformat.h
index 8d15c0c..f28f35f 100644
--- a/arch/x64/sysroot/include/zircon/pixelformat.h
+++ b/arch/x64/sysroot/include/zircon/pixelformat.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PIXELFORMAT_H_
-#define ZIRCON_PIXELFORMAT_H_
+#ifndef SYSROOT_ZIRCON_PIXELFORMAT_H_
+#define SYSROOT_ZIRCON_PIXELFORMAT_H_
 
 #include <stdint.h>
 
@@ -20,7 +20,9 @@
 #define ZX_PIXEL_FORMAT_MONO_8     ((zx_pixel_format_t)0x00010007)
 #define ZX_PIXEL_FORMAT_GRAY_8     ((zx_pixel_format_t)0x00010007)
 #define ZX_PIXEL_FORMAT_NV12       ((zx_pixel_format_t)0x00010008)
-
+#define ZX_PIXEL_FORMAT_RGB_888    ((zx_pixel_format_t)0x00030009)
+#define ZX_PIXEL_FORMAT_ABGR_8888  ((zx_pixel_format_t)0x0004000a)
+#define ZX_PIXEL_FORMAT_BGR_888x   ((zx_pixel_format_t)0x0004000b)
 #define ZX_PIXEL_FORMAT_BYTES(pf)  (((pf) >> 16) & 7)
 
-#endif // ZIRCON_PIXELFORMAT_H_
+#endif // SYSROOT_ZIRCON_PIXELFORMAT_H_
diff --git a/arch/x64/sysroot/include/zircon/process.h b/arch/x64/sysroot/include/zircon/process.h
index bec8a79..ef2bcb1 100644
--- a/arch/x64/sysroot/include/zircon/process.h
+++ b/arch/x64/sysroot/include/zircon/process.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PROCESS_H_
-#define ZIRCON_PROCESS_H_
+#ifndef SYSROOT_ZIRCON_PROCESS_H_
+#define SYSROOT_ZIRCON_PROCESS_H_
 
-#include <zircon/types.h>
 #include <stdint.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
@@ -32,4 +32,4 @@
 
 __END_CDECLS
 
-#endif // ZIRCON_PROCESS_H_
+#endif  // SYSROOT_ZIRCON_PROCESS_H_
diff --git a/arch/x64/sysroot/include/zircon/processargs.h b/arch/x64/sysroot/include/zircon/processargs.h
index dfc771f..ee99985 100644
--- a/arch/x64/sysroot/include/zircon/processargs.h
+++ b/arch/x64/sysroot/include/zircon/processargs.h
@@ -2,95 +2,95 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_PROCESSARGS_H_
-#define ZIRCON_PROCESSARGS_H_
+#ifndef SYSROOT_ZIRCON_PROCESSARGS_H_
+#define SYSROOT_ZIRCON_PROCESSARGS_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
 #include <zircon/types.h>
-#include <stdint.h>
 
 __BEGIN_CDECLS
 
 // This is a protocol for passing state to a new process
 // via a message in a channel.
 
-#define ZX_PROCARGS_PROTOCOL ((uint32_t)0x4150585du) // MXPA
+#define ZX_PROCARGS_PROTOCOL ((uint32_t)0x4150585du)  // MXPA
 #define ZX_PROCARGS_VERSION ((uint32_t)0x0001000u)
 
 typedef struct zx_proc_args zx_proc_args_t;
 
 struct zx_proc_args {
-    // Protocol and version identifiers to allow for
-    // different process start message protocols and
-    // versioning of the same.
-    uint32_t protocol;
-    uint32_t version;
+  // Protocol and version identifiers to allow for
+  // different process start message protocols and
+  // versioning of the same.
+  uint32_t protocol;
+  uint32_t version;
 
-    // Offset from start of message to handle info
-    // array, which contains one uint32_t per handle
-    // passed along with the message.
-    uint32_t handle_info_off;
+  // Offset from start of message to handle info
+  // array, which contains one uint32_t per handle
+  // passed along with the message.
+  uint32_t handle_info_off;
 
-    // Offset from start of message to arguments and
-    // count of arguments.  Arguments are provided as
-    // a set of null-terminated utf-8 strings, one
-    // after the other.
-    uint32_t args_off;
-    uint32_t args_num;
+  // Offset from start of message to arguments and
+  // count of arguments.  Arguments are provided as
+  // a set of null-terminated utf-8 strings, one
+  // after the other.
+  uint32_t args_off;
+  uint32_t args_num;
 
-    // Offset from start of message to environment strings and count of
-    // them.  Environment entries are provided as a set of null-terminated
-    // UTF-8 strings, one after the other.  Canonically each string has
-    // the form "NAME=VALUE", but nothing enforces this.
-    uint32_t environ_off;
-    uint32_t environ_num;
+  // Offset from start of message to environment strings and count of
+  // them.  Environment entries are provided as a set of null-terminated
+  // UTF-8 strings, one after the other.  Canonically each string has
+  // the form "NAME=VALUE", but nothing enforces this.
+  uint32_t environ_off;
+  uint32_t environ_num;
 
-    // Offset from start of message to name strings and count of them.
-    // These strings are packed similar to the argument strings,
-    // but are referenced by PA_NS_* handle table entries and used
-    // to set up namespaces.
-    //
-    // Specifically: In a handle table entry with PA_HND_TYPE(info)
-    // of PA_NS_*, PA_HND_ARG(info) is an index into this name table.
-    uint32_t names_off;
-    uint32_t names_num;
+  // Offset from start of message to name strings and count of them.
+  // These strings are packed similar to the argument strings,
+  // but are referenced by PA_NS_* handle table entries and used
+  // to set up namespaces.
+  //
+  // Specifically: In a handle table entry with PA_HND_TYPE(info)
+  // of PA_NS_*, PA_HND_ARG(info) is an index into this name table.
+  uint32_t names_off;
+  uint32_t names_num;
 };
 
 // Handle Info entries associate a type and optional
 // argument with each handle included in the process
 // arguments message.
-#define PA_HND(type, arg)          (((type)&0xFF)| (((arg)&0xFFFF)<<16))
-#define PA_HND_TYPE(n)             ((n) & 0xFF)
-#define PA_HND_SUBTYPE(n)          (((n) >> 8) & 0xFF)
-#define PA_HND_ARG(n)              (((n) >> 16) & 0xFFFF)
+#define PA_HND(type, arg) (((type)&0xFF) | (((arg)&0xFFFF) << 16))
+#define PA_HND_TYPE(n) ((n)&0xFF)
+#define PA_HND_ARG(n) (((n) >> 16) & 0xFFFF)
 
 // --- Core Runtime Handles ---
 // Used by libc init (or equivalent) and dynamic loader
 
 // Handle to our own process.
-#define PA_PROC_SELF             0x01u
+#define PA_PROC_SELF 0x01u
 
 // Handle to the initial thread of our own process.
-#define PA_THREAD_SELF           0x02u
+#define PA_THREAD_SELF 0x02u
 
-// Handle to a Job object which can be used to make child processes. The
-// Job can be the same as the one used to create this process or it can
+// Handle to a job object which can be used to make child processes.
+//
+// The job can be the same as the one used to create this process or it can
 // be different.
-#define PA_JOB_DEFAULT           0x03u
+#define PA_JOB_DEFAULT 0x03u
 
 // Handle to the root of our address space
-#define PA_VMAR_ROOT             0x04u
+#define PA_VMAR_ROOT 0x04u
 
 // Handle to the VMAR used to load the initial program image.
-#define PA_VMAR_LOADED           0x05u
-
+#define PA_VMAR_LOADED 0x05u
 
 // --- Loader Service and VMO Handles ---
 // Used by libc init (or equivalent) and dynamic loader
 
 // Service for loading shared libraries.
+//
 // See |fuchsia.ldsvc.Loader| for the interface definition.
-#define PA_LDSVC_LOADER          0x10u
+#define PA_LDSVC_LOADER 0x10u
 
 // Handle to the VMO containing the ELF image of the system vDSO.  This
 // handle is duplicable, transferable, readable, and executable, but not
@@ -100,7 +100,7 @@
 // might create or propagate it on to its children so they can do so.
 // Each process's own vDSO was mapped in by its creator before the
 // process started, its address passed as an argument to entry point.
-#define PA_VMO_VDSO              0x11u
+#define PA_VMO_VDSO 0x11u
 
 // Handle to the VMO used to map the initial thread's stack.  This
 // handle usually has all rights.  The protocol between process creator
@@ -111,53 +111,66 @@
 // calling convention for function entry.  Thus the new process can
 // compute its exact stack bounds by subtracting the size reported by
 // this VMO from the (adjusted back up) initial SP value.
-#define PA_VMO_STACK             0x13u
+#define PA_VMO_STACK 0x13u
 
 // VM object handle for the main executable file
-#define PA_VMO_EXECUTABLE        0x14u
+#define PA_VMO_EXECUTABLE 0x14u
 
 // Used by kernel and userboot during startup
-#define PA_VMO_BOOTDATA          0x1Au
+#define PA_VMO_BOOTDATA 0x1Au
 
 // Used by kernel and userboot during startup
-#define PA_VMO_BOOTFS            0x1Bu
+#define PA_VMO_BOOTFS 0x1Bu
 
 // Used by the kernel to export debug information as a file in bootfs.  When
 // devmgr starts, it looks for handles of this type, and adds them as files in
 // /boot/kernel/<vmo-name>.
-#define PA_VMO_KERNEL_FILE       0x1Cu
-
+#define PA_VMO_KERNEL_FILE 0x1Cu
 
 // --- Namespace Handles ---
 
 // A handle which will handle OPEN requests relative
 // to a particular path which is specified by the
 // nametable entry referred to by the "arg" field
-#define PA_NS_DIR                0x20u
+#define PA_NS_DIR 0x20u
 
+// --- File Descriptor Handles ---
 
-// --- FDIO Handles ---
-// Used by libfdio for passing fdtable, fsroot, etc
+// A handle which will be used as a file descriptor.
+#define PA_FD 0x30u
 
-// Handle types the fdio library uses
-#define PA_FDIO_REMOTE           0x32u
-#define PA_FDIO_LOGGER           0x35u
-#define PA_FDIO_SOCKET           0x36u
+// -- Lifecyle handle --
+//
+// A Handle to a channel on which the process may receive lifecycle events from
+// the ELF runner by serving the |fuchsia.process.Lifecycle| protocol.
+#define PA_LIFECYCLE 0x3Au
 
 // Server endpoint for handling connection to appmgr services.
-#define PA_DIRECTORY_REQUEST     0x3Bu
+#define PA_DIRECTORY_REQUEST 0x3Bu
 
 // Used by devmgr and devhosts
-#define PA_RESOURCE              0x3Fu
+#define PA_RESOURCE 0x3Fu
 
+// --- Clock handles ---
+//
+// A clock which provides access to UTC.  Used by runtimes which are expected to
+// provide access to UTC via their standard libraries.
+//
+#define PA_CLOCK_UTC 0x40u
+
+// --- Resource handles ---
+#define PA_MMIO_RESOURCE 0x50
+#define PA_IRQ_RESOURCE 0x51
+#define PA_IOPORT_RESOURCE 0x52
+#define PA_SMC_RESOURCE 0x53
 
 // --- Various ---
 
 // Handle types for one-off use and prototyping
-#define PA_USER0                 0xF0u
-#define PA_USER1                 0xF1u
-#define PA_USER2                 0xF2u
+#define PA_USER0 0xF0u
+#define PA_USER1 0xF1u
+#define PA_USER2 0xF2u
 
 __END_CDECLS
 
-#endif // ZIRCON_PROCESSARGS_H_
+#endif  // SYSROOT_ZIRCON_PROCESSARGS_H_
diff --git a/arch/x64/sysroot/include/zircon/rights.h b/arch/x64/sysroot/include/zircon/rights.h
index 8c9f021..1cfa768 100644
--- a/arch/x64/sysroot/include/zircon/rights.h
+++ b/arch/x64/sysroot/include/zircon/rights.h
@@ -2,34 +2,34 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_RIGHTS_H_
-#define ZIRCON_RIGHTS_H_
+#ifndef SYSROOT_ZIRCON_RIGHTS_H_
+#define SYSROOT_ZIRCON_RIGHTS_H_
 
 #include <stdint.h>
 
 typedef uint32_t zx_rights_t;
-#define ZX_RIGHT_NONE             ((zx_rights_t)0u)
-#define ZX_RIGHT_DUPLICATE        ((zx_rights_t)1u << 0)
-#define ZX_RIGHT_TRANSFER         ((zx_rights_t)1u << 1)
-#define ZX_RIGHT_READ             ((zx_rights_t)1u << 2)
-#define ZX_RIGHT_WRITE            ((zx_rights_t)1u << 3)
-#define ZX_RIGHT_EXECUTE          ((zx_rights_t)1u << 4)
-#define ZX_RIGHT_MAP              ((zx_rights_t)1u << 5)
-#define ZX_RIGHT_GET_PROPERTY     ((zx_rights_t)1u << 6)
-#define ZX_RIGHT_SET_PROPERTY     ((zx_rights_t)1u << 7)
-#define ZX_RIGHT_ENUMERATE        ((zx_rights_t)1u << 8)
-#define ZX_RIGHT_DESTROY          ((zx_rights_t)1u << 9)
-#define ZX_RIGHT_SET_POLICY       ((zx_rights_t)1u << 10)
-#define ZX_RIGHT_GET_POLICY       ((zx_rights_t)1u << 11)
-#define ZX_RIGHT_SIGNAL           ((zx_rights_t)1u << 12)
-#define ZX_RIGHT_SIGNAL_PEER      ((zx_rights_t)1u << 13)
-#define ZX_RIGHT_WAIT             ((zx_rights_t)1u << 14)
-#define ZX_RIGHT_INSPECT          ((zx_rights_t)1u << 15)
-#define ZX_RIGHT_MANAGE_JOB       ((zx_rights_t)1u << 16)
-#define ZX_RIGHT_MANAGE_PROCESS   ((zx_rights_t)1u << 17)
-#define ZX_RIGHT_MANAGE_THREAD    ((zx_rights_t)1u << 18)
-#define ZX_RIGHT_APPLY_PROFILE    ((zx_rights_t)1u << 19)
-#define ZX_RIGHT_SAME_RIGHTS      ((zx_rights_t)1u << 31)
+#define ZX_RIGHT_NONE ((zx_rights_t)0u)
+#define ZX_RIGHT_DUPLICATE ((zx_rights_t)1u << 0)
+#define ZX_RIGHT_TRANSFER ((zx_rights_t)1u << 1)
+#define ZX_RIGHT_READ ((zx_rights_t)1u << 2)
+#define ZX_RIGHT_WRITE ((zx_rights_t)1u << 3)
+#define ZX_RIGHT_EXECUTE ((zx_rights_t)1u << 4)
+#define ZX_RIGHT_MAP ((zx_rights_t)1u << 5)
+#define ZX_RIGHT_GET_PROPERTY ((zx_rights_t)1u << 6)
+#define ZX_RIGHT_SET_PROPERTY ((zx_rights_t)1u << 7)
+#define ZX_RIGHT_ENUMERATE ((zx_rights_t)1u << 8)
+#define ZX_RIGHT_DESTROY ((zx_rights_t)1u << 9)
+#define ZX_RIGHT_SET_POLICY ((zx_rights_t)1u << 10)
+#define ZX_RIGHT_GET_POLICY ((zx_rights_t)1u << 11)
+#define ZX_RIGHT_SIGNAL ((zx_rights_t)1u << 12)
+#define ZX_RIGHT_SIGNAL_PEER ((zx_rights_t)1u << 13)
+#define ZX_RIGHT_WAIT ((zx_rights_t)1u << 14)
+#define ZX_RIGHT_INSPECT ((zx_rights_t)1u << 15)
+#define ZX_RIGHT_MANAGE_JOB ((zx_rights_t)1u << 16)
+#define ZX_RIGHT_MANAGE_PROCESS ((zx_rights_t)1u << 17)
+#define ZX_RIGHT_MANAGE_THREAD ((zx_rights_t)1u << 18)
+#define ZX_RIGHT_APPLY_PROFILE ((zx_rights_t)1u << 19)
+#define ZX_RIGHT_SAME_RIGHTS ((zx_rights_t)1u << 31)
 
 // Convenient names for commonly grouped rights.
 #define ZX_RIGHTS_BASIC (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WAIT | ZX_RIGHT_INSPECT)
@@ -40,88 +40,85 @@
 
 #define ZX_RIGHTS_POLICY (ZX_RIGHT_GET_POLICY | ZX_RIGHT_SET_POLICY)
 
-#define ZX_DEFAULT_CHANNEL_RIGHTS                                                                  \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_DUPLICATE)) | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL |                  \
-     ZX_RIGHT_SIGNAL_PEER)
+#define ZX_DEFAULT_CHANNEL_RIGHTS                                               \
+  ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_DUPLICATE)) | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL | \
+   ZX_RIGHT_SIGNAL_PEER)
 
 #define ZX_DEFAULT_EVENT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_SIGNAL)
 
+#define ZX_DEFAULT_SYSTEM_EVENT_LOW_MEMORY_RIGHTS \
+  (ZX_RIGHT_WAIT | ZX_RIGHT_DUPLICATE | ZX_RIGHT_TRANSFER)
+
 #define ZX_DEFAULT_EVENTPAIR_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
 #define ZX_DEFAULT_FIFO_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO |\
-     ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
-#define ZX_DEFAULT_GUEST_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE |\
-     ZX_RIGHT_INSPECT | ZX_RIGHT_MANAGE_PROCESS)
+#define ZX_DEFAULT_GUEST_RIGHTS                                                 \
+  (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE | ZX_RIGHT_INSPECT | \
+   ZX_RIGHT_MANAGE_PROCESS)
 
 #define ZX_DEFAULT_INTERRUPT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_IO_MAPPING_RIGHTS \
-    (ZX_RIGHT_READ | ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_IO_MAPPING_RIGHTS (ZX_RIGHT_READ | ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_JOB_RIGHTS                                                                      \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHTS_POLICY | ZX_RIGHT_ENUMERATE | \
-     ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_JOB | ZX_RIGHT_MANAGE_PROCESS)
+#define ZX_DEFAULT_JOB_RIGHTS                                                                    \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHTS_POLICY | ZX_RIGHT_ENUMERATE | \
+   ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_JOB | ZX_RIGHT_MANAGE_PROCESS |          \
+   ZX_RIGHT_MANAGE_THREAD)
 
-#define ZX_DEFAULT_LOG_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_LOG_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_PCI_DEVICE_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
+#define ZX_DEFAULT_MSI_RIGHTS (ZX_RIGHTS_BASIC)
 
-#define ZX_DEFAULT_PCI_INTERRUPT_RIGHTS \
-    (ZX_RIGHTS_BASIC  | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_PCI_DEVICE_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
 
-#define ZX_DEFAULT_PORT_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO)
+#define ZX_DEFAULT_PCI_INTERRUPT_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_PROCESS_RIGHTS                                                                  \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_ENUMERATE | ZX_RIGHT_DESTROY | \
-     ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_PROCESS | ZX_RIGHT_MANAGE_THREAD)
+#define ZX_DEFAULT_PORT_RIGHTS ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO)
+
+#define ZX_DEFAULT_PROCESS_RIGHTS                                                                \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_ENUMERATE | ZX_RIGHT_DESTROY | \
+   ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_PROCESS | ZX_RIGHT_MANAGE_THREAD)
 
 #define ZX_DEFAULT_RESOURCE_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE |\
-     ZX_RIGHT_INSPECT)
+  (ZX_RIGHT_TRANSFER | ZX_RIGHT_DUPLICATE | ZX_RIGHT_WRITE | ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_SOCKET_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_GET_PROPERTY |\
-     ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
+#define ZX_DEFAULT_SOCKET_RIGHTS                                                    \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_GET_PROPERTY | ZX_RIGHT_SET_PROPERTY | \
+   ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER)
 
-#define ZX_DEFAULT_THREAD_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY |\
-     ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | ZX_RIGHT_MANAGE_THREAD)
+#define ZX_DEFAULT_STREAM_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_PROPERTY | ZX_RIGHT_SIGNAL)
+
+#define ZX_DEFAULT_THREAD_RIGHTS                                                              \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_DESTROY | ZX_RIGHT_SIGNAL | \
+   ZX_RIGHT_MANAGE_THREAD)
 
 #define ZX_DEFAULT_TIMER_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_VCPU_RIGHTS \
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_EXECUTE | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_VCPU_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHT_EXECUTE | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_VMAR_RIGHTS \
-    (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
+#define ZX_DEFAULT_VMAR_RIGHTS (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
 
-#define ZX_DEFAULT_VMO_RIGHTS\
-    (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY |\
-     ZX_RIGHT_EXECUTE | ZX_RIGHT_MAP | ZX_RIGHT_SIGNAL)
+#define ZX_DEFAULT_VMO_RIGHTS \
+  (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_MAP | ZX_RIGHT_SIGNAL)
 
-#define ZX_DEFAULT_IOMMU_RIGHTS \
-    (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
+#define ZX_DEFAULT_IOMMU_RIGHTS (ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT))
 
 #define ZX_DEFAULT_BTI_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO | ZX_RIGHT_MAP)
+  ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHTS_IO | ZX_RIGHTS_PROPERTY | ZX_RIGHT_MAP)
 
-#define ZX_DEFAULT_PROFILE_RIGHTS \
-    ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHT_APPLY_PROFILE)
+#define ZX_DEFAULT_PROFILE_RIGHTS ((ZX_RIGHTS_BASIC & (~ZX_RIGHT_WAIT)) | ZX_RIGHT_APPLY_PROFILE)
 
-#define ZX_DEFAULT_PMT_RIGHTS \
-    (ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_PMT_RIGHTS (ZX_RIGHT_INSPECT)
 
-#define ZX_DEFAULT_SUSPEND_TOKEN_RIGHTS \
-    (ZX_RIGHT_TRANSFER | ZX_RIGHT_INSPECT)
+#define ZX_DEFAULT_SUSPEND_TOKEN_RIGHTS (ZX_RIGHT_TRANSFER | ZX_RIGHT_INSPECT)
 
 #define ZX_DEFAULT_PAGER_RIGHTS \
-    (ZX_RIGHT_INSPECT | ZX_RIGHT_ENUMERATE | ZX_RIGHT_GET_PROPERTY |\
-     ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_TRANSFER)
+  (ZX_RIGHT_INSPECT | ZX_RIGHT_GET_PROPERTY | ZX_RIGHT_SET_PROPERTY | ZX_RIGHT_TRANSFER)
 
-#endif // ZIRCON_RIGHTS_H_
+#define ZX_DEFAULT_EXCEPTION_RIGHTS (ZX_RIGHT_TRANSFER | ZX_RIGHTS_PROPERTY | ZX_RIGHT_INSPECT)
+
+#define ZX_DEFAULT_CLOCK_RIGHTS (ZX_RIGHTS_BASIC | ZX_RIGHTS_IO)
+
+#endif  // SYSROOT_ZIRCON_RIGHTS_H_
diff --git a/arch/x64/sysroot/include/zircon/sanitizer.h b/arch/x64/sysroot/include/zircon/sanitizer.h
index 0b0b7a3..c2f2e8e 100644
--- a/arch/x64/sysroot/include/zircon/sanitizer.h
+++ b/arch/x64/sysroot/include/zircon/sanitizer.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SANITIZER_H_
+#define SYSROOT_ZIRCON_SANITIZER_H_
 
 // Interfaces declared in this file are intended for the use of sanitizer
 // runtime library implementation code.  Each sanitizer runtime works only
@@ -38,14 +39,20 @@
 //     [shadow_base,    shadow_limit)   Shadow memory, preallocated.
 //     [0,              shadow_base)    Shadow gap, cannot be allocated.
 typedef struct saniziter_shadow_bounds {
-    uintptr_t shadow_base;
-    uintptr_t shadow_limit;
-    uintptr_t memory_limit;
+  uintptr_t shadow_base;
+  uintptr_t shadow_limit;
+  uintptr_t memory_limit;
 } sanitizer_shadow_bounds_t;
 
 // Returns the shadow bounds for the current process.
 sanitizer_shadow_bounds_t __sanitizer_shadow_bounds(void);
 
+// Fill the shadow memory corresponding to [base, base+size) with |value|. The
+// threshold is used as a hint to determine when to switch to a more efficient
+// mechanism when zero-filling large shadow regions. This assumes that both
+// |base| and |size| are aligned to the shadow multiple.
+void __sanitizer_fill_shadow(uintptr_t base, size_t size, uint8_t value, size_t threshold);
+
 // Write logging information from the sanitizer runtime.  The buffer
 // is expected to be printable text with '\n' ending each line.
 // Timestamps and globally unique identifiers of the calling process
@@ -58,7 +65,7 @@
 // files and their debugging information.  The text can contain markup
 // around address values that should be resolved symbolically; see
 // TODO(mcgrathr) for the format and details of the post-processor.
-void __sanitizer_log_write(const char *buffer, size_t len);
+void __sanitizer_log_write(const char* buffer, size_t len);
 
 // Runtimes that have binary data to publish (e.g. coverage) use this
 // interface.  The name describes the data sink that will receive this
@@ -80,16 +87,32 @@
 // after this call returns.  On success, this yields a read-only VMO
 // handle from which the contents associated with that name can be
 // read; the caller is responsible for closing this handle.
-zx_status_t __sanitizer_get_configuration(const char* config_name,
-                                          zx_handle_t* out_vmo);
+zx_status_t __sanitizer_get_configuration(const char* config_name, zx_handle_t* out_vmo);
 
 // Changes protection of the code in the range of len bytes starting
 // from addr. The writable argument specifies whether the code should
 // be made writable or not. This function is only valid on ranges within
 // the caller's own code segment.
 // TODO(phosek) removes this when the proper debugging interface exists.
-zx_status_t __sanitizer_change_code_protection(uintptr_t addr, size_t len,
-                                               bool writable);
+zx_status_t __sanitizer_change_code_protection(uintptr_t addr, size_t len, bool writable);
+
+// This stops all other threads in the process so memory should be quiescent.
+// Then it makes callbacks for memory regions containing non-const global
+// variables, thread stacks, thread registers, and thread-local storage
+// regions (this includes thread_local variables as well as tss_set or
+// pthread_setspecific values).  Each callback is optional; no such callbacks
+// are made if a null function pointer is given.  The memory region passed to
+// each callback can be accessed only during that single callback and might no
+// longer be valid once the callback returns.  Then it makes a final callback
+// before allowing other threads to resume running normally.  If there are
+// problems stopping threads, no memory callbacks will be made and the
+// argument to the final callback will get an error code rather than ZX_OK.
+typedef void sanitizer_memory_snapshot_callback_t(void* mem, size_t len, void* arg);
+void __sanitizer_memory_snapshot(sanitizer_memory_snapshot_callback_t* globals,
+                                 sanitizer_memory_snapshot_callback_t* stacks,
+                                 sanitizer_memory_snapshot_callback_t* regs,
+                                 sanitizer_memory_snapshot_callback_t* tls,
+                                 void (*done)(zx_status_t, void*), void* arg);
 
 // The "hook" interfaces are functions that the sanitizer runtime library
 // can define and libc will call.  There are default definitions in libc
@@ -106,17 +129,16 @@
 // the initial thread has switched to its real thread stack.  Since not
 // even all of libc's own constructors have run yet, this should not call
 // into libc or other library code.
-__EXPORT void __sanitizer_startup_hook(int argc, char** argv, char** envp,
-                                       void* stack_base, size_t stack_size);
+__EXPORT void __sanitizer_startup_hook(int argc, char** argv, char** envp, void* stack_base,
+                                       size_t stack_size);
 
 // This is called when a new thread has been created but is not yet
 // running.  Its C11 thrd_t value has been determined and its stack has
 // been allocated.  All that remains is to actually start the thread
 // running (which can fail only in catastrophic bug situations).  Its
 // return value will be passed to __sanitizer_thread_create_hook, below.
-__EXPORT void* __sanitizer_before_thread_create_hook(
-    thrd_t thread, bool detached, const char* name,
-    void* stack_base, size_t stack_size);
+__EXPORT void* __sanitizer_before_thread_create_hook(thrd_t thread, bool detached, const char* name,
+                                                     void* stack_base, size_t stack_size);
 
 // This is called after a new thread has been created or creation has
 // failed at the final stage; __sanitizer_before_thread_create_hook has
@@ -128,8 +150,7 @@
 // <threads.h> thrd_* value), thread creation has failed and the thread
 // details reported to __sanitizer_before_thread_create_hook will be
 // freed without the thread ever starting.
-__EXPORT void __sanitizer_thread_create_hook(
-    void* hook, thrd_t thread, int error);
+__EXPORT void __sanitizer_thread_create_hook(void* hook, thrd_t thread, int error);
 
 // This is called in each new thread as it starts up.  The argument is
 // the same one returned by __sanitizer_before_thread_create_hook and
@@ -141,4 +162,10 @@
 // The argument is the same one passed to __sanitizer_thread_start_hook.
 __EXPORT void __sanitizer_thread_exit_hook(void* hook, thrd_t self);
 
+// This is called with the argument to _exit and its return value
+// is the actual exit status for the process.
+__EXPORT int __sanitizer_process_exit_hook(int status);
+
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SANITIZER_H_
diff --git a/arch/x64/sysroot/include/zircon/status.h b/arch/x64/sysroot/include/zircon/status.h
index 5d83c72..798d2b0 100644
--- a/arch/x64/sysroot/include/zircon/status.h
+++ b/arch/x64/sysroot/include/zircon/status.h
@@ -15,8 +15,8 @@
 //
 // For example, zx_status_get_string(ZX_ERR_TIMED_OUT) returns the string
 // "ZX_ERR_TIMED_OUT".
-const char* _zx_status_get_string(zx_status_t status);
-const char* zx_status_get_string(zx_status_t status);
+__EXPORT const char* _zx_status_get_string(zx_status_t status);
+__EXPORT const char* zx_status_get_string(zx_status_t status);
 
 #ifdef __cplusplus
 }
diff --git a/arch/x64/sysroot/include/zircon/string_view.h b/arch/x64/sysroot/include/zircon/string_view.h
new file mode 100644
index 0000000..f54ff2a
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/string_view.h
@@ -0,0 +1,67 @@
+// Copyright 2020 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.
+
+#pragma once
+
+#include <stddef.h>
+#if __cplusplus >= 201103L && __has_include(<type_traits>)
+#include <type_traits>
+#endif
+
+// This represents a UTF-8 string constant provided by the vDSO itself.
+// This pointer remains valid and the string doesn't change for the
+// life of the process (if not the system).
+//
+// This type exists to be the return value type for vDSO functions.
+// In current machine ABIs, it's returned "for free" in two registers.
+// To a C caller, these functions have ABIs indistinguishable from if
+// they simply returned `const char*` so there is no overhead to
+// supporting the explicit-length API as well as the traditional C
+// string API, though it does require writing out `.c_str` in the
+// source.  C++ 17 callers can take advantage of direct coercion to
+// the standard std::string_view and std::u8string_view types, which
+// also allows e.g. direct construction of std::string.
+typedef struct {
+  const char* c_str;  // UTF-8, guaranteed to be '\0'-terminated.
+  size_t length;      // Length, not including the '\0' terminator.
+
+#ifdef __cplusplus
+  // This is ABI-identical to the usual implementation of std::string_view,
+  // when applied to NUL-terminated C strings.  But this API doesn't presume
+  // that std::string_view has a particular implementation or exists at all.
+  // For convenience of use without directly using the C++ standard library
+  // API, a templatized implicit coercion is defined to types that have the
+  // API of std::string_view or std::u8string_view.  With the most common
+  // implementations, this coercion will be compiled away to nothing.
+  template <
+      typename _T
+#if __cplusplus >= 201103L && __has_include(<type_traits>)
+      ,
+      typename = typename std::enable_if<sizeof(typename _T::value_type) == sizeof(char)>::type
+#endif
+      >
+  operator _T() {
+    // It's preferable to exclude incompatible types via SFINAE so that
+    // the user's diagnostic experience is exactly as if no coercion
+    // operator existed.  SFINAE should exclude this definition when a
+    // C++11 <type_traits> is available to define std::enable_if.  If
+    // no standard C++ library header is available, this will provide
+    // a specific diagnostic.
+    static_assert(sizeof(typename _T::value_type) == sizeof(char),
+                  "zx_string_view_t can be coerced to C++ 17 std::string_view"
+                  " or std::u8string_view or types with equivalent API");
+    return {reinterpret_cast<typename _T::const_pointer>(c_str), length};
+  }
+
+  // Preferably zx_string_view_t values should just be coerced to
+  // std::string_view.  But it provides the most minimal aspects of
+  // the equivalent API in case a return value expression is used
+  // directly as `zx_foo_string().data()`, for example.
+  using value_type = char;
+  using const_pointer = const char*;
+  using size_type = size_t;
+  const_pointer data() const { return c_str; }
+  size_type size() const { return length; }
+#endif
+} zx_string_view_t;
diff --git a/arch/x64/sysroot/include/zircon/syscalls.h b/arch/x64/sysroot/include/zircon/syscalls.h
index b5c0057..9e79e55 100644
--- a/arch/x64/sysroot/include/zircon/syscalls.h
+++ b/arch/x64/sysroot/include/zircon/syscalls.h
@@ -2,29 +2,40 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_H_
-#define ZIRCON_SYSCALLS_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_H_
+#define SYSROOT_ZIRCON_SYSCALLS_H_
 
-#include <zircon/types.h>
-#include <zircon/syscalls/types.h>
-
-#include <zircon/syscalls/pci.h>
+#include <zircon/string_view.h>
 #include <zircon/syscalls/object.h>
+#include <zircon/syscalls/pci.h>
 #include <zircon/syscalls/profile.h>
+#include <zircon/syscalls/types.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
-#if defined(__clang__)
-#define ZX_SYSCALL_PARAM_ATTR(x)   __attribute__((annotate("zx_" #x)))
+#define _ZX_SYSCALL_DECL(name, type, attrs, nargs, arglist, prototype) \
+  extern attrs type zx_##name prototype;                               \
+  extern attrs type _zx_##name prototype;
+
+#ifdef __clang__
+#define _ZX_SYSCALL_ANNO(attr) __attribute__((attr))
 #else
-#define ZX_SYSCALL_PARAM_ATTR(x)   // no-op
+#define _ZX_SYSCALL_ANNO(attr)  // Nothing for compilers without the support.
 #endif
 
-#include <zircon/syscalls/definitions.h>
+#include <zircon/syscalls/internal/cdecls.inc>
+
+#undef _ZX_SYSCALL_ANNO
+#undef _ZX_SYSCALL_DECL
 
 // Compatibility wrappers for deprecated syscalls also go here, when
 // there are any.
 
+// This DEPRECATED interface is replaced by zx_system_get_version_string.
+zx_status_t zx_system_get_version(char* version, size_t version_size) __LEAF_FN;
+zx_status_t _zx_system_get_version(char* version, size_t version_size) __LEAF_FN;
+
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_H_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/clock.h b/arch/x64/sysroot/include/zircon/syscalls/clock.h
new file mode 100644
index 0000000..eab1cd1
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/syscalls/clock.h
@@ -0,0 +1,90 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
+#define SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
+
+#include <zircon/time.h>
+
+// clang-format off
+
+// Argument version identifiers.
+//
+// All zx_clock_* syscalls which fetch or receive a structure's worth of
+// arguments encode a version number in the options field of the syscall.  This
+// version field is in the same location and is the same size for each syscall,
+// so a common set of macros may be used for encoding and decoding.
+#define ZX_CLOCK_ARGS_VERSION_SHIFT              ((uint64_t)58u)
+#define ZX_CLOCK_ARGS_VERSION_BITS               ((uint64_t)6u)
+#define ZX_CLOCK_ARGS_VERSION_MASK \
+  (((((uint64_t)1) << ZX_CLOCK_ARGS_VERSION_BITS) - 1) << ZX_CLOCK_ARGS_VERSION_SHIFT)
+#define ZX_CLOCK_ARGS_VERSION(_N) \
+  (((uint64_t)(_N) << ZX_CLOCK_ARGS_VERSION_SHIFT) & ZX_CLOCK_ARGS_VERSION_MASK)
+
+// Clock creation options.
+#define ZX_CLOCK_OPT_MONOTONIC                   ((uint64_t)1u << 0)
+#define ZX_CLOCK_OPT_CONTINUOUS                  ((uint64_t)1u << 1)
+#define ZX_CLOCK_OPT_AUTO_START                  ((uint64_t)1u << 2)
+
+#define ZX_CLOCK_OPTS_ALL ( \
+        ZX_CLOCK_OPT_MONOTONIC | \
+        ZX_CLOCK_OPT_CONTINUOUS | \
+        ZX_CLOCK_OPT_AUTO_START)
+
+// Clock update flags
+#define ZX_CLOCK_UPDATE_OPTION_VALUE_VALID       ((uint64_t)1u << 0)
+#define ZX_CLOCK_UPDATE_OPTION_RATE_ADJUST_VALID ((uint64_t)1u << 1)
+#define ZX_CLOCK_UPDATE_OPTION_ERROR_BOUND_VALID ((uint64_t)1u << 2)
+
+#define ZX_CLOCK_UPDATE_OPTIONS_ALL ( \
+        ZX_CLOCK_UPDATE_OPTION_VALUE_VALID |  \
+        ZX_CLOCK_UPDATE_OPTION_RATE_ADJUST_VALID | \
+        ZX_CLOCK_UPDATE_OPTION_ERROR_BOUND_VALID)
+
+// Clock rate adjustment limits
+#define ZX_CLOCK_UPDATE_MIN_RATE_ADJUST          ((int32_t)-1000)
+#define ZX_CLOCK_UPDATE_MAX_RATE_ADJUST          ((int32_t)1000)
+
+// Special clock error values
+#define ZX_CLOCK_UNKNOWN_ERROR                   ((uint64_t)0xFFFFFFFFFFFFFFFF)
+
+// clang-format on
+
+typedef struct zx_clock_create_args_v1 {
+  zx_time_t backstop_time;
+} zx_clock_create_args_v1_t;
+
+typedef struct zx_clock_rate {
+  uint32_t synthetic_ticks;
+  uint32_t reference_ticks;
+} zx_clock_rate_t;
+
+typedef struct zx_clock_transformation {
+  int64_t reference_offset;
+  int64_t synthetic_offset;
+  zx_clock_rate_t rate;
+} zx_clock_transformation_t;
+
+typedef struct zx_clock_details_v1 {
+  uint64_t options;
+  zx_time_t backstop_time;
+  zx_clock_transformation_t ticks_to_synthetic;
+  zx_clock_transformation_t mono_to_synthetic;
+  uint64_t error_bound;
+  zx_ticks_t query_ticks;
+  zx_ticks_t last_value_update_ticks;
+  zx_ticks_t last_rate_adjust_update_ticks;
+  zx_ticks_t last_error_bounds_update_ticks;
+  uint32_t generation_counter;
+  uint8_t padding1[4];
+} zx_clock_details_v1_t;
+
+typedef struct zx_clock_update_args_v1 {
+  int32_t rate_adjust;
+  uint8_t padding1[4];
+  int64_t value;
+  uint64_t error_bound;
+} zx_clock_update_args_v1_t;
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_CLOCK_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/debug.h b/arch/x64/sysroot/include/zircon/syscalls/debug.h
index 82ea309..373381f 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/debug.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/debug.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_DEBUG_
-#define ZIRCON_SYSCALLS_DEBUG_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_DEBUG_
+#define SYSROOT_ZIRCON_SYSCALLS_DEBUG_
 
 #include <stdint.h>
 #include <zircon/compiler.h>
@@ -14,43 +14,47 @@
 
 // Value for ZX_THREAD_STATE_GENERAL_REGS on x86-64 platforms.
 typedef struct zx_thread_state_general_regs {
-    uint64_t rax;
-    uint64_t rbx;
-    uint64_t rcx;
-    uint64_t rdx;
-    uint64_t rsi;
-    uint64_t rdi;
-    uint64_t rbp;
-    uint64_t rsp;
-    uint64_t r8;
-    uint64_t r9;
-    uint64_t r10;
-    uint64_t r11;
-    uint64_t r12;
-    uint64_t r13;
-    uint64_t r14;
-    uint64_t r15;
-    uint64_t rip;
-    uint64_t rflags;
+  uint64_t rax;
+  uint64_t rbx;
+  uint64_t rcx;
+  uint64_t rdx;
+  uint64_t rsi;
+  uint64_t rdi;
+  uint64_t rbp;
+  uint64_t rsp;
+  uint64_t r8;
+  uint64_t r9;
+  uint64_t r10;
+  uint64_t r11;
+  uint64_t r12;
+  uint64_t r13;
+  uint64_t r14;
+  uint64_t r15;
+  uint64_t rip;
+  uint64_t rflags;
+  uint64_t fs_base;
+  uint64_t gs_base;
 } zx_thread_state_general_regs_t;
 
 // Value for ZX_THREAD_STATE_FP_REGS on x64. Holds x87 and MMX state.
 typedef struct zx_thread_state_fp_regs {
-    uint16_t fcw; // Control word.
-    uint16_t fsw; // Status word.
-    uint8_t ftw;  // Tag word.
-    uint8_t reserved;
-    uint16_t fop; // Opcode.
-    uint64_t fip; // Instruction pointer.
-    uint64_t fdp; // Data pointer.
+  uint16_t fcw;  // Control word.
+  uint16_t fsw;  // Status word.
+  uint8_t ftw;   // Tag word.
+  uint8_t reserved;
+  uint16_t fop;  // Opcode.
+  uint64_t fip;  // Instruction pointer.
+  uint64_t fdp;  // Data pointer.
 
-    // The x87/MMX state. For x87 the each "st" entry has the low 80 bits used for the register
-    // contents. For MMX, the low 64 bits are used. The higher bits are unused.
-    __ALIGNED(16)
-    struct {
-        uint64_t low;
-        uint64_t high;
-    } st[8];
+  uint8_t padding1[8];
+
+  // The x87/MMX state. For x87 the each "st" entry has the low 80 bits used for the register
+  // contents. For MMX, the low 64 bits are used. The higher bits are unused.
+  __ALIGNED(16)
+  struct {
+    uint64_t low;
+    uint64_t high;
+  } st[8];
 } zx_thread_state_fp_regs_t;
 
 // Value for ZX_THREAD_STATE_VECTOR_REGS on x64. Holds SSE and AVX registers.
@@ -58,58 +62,56 @@
 // Setting vector registers will only work for threads that have previously executed an
 // instruction using the corresponding register class.
 typedef struct zx_thread_state_vector_regs {
-    // When only 16 registers are supported (pre-AVX-512), zmm[16-31] will be 0.
-    // YMM registers (256 bits) are v[0-4], XMM registers (128 bits) are v[0-2].
-    struct {
-        uint64_t v[8];
-    } zmm[32];
+  // When only 16 registers are supported (pre-AVX-512), zmm[16-31] will be 0.
+  // YMM registers (256 bits) are v[0-4], XMM registers (128 bits) are v[0-2].
+  struct {
+    uint64_t v[8];
+  } zmm[32];
 
-    // AVX-512 opmask registers. Will be 0 unless AVX-512 is supported.
-    uint64_t opmask[8];
+  // AVX-512 opmask registers. Will be 0 unless AVX-512 is supported.
+  uint64_t opmask[8];
 
-    // SIMD control and status register.
-    uint32_t mxcsr;
+  // SIMD control and status register.
+  uint32_t mxcsr;
+
+  uint8_t padding1[4];
 } zx_thread_state_vector_regs_t;
 
 // Value for ZX_THREAD_STATE_DEBUG_REGS on x64 platforms.
 typedef struct zx_thread_state_debug_regs {
   uint64_t dr[4];
   // DR4 and D5 are not used.
-  uint64_t dr6;         // Status register.
-  uint64_t dr7;         // Control register.
-  // TODO(donosoc): These values are deprecated but are still used by zxdb. We debine both values
-  //                in order to do a soft transition. Delete these values once zxdb has made the
-  //                update.
-  uint64_t dr6_status;  // Status register.
-  uint64_t dr7_control; // Control register.
+  uint64_t dr6;  // Status register.
+  uint64_t dr7;  // Control register.
 } zx_thread_state_debug_regs_t;
 
 #elif defined(__aarch64__)
 
 // Value for ZX_THREAD_STATE_GENERAL_REGS on ARM64 platforms.
 typedef struct zx_thread_state_general_regs {
-    uint64_t r[30];
-    uint64_t lr;
-    uint64_t sp;
-    uint64_t pc;
-    uint64_t cpsr;
+  uint64_t r[30];
+  uint64_t lr;
+  uint64_t sp;
+  uint64_t pc;
+  uint64_t cpsr;
+  uint64_t tpidr;
 } zx_thread_state_general_regs_t;
 
 // Value for ZX_THREAD_STATE_FP_REGS on ARM64 platforms.
 // This is unused because vector state is used for all floating point on ARM64.
 typedef struct zx_thread_state_fp_regs {
-    // Avoids sizing differences for empty structs between C and C++.
-    uint32_t unused;
+  // Avoids sizing differences for empty structs between C and C++.
+  uint32_t unused;
 } zx_thread_state_fp_regs_t;
 
 // Value for ZX_THREAD_STATE_VECTOR_REGS on ARM64 platforms.
 typedef struct zx_thread_state_vector_regs {
-    uint32_t fpcr;
-    uint32_t fpsr;
-    struct {
-        uint64_t low;
-        uint64_t high;
-    } v[32];
+  uint32_t fpcr;
+  uint32_t fpsr;
+  struct {
+    uint64_t low;
+    uint64_t high;
+  } v[32];
 } zx_thread_state_vector_regs_t;
 
 // ARMv8-A provides 2 to 16 hardware breakpoint registers.
@@ -122,19 +124,34 @@
 // Value for XZ_THREAD_STATE_DEBUG_REGS for ARM64 platforms.
 typedef struct zx_thread_state_debug_regs {
   struct {
-    uint64_t dbgbvr;      //  HW Breakpoint Value register.
-    uint32_t dbgbcr;      //  HW Breakpoint Control register.
+    uint32_t dbgbcr;  //  HW Breakpoint Control register.
+    uint8_t padding1[4];
+    uint64_t dbgbvr;  //  HW Breakpoint Value register.
   } hw_bps[AARCH64_MAX_HW_BREAKPOINTS];
   // Number of HW Breakpoints in the platform.
   // Will be set on read and ignored on write.
-  uint8_t hw_bps_count;
+
   struct {
-    uint64_t dbgwvr;      // HW Watchpoint Value register.
-    uint32_t dbgwcr;      // HW Watchpoint Control register.
+    uint32_t dbgwcr;  // HW Watchpoint Control register.
+    uint8_t padding1[4];
+    uint64_t dbgwvr;  // HW Watchpoint Value register.
   } hw_wps[AARCH64_MAX_HW_WATCHPOINTS];
-  // Number of HW Watchpoints in the platform.
+
+  // Faulting Virtual Address for watchpoint exceptions.
+  // Read-only, values are ignored on write.
+  uint64_t far;
+
+  // The esr value since the last exception.
+  // Read-only, values are ignored on write.
+  uint32_t esr;
+
+  // Number of HW Breakpoints/Watchpoints in the platform.
   // Will be set on read and ignored on write.
+  uint8_t hw_bps_count;
   uint8_t hw_wps_count;
+
+  uint8_t padding1[2];
+
 } zx_thread_state_debug_regs_t;
 
 #endif
@@ -149,14 +166,14 @@
 
 // Possible values for "kind" in zx_thread_read_state and zx_thread_write_state.
 typedef uint32_t zx_thread_state_topic_t;
-#define ZX_THREAD_STATE_GENERAL_REGS  ((uint32_t)0) // zx_thread_state_general_regs_t value.
-#define ZX_THREAD_STATE_FP_REGS       ((uint32_t)1) // zx_thread_state_fp_regs_t value.
-#define ZX_THREAD_STATE_VECTOR_REGS   ((uint32_t)2) // zx_thread_state_vector_regs_t value.
-#define ZX_THREAD_STATE_DEBUG_REGS    ((uint32_t)4) // zx_thread_state_debug_regs_t value.
-#define ZX_THREAD_STATE_SINGLE_STEP   ((uint32_t)5) // zx_thread_state_single_step_t value.
-#define ZX_THREAD_X86_REGISTER_FS     ((uint32_t)6) // zx_thread_x86_register_fs_t value.
-#define ZX_THREAD_X86_REGISTER_GS     ((uint32_t)7) // zx_thread_x86_register_gs_t value.
+#define ZX_THREAD_STATE_GENERAL_REGS ((uint32_t)0)  // zx_thread_state_general_regs_t value.
+#define ZX_THREAD_STATE_FP_REGS ((uint32_t)1)       // zx_thread_state_fp_regs_t value.
+#define ZX_THREAD_STATE_VECTOR_REGS ((uint32_t)2)   // zx_thread_state_vector_regs_t value.
+#define ZX_THREAD_STATE_DEBUG_REGS ((uint32_t)4)    // zx_thread_state_debug_regs_t value.
+#define ZX_THREAD_STATE_SINGLE_STEP ((uint32_t)5)   // zx_thread_state_single_step_t value.
+#define ZX_THREAD_X86_REGISTER_FS ((uint32_t)6)     // zx_thread_x86_register_fs_t value.
+#define ZX_THREAD_X86_REGISTER_GS ((uint32_t)7)     // zx_thread_x86_register_gs_t value.
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_DEBUG_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_DEBUG_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/definitions.h b/arch/x64/sysroot/include/zircon/syscalls/definitions.h
deleted file mode 100644
index 70da713..0000000
--- a/arch/x64/sysroot/include/zircon/syscalls/definitions.h
+++ /dev/null
@@ -1,1839 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// This is a GENERATED file, see //zircon/system/host/abigen.
-// The license governing this file can be found in the LICENSE file.
-
-extern zx_time_t zx_clock_get(
-    zx_clock_t clock_id) __LEAF_FN;
-
-extern zx_time_t _zx_clock_get(
-    zx_clock_t clock_id) __LEAF_FN;
-
-extern zx_status_t zx_clock_get_new(
-    zx_clock_t clock_id,
-    zx_time_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_clock_get_new(
-    zx_clock_t clock_id,
-    zx_time_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_time_t zx_clock_get_monotonic(
-    void) __LEAF_FN;
-
-extern zx_time_t _zx_clock_get_monotonic(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_nanosleep(
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_nanosleep(
-    zx_time_t deadline) __LEAF_FN;
-
-extern uint64_t zx_ticks_get(
-    void) __LEAF_FN;
-
-extern uint64_t _zx_ticks_get(
-    void) __LEAF_FN;
-
-extern uint64_t zx_ticks_per_second(
-    void) __LEAF_FN __CONST;
-
-extern uint64_t _zx_ticks_per_second(
-    void) __LEAF_FN __CONST;
-
-extern zx_time_t zx_deadline_after(
-    zx_duration_t nanoseconds) __LEAF_FN;
-
-extern zx_time_t _zx_deadline_after(
-    zx_duration_t nanoseconds) __LEAF_FN;
-
-extern zx_status_t zx_clock_adjust(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_clock_t clock_id,
-    int64_t offset) __LEAF_FN;
-
-extern zx_status_t _zx_clock_adjust(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_clock_t clock_id,
-    int64_t offset) __LEAF_FN;
-
-extern uint32_t zx_system_get_dcache_line_size(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t _zx_system_get_dcache_line_size(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t zx_system_get_num_cpus(
-    void) __LEAF_FN __CONST;
-
-extern uint32_t _zx_system_get_num_cpus(
-    void) __LEAF_FN __CONST;
-
-extern zx_status_t zx_system_get_version(
-    char* version,
-    size_t version_size) __LEAF_FN;
-
-extern zx_status_t _zx_system_get_version(
-    char* version,
-    size_t version_size) __LEAF_FN;
-
-extern uint64_t zx_system_get_physmem(
-    void) __LEAF_FN;
-
-extern uint64_t _zx_system_get_physmem(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_system_get_features(
-    uint32_t kind,
-    ZX_SYSCALL_PARAM_ATTR(features) uint32_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_system_get_features(
-    uint32_t kind,
-    ZX_SYSCALL_PARAM_ATTR(features) uint32_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_cache_flush(
-    const void* addr,
-    size_t size,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_cache_flush(
-    const void* addr,
-    size_t size,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_handle_close(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_handle_close(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_handle_close_many(
-    const zx_handle_t* handles,
-    size_t num_handles) __LEAF_FN;
-
-extern zx_status_t _zx_handle_close_many(
-    const zx_handle_t* handles,
-    size_t num_handles) __LEAF_FN;
-
-extern zx_status_t zx_handle_duplicate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_handle_duplicate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_handle_replace(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_handle_replace(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    zx_rights_t rights,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_one(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_signals_t signals,
-    zx_time_t deadline,
-    zx_signals_t* observed) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_one(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_signals_t signals,
-    zx_time_t deadline,
-    zx_signals_t* observed) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_many(
-    zx_wait_item_t* items,
-    size_t count,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_many(
-    zx_wait_item_t* items,
-    size_t count,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_object_wait_async(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    zx_signals_t signals,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_object_wait_async(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    zx_signals_t signals,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_object_signal(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t _zx_object_signal(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t zx_object_signal_peer(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t _zx_object_signal_peer(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t clear_mask,
-    uint32_t set_mask) __LEAF_FN;
-
-extern zx_status_t zx_object_get_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t zx_object_set_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    const void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_property(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t property,
-    const void* value,
-    size_t value_size) __LEAF_FN;
-
-extern zx_status_t zx_object_set_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t cookie) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t cookie) __LEAF_FN;
-
-extern zx_status_t zx_object_get_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t* cookie) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_cookie(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t scope,
-    uint64_t* cookie) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_object_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t topic,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual_count,
-    size_t* avail_count) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t topic,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual_count,
-    size_t* avail_count) __LEAF_FN;
-
-extern zx_status_t zx_object_get_child(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t koid,
-    zx_rights_t rights,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_object_get_child(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t koid,
-    zx_rights_t rights,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_object_set_profile(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t profile,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_object_set_profile(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t profile,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_channel_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_channel_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_channel_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_read_etc(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_info_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_read_etc(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* bytes,
-    zx_handle_info_t* handles,
-    uint32_t num_bytes,
-    uint32_t num_handles,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* bytes,
-    uint32_t num_bytes,
-    const zx_handle_t* handles,
-    uint32_t num_handles) __LEAF_FN;
-
-extern zx_status_t _zx_channel_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* bytes,
-    uint32_t num_bytes,
-    const zx_handle_t* handles,
-    uint32_t num_handles) __LEAF_FN;
-
-extern zx_status_t zx_channel_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t deadline,
-    const zx_channel_call_args_t* args,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_channel_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t deadline,
-    const zx_channel_call_args_t* args,
-    uint32_t* actual_bytes,
-    uint32_t* actual_handles) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_socket_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_socket_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_socket_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t _zx_socket_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t zx_socket_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t _zx_socket_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __LEAF_FN;
-
-extern zx_status_t zx_socket_share(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t socket_to_share) __LEAF_FN;
-
-extern zx_status_t _zx_socket_share(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t socket_to_share) __LEAF_FN;
-
-extern zx_status_t zx_socket_accept(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_socket) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_socket_accept(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_socket) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_socket_shutdown(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_socket_shutdown(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options) __LEAF_FN;
-
-extern void zx_thread_exit(
-    void) __LEAF_FN __NO_RETURN;
-
-extern void _zx_thread_exit(
-    void) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_thread_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t process,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_thread_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t process,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_thread_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t thread_entry,
-    zx_vaddr_t stack,
-    uintptr_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t _zx_thread_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t thread_entry,
-    zx_vaddr_t stack,
-    uintptr_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t zx_thread_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_thread_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_thread_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_thread_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_thread_set_priority(
-    int32_t prio) __LEAF_FN;
-
-extern zx_status_t _zx_thread_set_priority(
-    int32_t prio) __LEAF_FN;
-
-extern void zx_process_exit(
-    int64_t retcode) __LEAF_FN __NO_RETURN;
-
-extern void _zx_process_exit(
-    int64_t retcode) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_process_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* proc_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_process_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    const char* name,
-    size_t name_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* proc_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_process_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t thread,
-    zx_vaddr_t entry,
-    zx_vaddr_t stack,
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t _zx_process_start(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t thread,
-    zx_vaddr_t entry,
-    zx_vaddr_t stack,
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t arg1,
-    uintptr_t arg2) __LEAF_FN;
-
-extern zx_status_t zx_process_read_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_process_read_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_process_write_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_process_write_memory(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t proc,
-    zx_vaddr_t vaddr,
-    const void* buffer,
-    size_t buffer_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_job_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_job,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_job_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_job,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_job_set_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    uint32_t options,
-    uint32_t topic,
-    const void* policy,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t _zx_job_set_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t job,
-    uint32_t options,
-    uint32_t topic,
-    const void* policy,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t zx_task_bind_exception_port(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_task_bind_exception_port(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_task_suspend(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_task_suspend(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_task_suspend_token(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_task_suspend_token(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* token) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_task_resume_from_exception(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_task_resume_from_exception(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_task_kill(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_task_kill(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_event_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_event_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_eventpair_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_eventpair_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_futex_wait(
-    const zx_futex_t* value_ptr,
-    zx_futex_t current_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_futex_owner,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wait(
-    const zx_futex_t* value_ptr,
-    zx_futex_t current_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_futex_owner,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_futex_wake(
-    const zx_futex_t* value_ptr,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wake(
-    const zx_futex_t* value_ptr,
-    uint32_t count) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t zx_futex_wake_single_owner(
-    const zx_futex_t* value_ptr) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wake_single_owner(
-    const zx_futex_t* value_ptr) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue_single_owner(
-    const zx_futex_t* wake_ptr,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue_single_owner(
-    const zx_futex_t* wake_ptr,
-    zx_futex_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t new_requeue_owner) __LEAF_FN;
-
-extern zx_status_t zx_futex_get_owner(
-    const zx_futex_t* value_ptr,
-    zx_koid_t* koid) __LEAF_FN;
-
-extern zx_status_t _zx_futex_get_owner(
-    const zx_futex_t* value_ptr,
-    zx_koid_t* koid) __LEAF_FN;
-
-extern zx_status_t zx_futex_wait_deprecated(
-    const zx_futex_t* value_ptr,
-    int32_t current_value,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t _zx_futex_wait_deprecated(
-    const zx_futex_t* value_ptr,
-    int32_t current_value,
-    zx_time_t deadline) __LEAF_FN;
-
-extern zx_status_t zx_futex_requeue_deprecated(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    int32_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count) __LEAF_FN;
-
-extern zx_status_t _zx_futex_requeue_deprecated(
-    const zx_futex_t* wake_ptr,
-    uint32_t wake_count,
-    int32_t current_value,
-    const zx_futex_t* requeue_ptr,
-    uint32_t requeue_count) __LEAF_FN;
-
-extern zx_status_t zx_port_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_port_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_port_queue(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t _zx_port_queue(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t zx_port_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t _zx_port_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_port_packet_t* packet) __LEAF_FN;
-
-extern zx_status_t zx_port_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t source,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t _zx_port_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t source,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t zx_timer_create(
-    uint32_t options,
-    zx_clock_t clock_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_timer_create(
-    uint32_t options,
-    zx_clock_t clock_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_timer_set(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_duration_t slack) __LEAF_FN;
-
-extern zx_status_t _zx_timer_set(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t deadline,
-    zx_duration_t slack) __LEAF_FN;
-
-extern zx_status_t zx_timer_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_timer_cancel(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create(
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create(
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const void* buffer,
-    uint64_t offset,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_get_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t* size) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_get_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t* size) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_set_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_set_size(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_op_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t op,
-    uint64_t offset,
-    uint64_t size,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_op_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t op,
-    uint64_t offset,
-    uint64_t size,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vmo_clone(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_clone(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_set_cache_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t cache_policy) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_set_cache_policy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t cache_policy) __LEAF_FN;
-
-extern zx_status_t zx_vmo_replace_as_executable(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmex,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_replace_as_executable(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmex,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_allocate_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    uint64_t offset,
-    uint64_t size,
-    uint32_t map_flags,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_allocate_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    uint64_t offset,
-    uint64_t size,
-    uint32_t map_flags,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_map_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    uint32_t map_flags,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_map_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    uint32_t map_flags,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_protect_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len,
-    uint32_t prot_flags) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_protect_old(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len,
-    uint32_t prot_flags) __LEAF_FN;
-
-extern zx_status_t zx_vmar_allocate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    zx_vm_option_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_allocate(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_vmar,
-    zx_vm_option_t options,
-    uint64_t offset,
-    uint64_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* child_vmar,
-    zx_vaddr_t* child_addr) __NONNULL((5, 6)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_vmar_map(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_map(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    uint64_t vmar_offset,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t vmo_offset,
-    uint64_t len,
-    zx_vaddr_t* mapped_addr) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_unmap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_unmap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t zx_vmar_protect(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_protect(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_vm_option_t options,
-    zx_vaddr_t addr,
-    uint64_t len) __LEAF_FN;
-
-extern void zx_cprng_draw(
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern void _zx_cprng_draw(
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_cprng_add_entropy(
-    const void* buffer,
-    size_t len) __LEAF_FN;
-
-extern zx_status_t _zx_cprng_add_entropy(
-    const void* buffer,
-    size_t len) __LEAF_FN;
-
-extern zx_status_t zx_fifo_create(
-    size_t elem_count,
-    size_t elem_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((4, 5)) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_create(
-    size_t elem_count,
-    size_t elem_size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out0,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out1) __NONNULL((4, 5)) __LEAF_FN;
-
-extern zx_status_t zx_fifo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t zx_fifo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    const void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t _zx_fifo_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    size_t elem_size,
-    const void* data,
-    size_t count,
-    size_t* actual_count) __LEAF_FN;
-
-extern zx_status_t zx_profile_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const zx_profile_info_t* profile,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_profile_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const zx_profile_info_t* profile,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_vmar_unmap_handle_close_thread_exit(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmar_handle,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_vmar_unmap_handle_close_thread_exit(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmar_handle,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN;
-
-extern void zx_futex_wake_handle_close_thread_exit(
-    const zx_futex_t* value_ptr,
-    uint32_t count,
-    int32_t new_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN __NO_RETURN;
-
-extern void _zx_futex_wake_handle_close_thread_exit(
-    const zx_futex_t* value_ptr,
-    uint32_t count,
-    int32_t new_value,
-    ZX_SYSCALL_PARAM_ATTR(handle_release) zx_handle_t handle) __LEAF_FN __NO_RETURN;
-
-extern zx_status_t zx_log_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    const void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_log_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    const void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_log_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_log_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t len,
-    void* buffer,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debuglog_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debuglog_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* data,
-    uint32_t offset,
-    size_t data_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    void* data,
-    uint32_t offset,
-    size_t data_size,
-    size_t* actual) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t action,
-    uint32_t options,
-    void* ptr) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t action,
-    uint32_t options,
-    void* ptr) __LEAF_FN;
-
-extern zx_status_t zx_ktrace_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t id,
-    uint32_t arg0,
-    uint32_t arg1) __LEAF_FN;
-
-extern zx_status_t _zx_ktrace_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t id,
-    uint32_t arg0,
-    uint32_t arg1) __LEAF_FN;
-
-extern zx_status_t zx_mtrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    uint32_t action,
-    uint32_t options,
-    void* ptr,
-    size_t ptr_size) __LEAF_FN;
-
-extern zx_status_t _zx_mtrace_control(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    uint32_t action,
-    uint32_t options,
-    void* ptr,
-    size_t ptr_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    char* buffer,
-    size_t* buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    char* buffer,
-    size_t* buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_write(
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_write(
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_debug_send_command(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_debug_send_command(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    const char* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t src_obj,
-    uint32_t src_num,
-    uint32_t options,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t src_obj,
-    uint32_t src_num,
-    uint32_t options,
-    zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_bind(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_bind(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t* out_timestamp) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_wait(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_time_t* out_timestamp) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_destroy(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_ack(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_ack(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_trigger(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t timestamp) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_trigger(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    zx_time_t timestamp) __LEAF_FN;
-
-extern zx_status_t zx_interrupt_bind_vcpu(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vcpu,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t _zx_interrupt_bind_vcpu(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vcpu,
-    uint32_t options) __LEAF_FN;
-
-extern zx_status_t zx_ioports_request(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint16_t io_addr,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t _zx_ioports_request(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint16_t io_addr,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create_contiguous(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bti,
-    size_t size,
-    uint32_t alignment_log2,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create_contiguous(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bti,
-    size_t size,
-    uint32_t alignment_log2,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_vmo_create_physical(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    zx_paddr_t paddr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vmo_create_physical(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    zx_paddr_t paddr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_iommu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t type,
-    const void* desc,
-    size_t desc_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t _zx_iommu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t type,
-    const void* desc,
-    size_t desc_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((5)) __LEAF_FN;
-
-extern zx_status_t zx_bti_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t iommu,
-    uint32_t options,
-    uint64_t bti_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_bti_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t iommu,
-    uint32_t options,
-    uint64_t bti_id,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_bti_pin(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t offset,
-    uint64_t size,
-    zx_paddr_t* addrs,
-    size_t addrs_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((8)) __LEAF_FN;
-
-extern zx_status_t _zx_bti_pin(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint64_t offset,
-    uint64_t size,
-    zx_paddr_t* addrs,
-    size_t addrs_count,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((8)) __LEAF_FN;
-
-extern zx_status_t zx_bti_release_quarantine(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_bti_release_quarantine(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_pmt_unpin(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_pmt_unpin(
-    ZX_SYSCALL_PARAM_ATTR(handle_release_always) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_framebuffer_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t* format,
-    uint32_t* width,
-    uint32_t* height,
-    uint32_t* stride) __NONNULL((2, 3, 4, 5)) __LEAF_FN;
-
-extern zx_status_t _zx_framebuffer_get_info(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t* format,
-    uint32_t* width,
-    uint32_t* height,
-    uint32_t* stride) __NONNULL((2, 3, 4, 5)) __LEAF_FN;
-
-extern zx_status_t zx_framebuffer_set_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint32_t len,
-    uint32_t format,
-    uint32_t width,
-    uint32_t height,
-    uint32_t stride) __LEAF_FN;
-
-extern zx_status_t _zx_framebuffer_set_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t vmo,
-    uint32_t len,
-    uint32_t format,
-    uint32_t width,
-    uint32_t height,
-    uint32_t stride) __LEAF_FN;
-
-extern zx_status_t zx_pci_get_nth_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t index,
-    zx_pcie_device_info_t* out_info,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_get_nth_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t index,
-    zx_pcie_device_info_t* out_info,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t zx_pci_enable_bus_master(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool enable) __LEAF_FN;
-
-extern zx_status_t _zx_pci_enable_bus_master(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool enable) __LEAF_FN;
-
-extern zx_status_t zx_pci_reset_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t _zx_pci_reset_device(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle) __LEAF_FN;
-
-extern zx_status_t zx_pci_config_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t* out_val) __LEAF_FN;
-
-extern zx_status_t _zx_pci_config_read(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t* out_val) __LEAF_FN;
-
-extern zx_status_t zx_pci_config_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t val) __LEAF_FN;
-
-extern zx_status_t _zx_pci_config_write(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint16_t offset,
-    size_t width,
-    uint32_t val) __LEAF_FN;
-
-extern zx_status_t zx_pci_cfg_pio_rw(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint8_t bus,
-    uint8_t dev,
-    uint8_t func,
-    uint8_t offset,
-    uint32_t* val,
-    size_t width,
-    bool write) __LEAF_FN;
-
-extern zx_status_t _zx_pci_cfg_pio_rw(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint8_t bus,
-    uint8_t dev,
-    uint8_t func,
-    uint8_t offset,
-    uint32_t* val,
-    size_t width,
-    bool write) __LEAF_FN;
-
-extern zx_status_t zx_pci_get_bar(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t bar_num,
-    zx_pci_bar_t* out_bar,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_get_bar(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t bar_num,
-    zx_pci_bar_t* out_bar,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_pci_map_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    int32_t which_irq,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_map_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    int32_t which_irq,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out_handle) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_pci_query_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t* out_max_irqs) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_pci_query_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t* out_max_irqs) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_pci_set_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t requested_irq_count) __LEAF_FN;
-
-extern zx_status_t _zx_pci_set_irq_mode(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t mode,
-    uint32_t requested_irq_count) __LEAF_FN;
-
-extern zx_status_t zx_pci_init(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_pci_init_arg_t* init_buf,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t _zx_pci_init(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_pci_init_arg_t* init_buf,
-    uint32_t len) __LEAF_FN;
-
-extern zx_status_t zx_pci_add_subtract_io_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool mmio,
-    uint64_t base,
-    uint64_t len,
-    bool add) __LEAF_FN;
-
-extern zx_status_t _zx_pci_add_subtract_io_range(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    bool mmio,
-    uint64_t base,
-    uint64_t len,
-    bool add) __LEAF_FN;
-
-extern zx_status_t zx_pc_firmware_tables(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_paddr_t* acpi_rsdp,
-    zx_paddr_t* smbios) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t _zx_pc_firmware_tables(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_paddr_t* acpi_rsdp,
-    zx_paddr_t* smbios) __NONNULL((2, 3)) __LEAF_FN;
-
-extern zx_status_t zx_smc_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_smc_parameters_t* parameters,
-    zx_smc_result_t* out_smc_result) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t _zx_smc_call(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    const zx_smc_parameters_t* parameters,
-    zx_smc_result_t* out_smc_result) __NONNULL((3)) __LEAF_FN;
-
-extern zx_status_t zx_resource_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_rsrc,
-    uint32_t options,
-    uint64_t base,
-    size_t size,
-    const char* name,
-    size_t name_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* resource_out) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t _zx_resource_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t parent_rsrc,
-    uint32_t options,
-    uint64_t base,
-    size_t size,
-    const char* name,
-    size_t name_size,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* resource_out) __NONNULL((7)) __LEAF_FN;
-
-extern zx_status_t zx_guest_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* guest_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t _zx_guest_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* guest_handle,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* vmar_handle) __NONNULL((3, 4)) __LEAF_FN;
-
-extern zx_status_t zx_guest_set_trap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t _zx_guest_set_trap(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    zx_vaddr_t addr,
-    size_t size,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t guest,
-    uint32_t options,
-    zx_vaddr_t entry,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_create(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t guest,
-    uint32_t options,
-    zx_vaddr_t entry,
-    ZX_SYSCALL_PARAM_ATTR(handle_acquire) zx_handle_t* out) __NONNULL((4)) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_resume(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_port_packet_t* packet) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_resume(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    zx_port_packet_t* packet) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t vector) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_interrupt(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t vector) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_read_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_vcpu_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_vcpu_write_state(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t handle,
-    uint32_t kind,
-    const void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_system_mexec(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t kernel,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bootimage) __LEAF_FN;
-
-extern zx_status_t _zx_system_mexec(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t kernel,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t bootimage) __LEAF_FN;
-
-extern zx_status_t zx_system_mexec_payload_get(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t _zx_system_mexec_payload_get(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    void* buffer,
-    size_t buffer_size) __LEAF_FN;
-
-extern zx_status_t zx_system_powerctl(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t cmd,
-    const zx_system_powerctl_arg_t* arg) __LEAF_FN;
-
-extern zx_status_t _zx_system_powerctl(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t resource,
-    uint32_t cmd,
-    const zx_system_powerctl_arg_t* arg) __LEAF_FN;
-
-extern zx_status_t zx_pager_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(pager) zx_handle_t* out_pager) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t _zx_pager_create(
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(pager) zx_handle_t* out_pager) __NONNULL((2)) __LEAF_FN;
-
-extern zx_status_t zx_pager_create_vmo(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t pager,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(out_pager_vmo) zx_handle_t* out_pager_vmo) __NONNULL((6)) __LEAF_FN;
-
-extern zx_status_t _zx_pager_create_vmo(
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t pager,
-    ZX_SYSCALL_PARAM_ATTR(handle_use) zx_handle_t port,
-    uint64_t key,
-    uint64_t size,
-    uint32_t options,
-    ZX_SYSCALL_PARAM_ATTR(out_pager_vmo) zx_handle_t* out_pager_vmo) __NONNULL((6)) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_0(
-    void) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_0(
-    void) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_1(
-    int a) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_1(
-    int a) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_2(
-    int a,
-    int b) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_2(
-    int a,
-    int b) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_3(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_3(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_4(
-    int a,
-    int b,
-    int c,
-    int d) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_4(
-    int a,
-    int b,
-    int c,
-    int d) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_5(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_5(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_6(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_6(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_7(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_7(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_8(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g,
-    int h) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_8(
-    int a,
-    int b,
-    int c,
-    int d,
-    int e,
-    int f,
-    int g,
-    int h) __LEAF_FN;
-
-extern zx_status_t zx_syscall_test_wrapper(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-extern zx_status_t _zx_syscall_test_wrapper(
-    int a,
-    int b,
-    int c) __LEAF_FN;
-
-
diff --git a/arch/x64/sysroot/include/zircon/syscalls/exception.h b/arch/x64/sysroot/include/zircon/syscalls/exception.h
index 4ddf2fb..6191e0f 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/exception.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/exception.h
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_EXCEPTION_H_
-#define ZIRCON_SYSCALLS_EXCEPTION_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
+#define SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
 
 #include <zircon/compiler.h>
-#include <zircon/syscalls/port.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
@@ -14,63 +13,60 @@
 // ask clang format not to mess up the indentation:
 // clang-format off
 
-// This bit is set for synthetic exceptions to distinguish them from
-// architectural exceptions.
-// Note: Port packet types provide 8 bits to distinguish the exception type.
-// See zircon/port.h.
-#define ZX_EXCP_SYNTH ((uint8_t)0x80)
+// The following exception values were chosen for historical reasons.
 
-// The kind of an exception.
-// Exception types are a subset of port packet types. See zircon/port.h.
-
-// These are architectural exceptions.
+// Architectural exceptions.
+//
 // Depending on the exception, further information can be found in
 // |report.context.arch|.
 
-// General exception not covered by another value.
-#define ZX_EXCP_GENERAL ZX_PKT_TYPE_EXCEPTION(0)
-#define ZX_EXCP_FATAL_PAGE_FAULT ZX_PKT_TYPE_EXCEPTION(1)
-#define ZX_EXCP_UNDEFINED_INSTRUCTION ZX_PKT_TYPE_EXCEPTION(2)
-#define ZX_EXCP_SW_BREAKPOINT ZX_PKT_TYPE_EXCEPTION(3)
-#define ZX_EXCP_HW_BREAKPOINT ZX_PKT_TYPE_EXCEPTION(4)
-#define ZX_EXCP_UNALIGNED_ACCESS ZX_PKT_TYPE_EXCEPTION(5)
+#define ZX_EXCP_GENERAL                 ((uint32_t) 0x008u)
+#define ZX_EXCP_FATAL_PAGE_FAULT        ((uint32_t) 0x108u)
+#define ZX_EXCP_UNDEFINED_INSTRUCTION   ((uint32_t) 0x208u)
+#define ZX_EXCP_SW_BREAKPOINT           ((uint32_t) 0x308u)
+#define ZX_EXCP_HW_BREAKPOINT           ((uint32_t) 0x408u)
+#define ZX_EXCP_UNALIGNED_ACCESS        ((uint32_t) 0x508u)
 
 // Synthetic exceptions.
 
+// These bits are set for synthetic exceptions to distinguish them from
+// architectural exceptions.
+#define ZX_EXCP_SYNTH                   ((uint32_t) 0x8000u)
+
 // A thread is starting.
-// This exception is sent to debuggers only (ZX_EXCEPTION_PORT_TYPE_DEBUGGER).
-// The thread is paused until it is resumed by the debugger
-// with zx_task_resume_from_exception.
-#define ZX_EXCP_THREAD_STARTING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 0)
+// This exception is sent to debuggers only (ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER).
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_THREAD_STARTING         ((uint32_t) 0x008u | ZX_EXCP_SYNTH)
 
 // A thread is exiting.
-// This exception is sent to debuggers only (ZX_EXCEPTION_PORT_TYPE_DEBUGGER).
+// This exception is sent to debuggers only (ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER).
 // This exception is different from ZX_EXCP_GONE in that a debugger can
 // still examine thread state.
-// The thread is paused until it is resumed by the debugger
-// with zx_task_resume_from_exception.
-#define ZX_EXCP_THREAD_EXITING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 1)
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_THREAD_EXITING          ((uint32_t) 0x108u | ZX_EXCP_SYNTH)
 
 // This exception is generated when a syscall fails with a job policy
 // error (for example, an invalid handle argument is passed to the
 // syscall when the ZX_POL_BAD_HANDLE policy is enabled) and
-// ZX_POL_ACTION_EXCEPTION is set for the policy.  The thread that
-// invoked the syscall may be resumed with zx_task_resume_from_exception.
-#define ZX_EXCP_POLICY_ERROR ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 2)
+// ZX_POL_ACTION_EXCEPTION is set for the policy.
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_POLICY_ERROR            ((uint32_t) 0x208u | ZX_EXCP_SYNTH)
 
 // A process is starting.
 // This exception is sent to job debuggers only
-// (ZX_EXCEPTION_PORT_TYPE_JOB_DEBUGGER).
-// The initial thread is paused until it is resumed by the debugger with
-// zx_task_resume_from_exception.
-#define ZX_EXCP_PROCESS_STARTING ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH | 3)
+// (ZX_EXCEPTION_CHANNEL_TYPE_JOB_DEBUGGER).
+// The thread that generates this exception is paused until it the debugger
+// handles the exception.
+#define ZX_EXCP_PROCESS_STARTING        ((uint32_t) 0x308u | ZX_EXCP_SYNTH)
 
 typedef uint32_t zx_excp_type_t;
 
-// Assuming |excp| is an exception type, return non-zero if it is an
-// architectural exception.
-#define ZX_EXCP_IS_ARCH(excp) \
-  (((excp) & (ZX_PKT_TYPE_EXCEPTION(ZX_EXCP_SYNTH) & ~ZX_PKT_TYPE_MASK)) == 0)
+// Assuming |excp| is an exception type, the following returns true if the
+// type is architectural.
+#define ZX_EXCP_IS_ARCH(excp)  (((excp) & ZX_EXCP_SYNTH) == 0)
 
 typedef struct zx_x86_64_exc_data {
     uint64_t vector;
@@ -80,6 +76,7 @@
 
 typedef struct zx_arm64_exc_data {
     uint32_t esr;
+    uint8_t padding1[4];
     uint64_t far;
 } zx_arm64_exc_data_t;
 
@@ -90,7 +87,10 @@
     struct {
         union {
             zx_x86_64_exc_data_t x86_64;
-            zx_arm64_exc_data_t  arm_64;
+            struct {
+                zx_arm64_exc_data_t  arm_64;
+                uint8_t padding1[8];
+            };
         } u;
     } arch;
 } zx_exception_context_t;
@@ -110,26 +110,27 @@
     zx_exception_context_t context;
 } zx_exception_report_t;
 
-// Options for zx_task_resume_from_exception()
-#define ZX_RESUME_TRY_NEXT ((uint32_t)2)
-// Indicates that instead of resuming from the faulting instruction we instead
-// let the next exception handler in the search order, if any, process the
-// exception. If there are no more then the entire process is killed.
+// Basic info sent along with the handle over an exception channel.
+typedef struct zx_exception_info {
+    zx_koid_t pid;
+    zx_koid_t tid;
+    zx_excp_type_t type;
+    uint8_t padding1[4];
+} zx_exception_info_t;
 
-// Options for zx_task_bind_exception_port.
-#define ZX_EXCEPTION_PORT_DEBUGGER ((uint32_t)1)
-// When binding an exception port to a process, set the process's debugger
-// exception port.
+// Options for zx_create_exception_channel.
+// When creating an exception channel, use the task's debug channel.
+#define ZX_EXCEPTION_CHANNEL_DEBUGGER ((uint32_t)1)
 
-// The type of exception port a thread may be waiting for a response from.
-// These values are reported in zx_info_thread_t.wait_exception_port_type.
-#define ZX_EXCEPTION_PORT_TYPE_NONE         ((uint32_t)0u)
-#define ZX_EXCEPTION_PORT_TYPE_DEBUGGER     ((uint32_t)1u)
-#define ZX_EXCEPTION_PORT_TYPE_THREAD       ((uint32_t)2u)
-#define ZX_EXCEPTION_PORT_TYPE_PROCESS      ((uint32_t)3u)
-#define ZX_EXCEPTION_PORT_TYPE_JOB          ((uint32_t)4u)
-#define ZX_EXCEPTION_PORT_TYPE_JOB_DEBUGGER ((uint32_t)5u)
+// The type of exception handler a thread may be waiting for a response from.
+// These values are reported in zx_info_thread_t.wait_exception_channel_type.
+#define ZX_EXCEPTION_CHANNEL_TYPE_NONE         ((uint32_t)0u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_DEBUGGER     ((uint32_t)1u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_THREAD       ((uint32_t)2u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_PROCESS      ((uint32_t)3u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_JOB          ((uint32_t)4u)
+#define ZX_EXCEPTION_CHANNEL_TYPE_JOB_DEBUGGER ((uint32_t)5u)
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_EXCEPTION_H_
+#endif // SYSROOT_ZIRCON_SYSCALLS_EXCEPTION_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/hypervisor.h b/arch/x64/sysroot/include/zircon/syscalls/hypervisor.h
index a62de92..f574d4e 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/hypervisor.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/hypervisor.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
+#define SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
 
 #include <assert.h>
 
@@ -27,41 +28,51 @@
 // Structure to read and write VCPU state.
 typedef struct zx_vcpu_state {
 #if __aarch64__
-    uint64_t x[31];
-    uint64_t sp;
-    // Contains only the user-controllable upper 4-bits (NZCV).
-    uint32_t cpsr;
+  uint64_t x[31];
+  uint64_t sp;
+  // Contains only the user-controllable upper 4-bits (NZCV).
+  uint32_t cpsr;
+  uint8_t padding1[4];
 #elif __x86_64__
-    uint64_t rax;
-    uint64_t rcx;
-    uint64_t rdx;
-    uint64_t rbx;
-    uint64_t rsp;
-    uint64_t rbp;
-    uint64_t rsi;
-    uint64_t rdi;
-    uint64_t r8;
-    uint64_t r9;
-    uint64_t r10;
-    uint64_t r11;
-    uint64_t r12;
-    uint64_t r13;
-    uint64_t r14;
-    uint64_t r15;
-    // Contains only the user-controllable lower 32-bits.
-    uint64_t rflags;
+  uint64_t rax;
+  uint64_t rcx;
+  uint64_t rdx;
+  uint64_t rbx;
+  uint64_t rsp;
+  uint64_t rbp;
+  uint64_t rsi;
+  uint64_t rdi;
+  uint64_t r8;
+  uint64_t r9;
+  uint64_t r10;
+  uint64_t r11;
+  uint64_t r12;
+  uint64_t r13;
+  uint64_t r14;
+  uint64_t r15;
+  // Contains only the user-controllable lower 32-bits.
+  uint64_t rflags;
 #endif
 } zx_vcpu_state_t;
 
 // Structure to read and write VCPU state for IO ports.
 typedef struct zx_vcpu_io {
-    uint8_t access_size;
-    union {
-        uint8_t u8;
-        uint16_t u16;
-        uint32_t u32;
-        uint8_t data[4];
+  uint8_t access_size;
+  uint8_t padding1[3];
+  union {
+    struct {
+      uint8_t u8;
+      uint8_t padding2[3];
     };
+    struct {
+      uint16_t u16;
+      uint8_t padding3[2];
+    };
+    uint32_t u32;
+    uint8_t data[4];
+  };
 } zx_vcpu_io_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_HYPERVISOR_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/internal/cdecls.inc b/arch/x64/sysroot/include/zircon/syscalls/internal/cdecls.inc
new file mode 100644
index 0000000..63510b9
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/syscalls/internal/cdecls.inc
@@ -0,0 +1,1090 @@
+// Copyright 2019 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.
+
+// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.
+
+#ifndef _ZX_SYSCALL_DECL
+#error "<zircon/syscalls.h> is the public API header"
+#endif
+
+_ZX_SYSCALL_DECL(bti_create, zx_status_t, /* no attributes */, 4,
+    (iommu, options, bti_id, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t iommu,
+    uint32_t options,
+    uint64_t bti_id,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(bti_pin, zx_status_t, /* no attributes */, 8,
+    (handle, options, vmo, offset, size, addrs, num_addrs, pmt), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint64_t offset,
+    uint64_t size,
+    zx_paddr_t* addrs,
+    size_t num_addrs,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* pmt))
+
+_ZX_SYSCALL_DECL(bti_release_quarantine, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(cache_flush, zx_status_t, /* no attributes */, 3,
+    (addr, size, options), (
+    const void* addr,
+    size_t size,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(channel_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(channel_read, zx_status_t, /* no attributes */, 8,
+    (handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("FuchsiaUnchecked")) zx_handle_t handle,
+    uint32_t options,
+    void* bytes,
+    _ZX_SYSCALL_ANNO(acquire_handle("FuchsiaUnchecked")) zx_handle_t* handles,
+    uint32_t num_bytes,
+    uint32_t num_handles,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_read_etc, zx_status_t, /* no attributes */, 8,
+    (handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* bytes,
+    zx_handle_info_t* handles,
+    uint32_t num_bytes,
+    uint32_t num_handles,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_write, zx_status_t, /* no attributes */, 6,
+    (handle, options, bytes, num_bytes, handles, num_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* bytes,
+    uint32_t num_bytes,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) const zx_handle_t* handles,
+    uint32_t num_handles))
+
+_ZX_SYSCALL_DECL(channel_write_etc, zx_status_t, /* no attributes */, 6,
+    (handle, options, bytes, num_bytes, handles, num_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* bytes,
+    uint32_t num_bytes,
+    zx_handle_disposition_t* handles,
+    uint32_t num_handles))
+
+_ZX_SYSCALL_DECL(channel_call, zx_status_t, /* no attributes */, 6,
+    (handle, options, deadline, args, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t deadline,
+    const zx_channel_call_args_t* args,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(channel_call_etc, zx_status_t, /* no attributes */, 6,
+    (handle, options, deadline, args, actual_bytes, actual_handles), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t deadline,
+    zx_channel_call_etc_args_t* args,
+    uint32_t* actual_bytes,
+    uint32_t* actual_handles))
+
+_ZX_SYSCALL_DECL(clock_get, zx_status_t, /* no attributes */, 2,
+    (clock_id, out), (
+    zx_clock_t clock_id,
+    zx_time_t* out))
+
+_ZX_SYSCALL_DECL(clock_get_monotonic, zx_time_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(clock_adjust, zx_status_t, /* no attributes */, 3,
+    (handle, clock_id, offset), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_clock_t clock_id,
+    int64_t offset))
+
+_ZX_SYSCALL_DECL(clock_create, zx_status_t, /* no attributes */, 3,
+    (options, args, out), (
+    uint64_t options,
+    const void* args,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(clock_read, zx_status_t, /* no attributes */, 2,
+    (handle, now), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t* now))
+
+_ZX_SYSCALL_DECL(clock_get_details, zx_status_t, /* no attributes */, 3,
+    (handle, options, details), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t options,
+    void* details))
+
+_ZX_SYSCALL_DECL(clock_update, zx_status_t, /* no attributes */, 3,
+    (handle, options, args), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t options,
+    const void* args))
+
+_ZX_SYSCALL_DECL(cprng_draw, void, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(cprng_add_entropy, zx_status_t, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debug_read, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    char* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(debug_write, zx_status_t, /* no attributes */, 2,
+    (buffer, buffer_size), (
+    const char* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debug_send_command, zx_status_t, /* no attributes */, 3,
+    (resource, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    const char* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debuglog_create, zx_status_t, /* no attributes */, 3,
+    (resource, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(debuglog_write, zx_status_t, /* no attributes */, 4,
+    (handle, options, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(debuglog_read, zx_status_t, /* no attributes */, 4,
+    (handle, options, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(event_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(eventpair_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(exception_get_thread, zx_status_t, /* no attributes */, 2,
+    (handle, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(exception_get_process, zx_status_t, /* no attributes */, 2,
+    (handle, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(fifo_create, zx_status_t, /* no attributes */, 5,
+    (elem_count, elem_size, options, out0, out1), (
+    size_t elem_count,
+    size_t elem_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(fifo_read, zx_status_t, /* no attributes */, 5,
+    (handle, elem_size, data, data_size, actual_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    size_t elem_size,
+    void* data,
+    size_t data_size,
+    size_t* actual_count))
+
+_ZX_SYSCALL_DECL(fifo_write, zx_status_t, /* no attributes */, 5,
+    (handle, elem_size, data, count, actual_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    size_t elem_size,
+    const void* data,
+    size_t count,
+    size_t* actual_count))
+
+_ZX_SYSCALL_DECL(framebuffer_get_info, zx_status_t, /* no attributes */, 5,
+    (resource, format, width, height, stride), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t* format,
+    uint32_t* width,
+    uint32_t* height,
+    uint32_t* stride))
+
+_ZX_SYSCALL_DECL(framebuffer_set_range, zx_status_t, /* no attributes */, 7,
+    (resource, vmo, len, format, width, height, stride), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint32_t len,
+    uint32_t format,
+    uint32_t width,
+    uint32_t height,
+    uint32_t stride))
+
+_ZX_SYSCALL_DECL(futex_wait, zx_status_t, /* no attributes */, 4,
+    (value_ptr, current_value, new_futex_owner, deadline), (
+    const zx_futex_t* value_ptr,
+    zx_futex_t current_value,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_futex_owner,
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(futex_wake, zx_status_t, /* no attributes */, 2,
+    (value_ptr, wake_count), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count))
+
+_ZX_SYSCALL_DECL(futex_requeue, zx_status_t, /* no attributes */, 6,
+    (value_ptr, wake_count, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count,
+    zx_futex_t current_value,
+    const zx_futex_t* requeue_ptr,
+    uint32_t requeue_count,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))
+
+_ZX_SYSCALL_DECL(futex_wake_single_owner, zx_status_t, /* no attributes */, 1,
+    (value_ptr), (
+    const zx_futex_t* value_ptr))
+
+_ZX_SYSCALL_DECL(futex_requeue_single_owner, zx_status_t, /* no attributes */, 5,
+    (value_ptr, current_value, requeue_ptr, requeue_count, new_requeue_owner), (
+    const zx_futex_t* value_ptr,
+    zx_futex_t current_value,
+    const zx_futex_t* requeue_ptr,
+    uint32_t requeue_count,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t new_requeue_owner))
+
+_ZX_SYSCALL_DECL(futex_get_owner, zx_status_t, /* no attributes */, 2,
+    (value_ptr, koid), (
+    const zx_futex_t* value_ptr,
+    zx_koid_t* koid))
+
+_ZX_SYSCALL_DECL(guest_create, zx_status_t, /* no attributes */, 4,
+    (resource, options, guest_handle, vmar_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* guest_handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* vmar_handle))
+
+_ZX_SYSCALL_DECL(guest_set_trap, zx_status_t, /* no attributes */, 6,
+    (handle, kind, addr, size, port_handle, key), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    zx_vaddr_t addr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port_handle,
+    uint64_t key))
+
+_ZX_SYSCALL_DECL(handle_close, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(handle_close_many, zx_status_t, /* no attributes */, 2,
+    (handles, num_handles), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) const zx_handle_t* handles,
+    size_t num_handles))
+
+_ZX_SYSCALL_DECL(handle_duplicate, zx_status_t, /* no attributes */, 3,
+    (handle, rights, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(handle_replace, zx_status_t, /* no attributes */, 3,
+    (handle, rights, out), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(interrupt_create, zx_status_t, /* no attributes */, 4,
+    (src_obj, src_num, options, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t src_obj,
+    uint32_t src_num,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(interrupt_bind, zx_status_t, /* no attributes */, 4,
+    (handle, port_handle, key, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port_handle,
+    uint64_t key,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(interrupt_wait, zx_status_t, /* no attributes */, 2,
+    (handle, out_timestamp), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t* out_timestamp))
+
+_ZX_SYSCALL_DECL(interrupt_destroy, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(interrupt_ack, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(interrupt_trigger, zx_status_t, /* no attributes */, 3,
+    (handle, options, timestamp), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_time_t timestamp))
+
+_ZX_SYSCALL_DECL(interrupt_bind_vcpu, zx_status_t, /* no attributes */, 3,
+    (handle, vcpu, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vcpu,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(iommu_create, zx_status_t, /* no attributes */, 5,
+    (resource, type, desc, desc_size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t type,
+    const void* desc,
+    size_t desc_size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(ioports_request, zx_status_t, /* no attributes */, 3,
+    (resource, io_addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint16_t io_addr,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(ioports_release, zx_status_t, /* no attributes */, 3,
+    (resource, io_addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint16_t io_addr,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(job_create, zx_status_t, /* no attributes */, 3,
+    (parent_job, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_job,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(job_set_policy, zx_status_t, /* no attributes */, 5,
+    (handle, options, topic, policy, policy_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint32_t topic,
+    const void* policy,
+    uint32_t policy_size))
+
+_ZX_SYSCALL_DECL(job_set_critical, zx_status_t, /* no attributes */, 3,
+    (job, options, process), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t job,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t process))
+
+_ZX_SYSCALL_DECL(ktrace_read, zx_status_t, /* no attributes */, 5,
+    (handle, data, offset, data_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    void* data,
+    uint32_t offset,
+    size_t data_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(ktrace_control, zx_status_t, /* no attributes */, 4,
+    (handle, action, options, ptr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t action,
+    uint32_t options,
+    void* ptr))
+
+_ZX_SYSCALL_DECL(ktrace_write, zx_status_t, /* no attributes */, 4,
+    (handle, id, arg0, arg1), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t id,
+    uint32_t arg0,
+    uint32_t arg1))
+
+_ZX_SYSCALL_DECL(nanosleep, zx_status_t, /* no attributes */, 1,
+    (deadline), (
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(ticks_get, zx_ticks_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(ticks_per_second, zx_ticks_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(deadline_after, zx_time_t, /* no attributes */, 1,
+    (nanoseconds), (
+    zx_duration_t nanoseconds))
+
+_ZX_SYSCALL_DECL(vmar_unmap_handle_close_thread_exit, zx_status_t, /* no attributes */, 4,
+    (vmar_handle, addr, size, close_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmar_handle,
+    zx_vaddr_t addr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t close_handle))
+
+_ZX_SYSCALL_DECL(futex_wake_handle_close_thread_exit, void, __NO_RETURN, 4,
+    (value_ptr, wake_count, new_value, close_handle), (
+    const zx_futex_t* value_ptr,
+    uint32_t wake_count,
+    int32_t new_value,
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t close_handle))
+
+_ZX_SYSCALL_DECL(msi_allocate, zx_status_t, /* no attributes */, 3,
+    (handle, count, out_allocation), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t count,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_allocation))
+
+_ZX_SYSCALL_DECL(msi_create, zx_status_t, /* no attributes */, 6,
+    (handle, options, msi_id, vmo, vmo_offset, out_interrupt), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint32_t msi_id,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    size_t vmo_offset,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_interrupt))
+
+_ZX_SYSCALL_DECL(mtrace_control, zx_status_t, /* no attributes */, 6,
+    (handle, kind, action, options, ptr, ptr_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    uint32_t action,
+    uint32_t options,
+    void* ptr,
+    size_t ptr_size))
+
+_ZX_SYSCALL_DECL(object_wait_one, zx_status_t, /* no attributes */, 4,
+    (handle, signals, deadline, observed), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_signals_t signals,
+    zx_time_t deadline,
+    zx_signals_t* observed))
+
+_ZX_SYSCALL_DECL(object_wait_many, zx_status_t, /* no attributes */, 3,
+    (items, num_items, deadline), (
+    zx_wait_item_t* items,
+    size_t num_items,
+    zx_time_t deadline))
+
+_ZX_SYSCALL_DECL(object_wait_async, zx_status_t, /* no attributes */, 5,
+    (handle, port, key, signals, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port,
+    uint64_t key,
+    zx_signals_t signals,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(object_signal, zx_status_t, /* no attributes */, 3,
+    (handle, clear_mask, set_mask), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t clear_mask,
+    uint32_t set_mask))
+
+_ZX_SYSCALL_DECL(object_signal_peer, zx_status_t, /* no attributes */, 3,
+    (handle, clear_mask, set_mask), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t clear_mask,
+    uint32_t set_mask))
+
+_ZX_SYSCALL_DECL(object_get_property, zx_status_t, /* no attributes */, 4,
+    (handle, property, value, value_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t property,
+    void* value,
+    size_t value_size))
+
+_ZX_SYSCALL_DECL(object_set_property, zx_status_t, /* no attributes */, 4,
+    (handle, property, value, value_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t property,
+    const void* value,
+    size_t value_size))
+
+_ZX_SYSCALL_DECL(object_get_info, zx_status_t, /* no attributes */, 6,
+    (handle, topic, buffer, buffer_size, actual, avail), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t topic,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual,
+    size_t* avail))
+
+_ZX_SYSCALL_DECL(object_get_child, zx_status_t, /* no attributes */, 4,
+    (handle, koid, rights, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t koid,
+    zx_rights_t rights,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(object_set_profile, zx_status_t, /* no attributes */, 3,
+    (handle, profile, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t profile,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(pager_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(pager_create_vmo, zx_status_t, /* no attributes */, 6,
+    (pager, options, port, key, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t port,
+    uint64_t key,
+    uint64_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(pager_detach_vmo, zx_status_t, /* no attributes */, 2,
+    (pager, vmo), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo))
+
+_ZX_SYSCALL_DECL(pager_supply_pages, zx_status_t, /* no attributes */, 6,
+    (pager, pager_vmo, offset, length, aux_vmo, aux_offset), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager_vmo,
+    uint64_t offset,
+    uint64_t length,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t aux_vmo,
+    uint64_t aux_offset))
+
+_ZX_SYSCALL_DECL(pager_op_range, zx_status_t, /* no attributes */, 6,
+    (pager, op, pager_vmo, offset, length, data), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager,
+    uint32_t op,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t pager_vmo,
+    uint64_t offset,
+    uint64_t length,
+    uint64_t data))
+
+_ZX_SYSCALL_DECL(pc_firmware_tables, zx_status_t, /* no attributes */, 3,
+    (handle, acpi_rsdp, smbios), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_paddr_t* acpi_rsdp,
+    zx_paddr_t* smbios))
+
+_ZX_SYSCALL_DECL(pci_get_nth_device, zx_status_t, /* no attributes */, 4,
+    (handle, index, out_info, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t index,
+    zx_pcie_device_info_t* out_info,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_enable_bus_master, zx_status_t, /* no attributes */, 2,
+    (handle, enable), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t enable))
+
+_ZX_SYSCALL_DECL(pci_reset_device, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(pci_config_read, zx_status_t, /* no attributes */, 4,
+    (handle, offset, width, out_val), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint16_t offset,
+    size_t width,
+    uint32_t* out_val))
+
+_ZX_SYSCALL_DECL(pci_config_write, zx_status_t, /* no attributes */, 4,
+    (handle, offset, width, val), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint16_t offset,
+    size_t width,
+    uint32_t val))
+
+_ZX_SYSCALL_DECL(pci_cfg_pio_rw, zx_status_t, /* no attributes */, 8,
+    (handle, bus, dev, func, offset, val, width, write), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint8_t bus,
+    uint8_t dev,
+    uint8_t func,
+    uint8_t offset,
+    uint32_t* val,
+    size_t width,
+    uint32_t write))
+
+_ZX_SYSCALL_DECL(pci_get_bar, zx_status_t, /* no attributes */, 4,
+    (handle, bar_num, out_bar, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t bar_num,
+    zx_pci_bar_t* out_bar,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_map_interrupt, zx_status_t, /* no attributes */, 3,
+    (handle, which_irq, out_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    int32_t which_irq,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_handle))
+
+_ZX_SYSCALL_DECL(pci_query_irq_mode, zx_status_t, /* no attributes */, 3,
+    (handle, mode, out_max_irqs), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mode,
+    uint32_t* out_max_irqs))
+
+_ZX_SYSCALL_DECL(pci_set_irq_mode, zx_status_t, /* no attributes */, 3,
+    (handle, mode, requested_irq_count), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mode,
+    uint32_t requested_irq_count))
+
+_ZX_SYSCALL_DECL(pci_init, zx_status_t, /* no attributes */, 3,
+    (handle, init_buf, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_pci_init_arg_t* init_buf,
+    uint32_t len))
+
+_ZX_SYSCALL_DECL(pci_add_subtract_io_range, zx_status_t, /* no attributes */, 5,
+    (handle, mmio, base, len, add), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t mmio,
+    uint64_t base,
+    uint64_t len,
+    uint32_t add))
+
+_ZX_SYSCALL_DECL(pmt_unpin, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(port_create, zx_status_t, /* no attributes */, 2,
+    (options, out), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(port_queue, zx_status_t, /* no attributes */, 2,
+    (handle, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(port_wait, zx_status_t, /* no attributes */, 3,
+    (handle, deadline, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t deadline,
+    zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(port_cancel, zx_status_t, /* no attributes */, 3,
+    (handle, source, key), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t source,
+    uint64_t key))
+
+_ZX_SYSCALL_DECL(process_exit, void, __NO_RETURN, 1,
+    (retcode), (
+    int64_t retcode))
+
+_ZX_SYSCALL_DECL(process_create, zx_status_t, /* no attributes */, 6,
+    (job, name, name_size, options, proc_handle, vmar_handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t job,
+    const char* name,
+    size_t name_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* proc_handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* vmar_handle))
+
+_ZX_SYSCALL_DECL(process_start, zx_status_t, /* no attributes */, 6,
+    (handle, thread, entry, stack, arg1, arg2), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t thread,
+    zx_vaddr_t entry,
+    zx_vaddr_t stack,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t arg1,
+    uintptr_t arg2))
+
+_ZX_SYSCALL_DECL(process_read_memory, zx_status_t, /* no attributes */, 5,
+    (handle, vaddr, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t vaddr,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(process_write_memory, zx_status_t, /* no attributes */, 5,
+    (handle, vaddr, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t vaddr,
+    const void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(profile_create, zx_status_t, /* no attributes */, 4,
+    (root_job, options, profile, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t root_job,
+    uint32_t options,
+    const zx_profile_info_t* profile,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(resource_create, zx_status_t, /* no attributes */, 7,
+    (parent_rsrc, options, base, size, name, name_size, resource_out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_rsrc,
+    uint32_t options,
+    uint64_t base,
+    size_t size,
+    const char* name,
+    size_t name_size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* resource_out))
+
+_ZX_SYSCALL_DECL(smc_call, zx_status_t, /* no attributes */, 3,
+    (handle, parameters, out_smc_result), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const zx_smc_parameters_t* parameters,
+    zx_smc_result_t* out_smc_result))
+
+_ZX_SYSCALL_DECL(socket_create, zx_status_t, /* no attributes */, 3,
+    (options, out0, out1), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out0,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out1))
+
+_ZX_SYSCALL_DECL(socket_write, zx_status_t, /* no attributes */, 5,
+    (handle, options, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(socket_read, zx_status_t, /* no attributes */, 5,
+    (handle, options, buffer, buffer_size, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    void* buffer,
+    size_t buffer_size,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(socket_shutdown, zx_status_t, /* no attributes */, 2,
+    (handle, options), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options))
+
+_ZX_SYSCALL_DECL(stream_create, zx_status_t, /* no attributes */, 4,
+    (options, vmo, seek, out_stream), (
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    zx_off_t seek,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out_stream))
+
+_ZX_SYSCALL_DECL(stream_writev, zx_status_t, /* no attributes */, 5,
+    (handle, options, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    const zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_writev_at, zx_status_t, /* no attributes */, 6,
+    (handle, options, offset, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_off_t offset,
+    const zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_readv, zx_status_t, /* no attributes */, 5,
+    (handle, options, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_readv_at, zx_status_t, /* no attributes */, 6,
+    (handle, options, offset, vector, num_vector, actual), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    zx_off_t offset,
+    zx_iovec_t* vector,
+    size_t num_vector,
+    size_t* actual))
+
+_ZX_SYSCALL_DECL(stream_seek, zx_status_t, /* no attributes */, 4,
+    (handle, whence, offset, out_seek), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_stream_seek_origin_t whence,
+    int64_t offset,
+    zx_off_t* out_seek))
+
+_ZX_SYSCALL_DECL(system_get_dcache_line_size, uint32_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_num_cpus, uint32_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_version_string, zx_string_view_t, __CONST, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_physmem, uint64_t, /* no attributes */, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(system_get_features, zx_status_t, /* no attributes */, 2,
+    (kind, features), (
+    uint32_t kind,
+    uint32_t* features))
+
+_ZX_SYSCALL_DECL(system_get_event, zx_status_t, /* no attributes */, 3,
+    (root_job, kind, event), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t root_job,
+    uint32_t kind,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* event))
+
+_ZX_SYSCALL_DECL(system_mexec, zx_status_t, /* no attributes */, 3,
+    (resource, kernel_vmo, bootimage_vmo), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t kernel_vmo,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t bootimage_vmo))
+
+_ZX_SYSCALL_DECL(system_mexec_payload_get, zx_status_t, /* no attributes */, 3,
+    (resource, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(system_powerctl, zx_status_t, /* no attributes */, 3,
+    (resource, cmd, arg), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    uint32_t cmd,
+    const zx_system_powerctl_arg_t* arg))
+
+_ZX_SYSCALL_DECL(task_suspend, zx_status_t, /* no attributes */, 2,
+    (handle, token), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* token))
+
+_ZX_SYSCALL_DECL(task_suspend_token, zx_status_t, /* no attributes */, 2,
+    (handle, token), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* token))
+
+_ZX_SYSCALL_DECL(task_create_exception_channel, zx_status_t, /* no attributes */, 3,
+    (handle, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(task_kill, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(thread_exit, void, __NO_RETURN, 0,
+    (), (void))
+
+_ZX_SYSCALL_DECL(thread_create, zx_status_t, /* no attributes */, 5,
+    (process, name, name_size, options, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t process,
+    const char* name,
+    size_t name_size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(thread_start, zx_status_t, /* no attributes */, 5,
+    (handle, thread_entry, stack, arg1, arg2), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t thread_entry,
+    zx_vaddr_t stack,
+    uintptr_t arg1,
+    uintptr_t arg2))
+
+_ZX_SYSCALL_DECL(thread_read_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(thread_write_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(timer_create, zx_status_t, /* no attributes */, 3,
+    (options, clock_id, out), (
+    uint32_t options,
+    zx_clock_t clock_id,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(timer_set, zx_status_t, /* no attributes */, 3,
+    (handle, deadline, slack), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_time_t deadline,
+    zx_duration_t slack))
+
+_ZX_SYSCALL_DECL(timer_cancel, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(vcpu_create, zx_status_t, /* no attributes */, 4,
+    (guest, options, entry, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t guest,
+    uint32_t options,
+    zx_vaddr_t entry,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vcpu_resume, zx_status_t, /* no attributes */, 2,
+    (handle, packet), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_port_packet_t* packet))
+
+_ZX_SYSCALL_DECL(vcpu_interrupt, zx_status_t, /* no attributes */, 2,
+    (handle, vector), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t vector))
+
+_ZX_SYSCALL_DECL(vcpu_read_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vcpu_write_state, zx_status_t, /* no attributes */, 4,
+    (handle, kind, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t kind,
+    const void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmar_allocate, zx_status_t, /* no attributes */, 6,
+    (parent_vmar, options, offset, size, child_vmar, child_addr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t parent_vmar,
+    zx_vm_option_t options,
+    size_t offset,
+    size_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* child_vmar,
+    zx_vaddr_t* child_addr))
+
+_ZX_SYSCALL_DECL(vmar_destroy, zx_status_t, /* no attributes */, 1,
+    (handle), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle))
+
+_ZX_SYSCALL_DECL(vmar_map, zx_status_t, /* no attributes */, 7,
+    (handle, options, vmar_offset, vmo, vmo_offset, len, mapped_addr), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vm_option_t options,
+    size_t vmar_offset,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmo,
+    uint64_t vmo_offset,
+    size_t len,
+    zx_vaddr_t* mapped_addr))
+
+_ZX_SYSCALL_DECL(vmar_unmap, zx_status_t, /* no attributes */, 3,
+    (handle, addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vaddr_t addr,
+    size_t len))
+
+_ZX_SYSCALL_DECL(vmar_protect, zx_status_t, /* no attributes */, 4,
+    (handle, options, addr, len), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    zx_vm_option_t options,
+    zx_vaddr_t addr,
+    size_t len))
+
+_ZX_SYSCALL_DECL(vmar_op_range, zx_status_t, /* no attributes */, 6,
+    (handle, op, address, size, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t op,
+    zx_vaddr_t address,
+    size_t size,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_create, zx_status_t, /* no attributes */, 3,
+    (size, options, out), (
+    uint64_t size,
+    uint32_t options,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_read, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, offset, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    void* buffer,
+    uint64_t offset,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_write, zx_status_t, /* no attributes */, 4,
+    (handle, buffer, offset, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    const void* buffer,
+    uint64_t offset,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_get_size, zx_status_t, /* no attributes */, 2,
+    (handle, size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t* size))
+
+_ZX_SYSCALL_DECL(vmo_set_size, zx_status_t, /* no attributes */, 2,
+    (handle, size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint64_t size))
+
+_ZX_SYSCALL_DECL(vmo_op_range, zx_status_t, /* no attributes */, 6,
+    (handle, op, offset, size, buffer, buffer_size), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t op,
+    uint64_t offset,
+    uint64_t size,
+    void* buffer,
+    size_t buffer_size))
+
+_ZX_SYSCALL_DECL(vmo_create_child, zx_status_t, /* no attributes */, 5,
+    (handle, options, offset, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t options,
+    uint64_t offset,
+    uint64_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_set_cache_policy, zx_status_t, /* no attributes */, 2,
+    (handle, cache_policy), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle,
+    uint32_t cache_policy))
+
+_ZX_SYSCALL_DECL(vmo_replace_as_executable, zx_status_t, /* no attributes */, 3,
+    (handle, vmex, out), (
+    _ZX_SYSCALL_ANNO(release_handle("Fuchsia")) zx_handle_t handle,
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t vmex,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_create_contiguous, zx_status_t, /* no attributes */, 4,
+    (bti, size, alignment_log2, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t bti,
+    size_t size,
+    uint32_t alignment_log2,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
+_ZX_SYSCALL_DECL(vmo_create_physical, zx_status_t, /* no attributes */, 4,
+    (resource, paddr, size, out), (
+    _ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t resource,
+    zx_paddr_t paddr,
+    size_t size,
+    _ZX_SYSCALL_ANNO(acquire_handle("Fuchsia")) zx_handle_t* out))
+
diff --git a/arch/x64/sysroot/include/zircon/syscalls/iommu.h b/arch/x64/sysroot/include/zircon/syscalls/iommu.h
index e567175..414320d 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/iommu.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/iommu.h
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
+#define SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
 
 #include <assert.h>
-#include <zircon/compiler.h>
 #include <stdbool.h>
 #include <stdint.h>
+#include <zircon/compiler.h>
 
 __BEGIN_CDECLS
 
@@ -19,77 +20,78 @@
 
 // Data structures for creating a dummy IOMMU instance
 typedef struct zx_iommu_desc_dummy {
-    uint8_t reserved;
+  uint8_t reserved;
 } zx_iommu_desc_dummy_t;
 
-
 // Data structures for creating an Intel IOMMU instance
 
 // This scope represents a single PCI endpoint device
 #define ZX_IOMMU_INTEL_SCOPE_ENDPOINT 0
 // This scope represents a PCI-PCI bridge.  The bridge and all of its downstream
 // devices will be included in this scope.
-#define ZX_IOMMU_INTEL_SCOPE_BRIDGE   1
+#define ZX_IOMMU_INTEL_SCOPE_BRIDGE 1
 
 // TODO(teisenbe): Investigate FIDL for this.  Multiple embedded lists seems
 // right up its alley.
 typedef struct zx_iommu_desc_intel_scope {
-    uint8_t type;
-    // The bus number of the first bus decoded by the host bridge this scope is attached to.
-    uint8_t start_bus;
-    // Number of bridges (including the host bridge) between host bridge and the
-    // device.
-    uint8_t num_hops;
-    // The device number and function numbers of the bridges along the way,
-    // ending with the device itself.
-    // |dev_func[0]| is the address on |start_bus| of the first bridge in the
-    // path (excluding the host bridge).  |dev_func[num_hops-1]| is the address
-    // of the the device itself.
-    uint8_t dev_func[5];
+  uint8_t type;
+  // The bus number of the first bus decoded by the host bridge this scope is attached to.
+  uint8_t start_bus;
+  // Number of bridges (including the host bridge) between host bridge and the
+  // device.
+  uint8_t num_hops;
+  // The device number and function numbers of the bridges along the way,
+  // ending with the device itself.
+  // |dev_func[0]| is the address on |start_bus| of the first bridge in the
+  // path (excluding the host bridge).  |dev_func[num_hops-1]| is the address
+  // of the device itself.
+  uint8_t dev_func[5];
 } zx_iommu_desc_intel_scope_t;
 
 typedef struct zx_iommu_desc_intel_reserved_memory {
-    uint64_t base_addr; // Physical address of the base of reserved memory.
-    uint64_t len; // Number of bytes of reserved memory.
+  uint64_t base_addr;  // Physical address of the base of reserved memory.
+  uint64_t len;        // Number of bytes of reserved memory.
 
-    // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
-    uint8_t scope_bytes;
+  // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
+  uint8_t scope_bytes;
 
-    uint8_t _reserved[7]; // Padding
+  uint8_t _reserved[7];  // Padding
 
-    // This is a list of all devices that need access to this memory range.
-    //
-    // zx_iommu_desc_intel_scope_t scopes[num_scopes];
+  // This is a list of all devices that need access to this memory range.
+  //
+  // zx_iommu_desc_intel_scope_t scopes[num_scopes];
 } zx_iommu_desc_intel_reserved_memory_t;
 
 typedef struct zx_iommu_desc_intel {
-    uint64_t register_base; // Physical address of registers
-    uint16_t pci_segment; // The PCI segment associated with this IOMMU
+  uint64_t register_base;  // Physical address of registers
+  uint16_t pci_segment;    // The PCI segment associated with this IOMMU
 
-    // If true, this IOMMU has all PCI devices in its segment under its scope.
-    // In this case, the list of scopes acts as a blacklist.
-    bool whole_segment;
+  // If false, scopes[] represents all PCI devices in this segment managed by this IOMMU.
+  // If true, scopes[] represents all PCI devices in this segment *not* managed by this IOMMU.
+  bool whole_segment;
 
-    // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
-    uint8_t scope_bytes;
+  // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor.
+  uint8_t scope_bytes;
 
-    // The number of bytes of zx_iommu_desc_intel_reserved_memory_t's that follow the scope
-    // list.
-    uint16_t reserved_memory_bytes;
+  // The number of bytes of zx_iommu_desc_intel_reserved_memory_t's that follow the scope
+  // list.
+  uint16_t reserved_memory_bytes;
 
-    uint8_t _reserved[2]; // Padding
+  uint8_t _reserved[2];  // Padding
 
-    // If |whole_segment| is false, this is a list of all devices managed by
-    // this IOMMU.  If |whole_segment| is true, this is a list of all devices on
-    // this segment *not* managed by this IOMMU.  It has a total length in bytes of
-    // |scope_bytes|.
-    //
-    // zx_iommu_desc_intel_scope_t scopes[];
+  // If |whole_segment| is false, this is a list of all devices managed by
+  // this IOMMU.  If |whole_segment| is true, this is a list of all devices on
+  // this segment *not* managed by this IOMMU.  It has a total length in bytes of
+  // |scope_bytes|.
+  //
+  // zx_iommu_desc_intel_scope_t scopes[];
 
-    // A list of all BIOS-reserved memory regions this IOMMU needs to translate.
-    // It has a total length in bytes of |reserved_memory_bytes|.
-    //
-    // zx_iommu_desc_intel_reserved_memory_t reserved_mem[];
+  // A list of all BIOS-reserved memory regions this IOMMU needs to translate.
+  // It has a total length in bytes of |reserved_memory_bytes|.
+  //
+  // zx_iommu_desc_intel_reserved_memory_t reserved_mem[];
 } zx_iommu_desc_intel_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/log.h b/arch/x64/sysroot/include/zircon/syscalls/log.h
index e89d9c5..c6af1d9 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/log.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/log.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_LOG_H_
+#define SYSROOT_ZIRCON_SYSCALLS_LOG_H_
 
 #include <zircon/types.h>
 
@@ -10,13 +11,14 @@
 
 // Defines and structures for zx_log_*()
 typedef struct zx_log_record {
-    uint32_t reserved;
-    uint16_t datalen;
-    uint16_t flags;
-    zx_time_t timestamp;
-    uint64_t pid;
-    uint64_t tid;
-    char data[];
+  uint32_t rollout;
+  uint16_t datalen;
+  uint8_t severity;
+  uint8_t flags;
+  zx_time_t timestamp;
+  uint64_t pid;
+  uint64_t tid;
+  char data[];
 } zx_log_record_t;
 
 // ask clang format not to mess up the indentation:
@@ -24,32 +26,26 @@
 
 #define ZX_LOG_RECORD_MAX     256
 
-// Common Log Levels
-#define ZX_LOG_ERROR          (0x0001)
-#define ZX_LOG_WARN           (0x0002)
-#define ZX_LOG_INFO           (0x0004)
-
-// Verbose log levels
-#define ZX_LOG_TRACE          (0x0010)
-#define ZX_LOG_SPEW           (0x0020)
-
-// Custom Log Levels
-#define ZX_LOG_DEBUG1         (0x0100)
-#define ZX_LOG_DEBUG2         (0x0200)
-#define ZX_LOG_DEBUG3         (0x0400)
-#define ZX_LOG_DEBUG4         (0x0800)
+// Log Levels
+#define ZX_LOG_TRACE          (0x10)
+#define ZX_LOG_DEBUG          (0x20)
+#define ZX_LOG_INFO           (0x30)
+#define ZX_LOG_WARNING        (0x40)
+#define ZX_LOG_ERROR          (0x50)
+#define ZX_LOG_FATAL          (0x60)
 
 // Filter Flags
 
 // Do not forward this message via network
 // (for logging in network core and drivers)
-#define ZX_LOG_LOCAL          (0x1000)
+#define ZX_LOG_LOCAL          (0x10)
 
-#define ZX_LOG_LEVEL_MASK     (0x0FFF)
-#define ZX_LOG_FLAGS_MASK     (0xFFFF)
+#define ZX_LOG_FLAGS_MASK     (0x10)
 
 // Options
 
 #define ZX_LOG_FLAG_READABLE  0x40000000
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_LOG_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/object.h b/arch/x64/sysroot/include/zircon/syscalls/object.h
index 33e2e90..81414d5 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/object.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/object.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_OBJECT_H_
-#define ZIRCON_SYSCALLS_OBJECT_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
+#define SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
 
 #include <zircon/types.h>
 
@@ -12,6 +12,9 @@
 // ask clang format not to mess up the indentation:
 // clang-format off
 
+// Help macro for building versioned topics. Version is the upper 4 bits and starts counting at 0.
+#define __ZX_INFO_TOPIC(t, v) ((zx_object_info_topic_t) ((t) | ((v) << 28)))
+
 // Valid topics for zx_object_get_info.
 typedef uint32_t zx_object_info_topic_t;
 #define ZX_INFO_NONE                    ((zx_object_info_topic_t)  0u)
@@ -26,7 +29,8 @@
 #define ZX_INFO_THREAD_EXCEPTION_REPORT ((zx_object_info_topic_t) 11u) // zx_exception_report_t[1]
 #define ZX_INFO_TASK_STATS              ((zx_object_info_topic_t) 12u) // zx_info_task_stats_t[1]
 #define ZX_INFO_PROCESS_MAPS            ((zx_object_info_topic_t) 13u) // zx_info_maps_t[n]
-#define ZX_INFO_PROCESS_VMOS            ((zx_object_info_topic_t) 14u) // zx_info_vmo_t[n]
+#define ZX_INFO_PROCESS_VMOS_V1         __ZX_INFO_TOPIC(14u, 0)        // zx_info_vmo_t[n]
+#define ZX_INFO_PROCESS_VMOS            __ZX_INFO_TOPIC(14u, 1)        // zx_info_vmo_t[n]
 #define ZX_INFO_THREAD_STATS            ((zx_object_info_topic_t) 15u) // zx_info_thread_stats_t[1]
 #define ZX_INFO_CPU_STATS               ((zx_object_info_topic_t) 16u) // zx_info_cpu_stats_t[n]
 #define ZX_INFO_KMEM_STATS              ((zx_object_info_topic_t) 17u) // zx_info_kmem_stats_t[1]
@@ -35,11 +39,27 @@
 #define ZX_INFO_BTI                     ((zx_object_info_topic_t) 20u) // zx_info_bti_t[1]
 #define ZX_INFO_PROCESS_HANDLE_STATS    ((zx_object_info_topic_t) 21u) // zx_info_process_handle_stats_t[1]
 #define ZX_INFO_SOCKET                  ((zx_object_info_topic_t) 22u) // zx_info_socket_t[1]
-#define ZX_INFO_VMO                     ((zx_object_info_topic_t) 23u) // zx_info_vmo_t[1]
+#define ZX_INFO_VMO_V1                  __ZX_INFO_TOPIC(23u, 0)        // zx_info_vmo_t[1]
+#define ZX_INFO_VMO                     __ZX_INFO_TOPIC(23u, 1)        // zx_info_vmo_t[1]
+#define ZX_INFO_JOB                     ((zx_object_info_topic_t) 24u) // zx_info_job_t[1]
+#define ZX_INFO_TIMER                   ((zx_object_info_topic_t) 25u) // zx_info_timer_t[1]
+#define ZX_INFO_STREAM                  ((zx_object_info_topic_t) 26u) // zx_info_stream_t[1]
+#define ZX_INFO_HANDLE_TABLE            ((zx_object_info_topic_t) 27u) // zx_info_handle_extended_t[n]
+#define ZX_INFO_MSI                     ((zx_object_info_topic_t) 28u) // zx_info_msi_t[1]
+#define ZX_INFO_GUEST_STATS             ((zx_object_info_topic_t) 29u) // zx_info_guest_stats_t[1]
+#define ZX_INFO_TASK_RUNTIME            ((zx_object_info_topic_t) 30u) // zx_info_task_runtime_t[1]
 
-typedef uint32_t zx_obj_props_t;
-#define ZX_OBJ_PROP_NONE                ((zx_obj_props_t)0u)
-#define ZX_OBJ_PROP_WAITABLE            ((zx_obj_props_t)1u)
+// Return codes set when a task is killed.
+#define ZX_TASK_RETCODE_SYSCALL_KILL            ((int64_t) -1024)   // via zx_task_kill().
+#define ZX_TASK_RETCODE_OOM_KILL                ((int64_t) -1025)   // by the OOM killer.
+#define ZX_TASK_RETCODE_POLICY_KILL             ((int64_t) -1026)   // by the Job policy.
+#define ZX_TASK_RETCODE_VDSO_KILL               ((int64_t) -1027)   // by the VDSO.
+#define ZX_TASK_RETCODE_EXCEPTION_KILL          ((int64_t) -1028)   // Exception not handled.
+#define ZX_TASK_RETCODE_CRITICAL_PROCESS_KILL   ((int64_t) -1029)   // by a critical process.
+
+// Sentinel indicating an invalid or missing CPU.
+#define ZX_INFO_INVALID_CPU             ((uint32_t)0xFFFFFFFFu)
+
 
 typedef struct zx_info_handle_basic {
     // The unique id assigned by kernel to the object referenced by the
@@ -61,11 +81,46 @@
     // not change even if the related object no longer exists.
     zx_koid_t related_koid;
 
-    // Set to ZX_OBJ_PROP_WAITABLE if the object referenced by the
-    // handle can be waited on; zero otherwise.
-    zx_obj_props_t props;
+    uint32_t reserved;
+
+    uint8_t padding1[4];
 } zx_info_handle_basic_t;
 
+typedef struct zx_info_handle_extended {
+    // The object type: channel, event, socket, etc.
+    zx_obj_type_t type;
+
+    // The handle value which is only valid for the process which
+    // was passed to ZX_INFO_HANDLE_TABLE.
+    zx_handle_t handle_value;
+
+    // The immutable rights assigned to the handle. Two handles that
+    // have the same koid and the same rights are equivalent and
+    // interchangeable.
+    zx_rights_t rights;
+
+    uint32_t reserved;
+
+    // The unique id assigned by kernel to the object referenced by the
+    // handle.
+    zx_koid_t koid;
+
+    // If the object referenced by the handle is related to another (such
+    // as the other end of a channel, or the parent of a job) then
+    // |related_koid| is the koid of that object, otherwise it is zero.
+    // This relationship is immutable: an object's |related_koid| does
+    // not change even if the related object no longer exists.
+    zx_koid_t related_koid;
+
+    // If the object referenced by the handle has a peer, like the
+    // other end of a channel, then this is the koid of the process
+    // which currently owns it. This value is not stable; the process
+    // can change the owner at any moment.
+    //
+    // This is currently unimplemented and contains 0.
+    zx_koid_t peer_owner_koid;
+} zx_info_handle_extended_t;
+
 typedef struct zx_info_handle_count {
     // The number of outstanding handles to a kernel object.
     uint32_t handle_count;
@@ -73,12 +128,12 @@
 
 typedef struct zx_info_process_handle_stats {
     // The number of outstanding handles to kernel objects of each type.
-    uint32_t handle_count[64];
+    uint32_t handle_count[ZX_OBJ_TYPE_UPPER_BOUND];
 } zx_info_process_handle_stats_t;
 
 typedef struct zx_info_process {
     // The process's return code; only valid if |exited| is true.
-    // Guaranteed to be non-zero if the process was killed by |zx_task_kill|.
+    // If the process was killed, it will be one of the ZX_TASK_RETCODE values.
     int64_t return_code;
 
     // True if the process has ever left the initial creation state,
@@ -90,8 +145,70 @@
 
     // True if a debugger is attached to the process.
     bool debugger_attached;
+
+    uint8_t padding1[5];
 } zx_info_process_t;
 
+typedef struct zx_info_job {
+    // The job's return code; only valid if |exited| is true.
+    // If the process was killed, it will be one of the ZX_TASK_RETCODE values.
+    int64_t return_code;
+
+    // If true, the job has exited and |return_code| is valid.
+    bool exited;
+
+    // True if the ZX_PROP_JOB_KILL_ON_OOM was set.
+    bool kill_on_oom;
+
+    // True if a debugger is attached to the job.
+    bool debugger_attached;
+
+    uint8_t padding1[5];
+} zx_info_job_t;
+
+typedef struct zx_info_timer {
+    // The options passed to zx_timer_create().
+    uint32_t options;
+
+    uint8_t padding1[4];
+
+    // The deadline with respect to ZX_CLOCK_MONOTONIC at which the timer will
+    // fire next.
+    //
+    // This value will be zero if the timer is not set to fire.
+    zx_time_t deadline;
+
+    // Specifies a range from deadline - slack to deadline + slack during which
+    // the timer is allowed to fire. The system uses this parameter as a hint to
+    // coalesce nearby timers.
+    //
+    // The precise coalescing behavior is controlled by the options parameter
+    // specified when the timer was created.
+    //
+    // This value will be zero if the timer is not set to fire.
+    zx_duration_t slack;
+} zx_info_timer_t;
+
+typedef struct zx_info_stream {
+    // The options passed to zx_stream_create().
+    uint32_t options;
+
+    uint8_t padding1[4];
+
+    // The current seek offset.
+    //
+    // Used by zx_stream_readv and zx_stream_writev to determine where to read
+    // and write the stream.
+    zx_off_t seek;
+
+    // The current size of the stream.
+    //
+    // The number of bytes in the stream that store data. The stream itself
+    // might have a larger capacity to avoid reallocating the underlying storage
+    // as the stream grows or shrinks.
+    uint64_t content_size;
+} zx_info_stream_t;
+
 typedef uint32_t zx_thread_state_t;
 
 typedef struct zx_info_thread {
@@ -99,15 +216,32 @@
     zx_thread_state_t state;
 
     // If |state| is ZX_THREAD_STATE_BLOCKED_EXCEPTION, the thread has gotten
-    // an exception and is waiting for the exception to be handled by the
-    // specified port.
-    // The value is one of ZX_EXCEPTION_PORT_TYPE_*.
-    uint32_t wait_exception_port_type;
+    // an exception and is waiting for the exception response from the specified
+    // handler.
+
+    // The value is one of ZX_EXCEPTION_CHANNEL_TYPE_*.
+    uint32_t wait_exception_channel_type;
+
+    // CPUs this thread may be scheduled on, as specified by
+    // a profile object applied to this thread.
+    //
+    // The kernel may not internally store invalid CPUs in the mask, so
+    // this may not exactly match the mask applied to the thread for
+    // CPUs beyond what the system is able to use.
+    zx_cpu_set_t cpu_affinity_mask;
 } zx_info_thread_t;
 
 typedef struct zx_info_thread_stats {
     // Total accumulated running time of the thread.
     zx_duration_t total_runtime;
+
+    // CPU number that this thread was last scheduled on, or ZX_INFO_INVALID_CPU
+    // if the thread has never been scheduled on a CPU. By the time this call
+    // returns, the thread may have been scheduled elsewhere, so this
+    // information should only be used as a hint or for statistics.
+    uint32_t last_scheduled_cpu;
+
+    uint8_t padding1[4];
 } zx_info_thread_stats_t;
 
 // Statistics about resources (e.g., memory) used by a task. Can be relatively
@@ -155,12 +289,22 @@
 
     // The number of bytes in the device's address space (UINT64_MAX if 2^64).
     uint64_t aspace_size;
+
+    // The count of the pinned memory object tokens. Requesting this count is
+    // racy, so this should only be used for informative reasons.
+    uint64_t pmo_count;
+
+    // The count of the quarantined pinned memory object tokens. Requesting this count is
+    // racy, so this should only be used for informative reasons.
+    uint64_t quarantine_count;
 } zx_info_bti_t;
 
 typedef struct zx_info_socket {
     // The options passed to zx_socket_create().
     uint32_t options;
 
+    uint8_t padding1[4];
+
     // The maximum size of the receive buffer of a socket, in bytes.
     //
     // The receive buffer may become full at a capacity less than the maximum
@@ -199,6 +343,7 @@
     // MMU flags for the mapping.
     // Bitwise OR of ZX_VM_PERM_{READ,WRITE,EXECUTE} values.
     zx_vm_option_t mmu_flags;
+    uint8_t padding1[4];
     // koid of the mapped VMO.
     zx_koid_t vmo_koid;
     // Offset into the above VMO.
@@ -232,6 +377,7 @@
     size_t depth;
     // The type of this entry; indicates which union entry is valid.
     zx_info_maps_type_t type;
+    uint8_t padding1[4];
     union {
         zx_info_maps_mapping_t mapping;
         // No additional fields for other types.
@@ -256,7 +402,10 @@
 // if (ZX_INFO_VMO_TYPE(f) == ZX_INFO_VMO_TYPE_PAGED)
 #define ZX_INFO_VMO_TYPE(flags)             ((flags) & (1u<<0))
 
-// The VMO is a clone, and is a copy-on-write clone.
+// The VMO is resizable.
+#define ZX_INFO_VMO_RESIZABLE               (1u<<1)
+
+// The VMO is a child, and is a copy-on-write clone.
 #define ZX_INFO_VMO_IS_COW_CLONE            (1u<<2)
 
 // When reading a list of VMOs pointed to by a process, indicates that the
@@ -268,6 +417,14 @@
 // the VMO.
 #define ZX_INFO_VMO_VIA_MAPPING             (1u<<4)
 
+// The VMO is a pager owned VMO created by zx_pager_create_vmo or is
+// a clone of a VMO with this flag set. Will only be set on VMOs with
+// the ZX_INFO_VMO_TYPE_PAGED flag set.
+#define ZX_INFO_VMO_PAGER_BACKED            (1u<<5)
+
+// The VMO is contiguous
+#define ZX_INFO_VMO_CONTIGUOUS              (1u<<6)
+
 // Describes a VMO. For mapping information, see |zx_info_maps_t|.
 typedef struct zx_info_vmo {
     // The koid of this VMO.
@@ -301,6 +458,8 @@
     // Bitwise OR of ZX_INFO_VMO_* values.
     uint32_t flags;
 
+    uint8_t padding1[4];
+
     // If |ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|, the amount of
     // memory currently allocated to this VMO; i.e., the amount of physical
     // memory it consumes. Undefined otherwise.
@@ -310,15 +469,83 @@
     // Undefined otherwise.
     zx_rights_t handle_rights;
 
-    // VMO creation options. This is a bitmask of
-    // kResizable    = (1u << 0);
-    // kContiguous   = (1u << 1);
-    uint32_t create_options;
-
     // VMO mapping cache policy. One of ZX_CACHE_POLICY_*
     uint32_t cache_policy;
+
+    // Amount of kernel memory, in bytes, allocated to track metadata
+    // associated with this VMO.
+    uint64_t metadata_bytes;
+
+    // Running counter of the number of times the kernel, without user request,
+    // performed actions on this VMO that would have caused |committed_bytes| to
+    // report a different value.
+    uint64_t committed_change_events;
 } zx_info_vmo_t;
 
+typedef struct zx_info_vmo_v1 {
+    zx_koid_t koid;
+    char name[ZX_MAX_NAME_LEN];
+    uint64_t size_bytes;
+    zx_koid_t parent_koid;
+    size_t num_children;
+    size_t num_mappings;
+    size_t share_count;
+    uint32_t flags;
+    uint8_t padding1[4];
+    uint64_t committed_bytes;
+    zx_rights_t handle_rights;
+    uint32_t cache_policy;
+} zx_info_vmo_v1_t;
+
+typedef struct zx_info_guest_stats {
+    uint32_t cpu_number;
+    uint32_t flags;
+
+    uint64_t vm_entries;
+    uint64_t vm_exits;
+#ifdef __aarch64__
+    uint64_t wfi_wfe_instructions;
+    uint64_t instruction_aborts;
+    uint64_t data_aborts;
+    uint64_t system_instructions;
+    uint64_t smc_instructions;
+    uint64_t interrupts;
+#else
+    uint64_t interrupts;
+    uint64_t interrupt_windows;
+    uint64_t cpuid_instructions;
+    uint64_t hlt_instructions;
+    uint64_t control_register_accesses;
+    uint64_t io_instructions;
+    uint64_t rdmsr_instructions;
+    uint64_t wrmsr_instructions;
+    uint64_t ept_violations;
+    uint64_t xsetbv_instructions;
+    uint64_t pause_instructions;
+    uint64_t vmcall_instructions;
+#endif
+} zx_info_guest_stats_t;
+
+// Info on the runtime of a task.
+typedef struct zx_info_task_runtime {
+    // The total amount of time this task and its children were running.
+    // * Threads include only their own runtime.
+    // * Processes include the runtime for all of their threads (including threads that previously
+    // exited).
+    // * Jobs include the runtime for all of their processes (including processes that previously
+    // exited).
+    zx_duration_t cpu_time;
+
+    // The total amount of time this task and its children were queued to run.
+    // * Threads include only their own queue time.
+    // * Processes include the queue time for all of their threads (including threads that
+    // previously exited).
+    // * Jobs include the queue time for all of their processes (including processes that previously
+    // exited).
+    zx_duration_t queue_time;
+} zx_info_task_runtime_t;
+
+
 // kernel statistics per cpu
 // TODO(cpu), expose the deprecated stats via a new syscall.
 typedef struct zx_info_cpu_stats {
@@ -399,6 +626,19 @@
     char name[ZX_MAX_NAME_LEN];
 } zx_info_resource_t;
 
+typedef struct zx_info_msi {
+  // The target adress for write transactions.
+  uint64_t target_addr;
+  // The data that the device will write when triggering an IRQ.
+  uint32_t target_data;
+  // The first IRQ in the allocated block.
+  uint32_t base_irq_id;
+  // The number of IRQs in the allocated block.
+  uint32_t num_irq;
+  // The number of outstanding interrupt objects created off this Msi object.
+  uint32_t interrupt_count;
+} zx_info_msi_t;
+
 #define ZX_INFO_CPU_STATS_FLAG_ONLINE       (1u<<0)
 
 // Object properties.
@@ -422,6 +662,19 @@
 // Argument is the base address of the vDSO mapping (or zero), a uintptr_t.
 #define ZX_PROP_PROCESS_VDSO_BASE_ADDRESS   ((uint32_t) 6u)
 
+// Whether the dynamic loader should issue a debug trap when loading a shared library,
+// either initially or when running (e.g. dlopen).
+//
+// See docs/reference/syscalls/object_get_property.md
+// See third_party/ulib/musl/ldso/dynlink.c.
+#define ZX_PROP_PROCESS_BREAK_ON_LOAD ((uint32_t) 7u)
+
+// The process's context id as recorded by h/w instruction tracing, a uintptr_t.
+// On X86 this is the cr3 value.
+// TODO(dje): Wasn't sure whether the gaps in property numbers are unusable
+// due to being old dleeted values. For now I just picked something.
+#define ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID ((uint32_t) 8u)
+
 // Argument is a size_t.
 #define ZX_PROP_SOCKET_RX_THRESHOLD         12u
 #define ZX_PROP_SOCKET_TX_THRESHOLD         13u
@@ -429,6 +682,21 @@
 // Terminate this job if the system is low on memory.
 #define ZX_PROP_JOB_KILL_ON_OOM             15u
 
+// Exception close behavior.
+#define ZX_PROP_EXCEPTION_STATE             16u
+
+// The size of the content in a VMO, in bytes.
+//
+// The content size of a VMO can be larger or smaller than the actual size of
+// the VMO.
+//
+// Argument is a uint64_t.
+#define ZX_PROP_VMO_CONTENT_SIZE            17u
+
+// How an exception should be handled.
+// See //docs/concepts/kernel/exceptions.md.
+#define ZX_PROP_EXCEPTION_STRATEGY          18u
+
 // Basic thread states, in zx_info_thread_t.state.
 #define ZX_THREAD_STATE_NEW                 ((zx_thread_state_t) 0x0000u)
 #define ZX_THREAD_STATE_RUNNING             ((zx_thread_state_t) 0x0001u)
@@ -449,11 +717,22 @@
 #define ZX_THREAD_STATE_BLOCKED_WAIT_ONE    ((zx_thread_state_t) 0x0603u)
 #define ZX_THREAD_STATE_BLOCKED_WAIT_MANY   ((zx_thread_state_t) 0x0703u)
 #define ZX_THREAD_STATE_BLOCKED_INTERRUPT   ((zx_thread_state_t) 0x0803u)
+#define ZX_THREAD_STATE_BLOCKED_PAGER       ((zx_thread_state_t) 0x0903u)
 
 // Reduce possibly-more-precise state to a basic state.
 // Useful if, for example, you want to check for BLOCKED on anything.
 #define ZX_THREAD_STATE_BASIC(n) ((n) & 0xff)
 
+// How a thread should behave when the current exception is closed.
+// ZX_PROP_EXCEPTION_STATE values.
+#define ZX_EXCEPTION_STATE_TRY_NEXT         0u
+#define ZX_EXCEPTION_STATE_HANDLED          1u
+
+// How an exception should be handled
+// ZX_PROP_EXCEPTION_STRATEGY values.
+#define ZX_EXCEPTION_STRATEGY_FIRST_CHANCE  0u
+#define ZX_EXCEPTION_STRATEGY_SECOND_CHANCE 1u
+
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_OBJECT_H_
+#endif // SYSROOT_ZIRCON_SYSCALLS_OBJECT_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/pci.h b/arch/x64/sysroot/include/zircon/syscalls/pci.h
index b97f1c3..d1049c2 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/pci.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/pci.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PCI_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PCI_H_
 
 #include <zircon/types.h>
 
@@ -32,7 +33,10 @@
     size_t size;
     union {
         uintptr_t addr;
-        zx_handle_t handle;
+        struct {
+            zx_handle_t handle;
+            uint8_t padding1[4];
+        };
     };
 } zx_pci_bar_t;
 
@@ -50,6 +54,8 @@
     uint8_t  bus_id;
     uint8_t  dev_id;
     uint8_t  func_id;
+
+    uint8_t  padding1;
 } zx_pcie_device_info_t;
 
 #define ZX_PCI_MAX_BUSSES (256u)
@@ -84,6 +90,10 @@
                                          [ZX_PCI_MAX_FUNCTIONS_PER_DEVICE]
                                          [ZX_PCI_MAX_LEGACY_IRQ_PINS];
 
+// We support up to 224 IRQs on a system, this is the maximum supported by
+// LAPICs (today) so this should be a safe number.
+#define ZX_PCI_MAX_IRQS 224
+
 typedef struct zx_pci_init_arg {
     zx_pci_irq_swizzle_lut_t dev_pin_to_global_irq;
 
@@ -92,7 +102,8 @@
         uint32_t global_irq;
         bool level_triggered;
         bool active_high;
-    } irqs[64];
+        uint8_t padding1[2];
+    } irqs[ZX_PCI_MAX_IRQS];
 
     uint32_t addr_window_count;
     struct {
@@ -102,6 +113,7 @@
         uint8_t bus_end;
         uint8_t cfg_space_type;
         bool has_ecam;
+        uint8_t padding1[4];
     } addr_windows[];
 } zx_pci_init_arg_t;
 
@@ -118,3 +130,5 @@
 #define ZX_PCIE_IRQ_MODE_MSI_X ((zx_pci_irq_mode_t) 3u)
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PCI_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/policy.h b/arch/x64/sysroot/include/zircon/syscalls/policy.h
index f7061ce..158c604 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/policy.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/policy.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
+#define SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
 
 #include <zircon/types.h>
 
@@ -13,18 +14,33 @@
 
 // Policy is applied for the conditions that are not
 // specified by the parent job policy.
-#define ZX_JOB_POL_RELATIVE                 0u
+#define ZX_JOB_POL_RELATIVE                     0u
 // Policy is either applied as-is or the syscall fails.
-#define ZX_JOB_POL_ABSOLUTE                 1u
+#define ZX_JOB_POL_ABSOLUTE                     1u
 
 // Basic policy topic.
-#define ZX_JOB_POL_BASIC                    0u
+#define ZX_JOB_POL_BASIC_V1                     0u
+#define ZX_JOB_POL_BASIC_V2            0x01000000u
 
-// Input structure to use with ZX_JOB_POL_BASIC.
-typedef struct zx_policy_basic {
+// Timer slack policy topic.
+#define ZX_JOB_POL_TIMER_SLACK                  1u
+
+// Input structure to use with ZX_JOB_POL_BASIC_V1.
+typedef struct zx_policy_basic_v1 {
     uint32_t condition;
     uint32_t policy;
-} zx_policy_basic_t;
+} zx_policy_basic_v1_t;
+
+// Input structure to use with ZX_JOB_POL_BASIC_V2.
+typedef struct zx_policy_basic_v2 {
+    uint32_t condition;
+    uint32_t action;
+    uint32_t flags;
+} zx_policy_basic_v2_t;
+
+#define ZX_JOB_POL_BASIC        ZX_JOB_POL_BASIC_V1
+typedef struct zx_policy_basic_v1 zx_policy_basic;
+typedef struct zx_policy_basic_v1 zx_policy_basic_t;
 
 // Conditions handled by job policy.
 #define ZX_POL_BAD_HANDLE                    0u
@@ -40,16 +56,34 @@
 #define ZX_POL_NEW_FIFO                     10u
 #define ZX_POL_NEW_TIMER                    11u
 #define ZX_POL_NEW_PROCESS                  12u
+#define ZX_POL_NEW_PROFILE                  13u
+#define ZX_POL_AMBIENT_MARK_VMO_EXEC        14u
 #ifdef _KERNEL
-#define ZX_POL_MAX                          13u
+#define ZX_POL_MAX                          15u
 #endif
 
 // Policy actions.
-// ZX_POL_ACTION_ALLOW and ZX_POL_ACTION_DENY can be ORed with ZX_POL_ACTION_EXCEPTION.
-// ZX_POL_ACTION_KILL implies ZX_POL_ACTION_DENY.
 #define ZX_POL_ACTION_ALLOW                 0u
 #define ZX_POL_ACTION_DENY                  1u
-#define ZX_POL_ACTION_EXCEPTION             2u
-#define ZX_POL_ACTION_KILL                  5u
+#define ZX_POL_ACTION_ALLOW_EXCEPTION       2u
+#define ZX_POL_ACTION_DENY_EXCEPTION        3u
+#define ZX_POL_ACTION_KILL                  4u
+#ifdef _KERNEL
+#define ZX_POL_ACTION_MAX                   5u
+#endif
+
+// Policy override.
+#define ZX_POL_OVERRIDE_ALLOW               0u
+#define ZX_POL_OVERRIDE_DENY                1u
+
+
+// Input structure to use with ZX_JOB_POL_TIMER_SLACK.
+typedef struct zx_policy_timer_slack {
+    zx_duration_t min_slack;
+    uint32_t default_mode;
+    uint8_t padding1[4];
+} zx_policy_timer_slack_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_POLICY_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/port.h b/arch/x64/sysroot/include/zircon/syscalls/port.h
index 10bc39b..06b3b6a 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/port.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/port.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_SYSCALLS_PORT_H_
-#define ZIRCON_SYSCALLS_PORT_H_
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PORT_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PORT_H_
 
 #include <zircon/compiler.h>
 #include <zircon/types.h>
@@ -13,140 +13,162 @@
 // clang-format off
 
 // zx_object_wait_async() options
+// Do not use ZX_WAIT_ASYNC_ONCE. It is now superfluous and will be removed.
 #define ZX_WAIT_ASYNC_ONCE          ((uint32_t)0u)
-#define ZX_WAIT_ASYNC_REPEATING     ((uint32_t)1u)
+#define ZX_WAIT_ASYNC_TIMESTAMP     ((uint32_t)1u)
 
 // packet types.  zx_port_packet_t::type
 #define ZX_PKT_TYPE_USER            ((uint8_t)0x00u)
 #define ZX_PKT_TYPE_SIGNAL_ONE      ((uint8_t)0x01u)
-#define ZX_PKT_TYPE_SIGNAL_REP      ((uint8_t)0x02u)
+// 0x02 was previously used for "ZX_PKT_TYPE_SIGNAL_REP".
 #define ZX_PKT_TYPE_GUEST_BELL      ((uint8_t)0x03u)
 #define ZX_PKT_TYPE_GUEST_MEM       ((uint8_t)0x04u)
 #define ZX_PKT_TYPE_GUEST_IO        ((uint8_t)0x05u)
 #define ZX_PKT_TYPE_GUEST_VCPU      ((uint8_t)0x06u)
 #define ZX_PKT_TYPE_INTERRUPT       ((uint8_t)0x07u)
-#define ZX_PKT_TYPE_EXCEPTION(n)    ((uint32_t)(0x08u | (((n) & 0xFFu) << 8)))
+#define ZX_PKT_TYPE_PAGE_REQUEST    ((uint8_t)0x09u)
 
 // For options passed to port_create
 #define ZX_PORT_BIND_TO_INTERRUPT   ((uint32_t)(0x1u << 0))
 
 #define ZX_PKT_TYPE_MASK            ((uint32_t)0x000000FFu)
 
-#define ZX_PKT_IS_USER(type)        ((type) == ZX_PKT_TYPE_USER)
-#define ZX_PKT_IS_SIGNAL_ONE(type)  ((type) == ZX_PKT_TYPE_SIGNAL_ONE)
-#define ZX_PKT_IS_SIGNAL_REP(type)  ((type) == ZX_PKT_TYPE_SIGNAL_REP)
-#define ZX_PKT_IS_GUEST_BELL(type)  ((type) == ZX_PKT_TYPE_GUEST_BELL)
-#define ZX_PKT_IS_GUEST_MEM(type)   ((type) == ZX_PKT_TYPE_GUEST_MEM)
-#define ZX_PKT_IS_GUEST_IO(type)    ((type) == ZX_PKT_TYPE_GUEST_IO)
-#define ZX_PKT_IS_GUEST_VCPU(type)  ((type) == ZX_PKT_TYPE_GUEST_VCPU)
-#define ZX_PKT_IS_INTERRUPT(type)   ((type) == ZX_PKT_TYPE_INTERRUPT)
-#define ZX_PKT_IS_EXCEPTION(type)   (((type) & ZX_PKT_TYPE_MASK) == ZX_PKT_TYPE_EXCEPTION(0))
+#define ZX_PKT_IS_USER(type)          ((type) == ZX_PKT_TYPE_USER)
+#define ZX_PKT_IS_SIGNAL_ONE(type)    ((type) == ZX_PKT_TYPE_SIGNAL_ONE)
+#define ZX_PKT_IS_GUEST_BELL(type)    ((type) == ZX_PKT_TYPE_GUEST_BELL)
+#define ZX_PKT_IS_GUEST_MEM(type)     ((type) == ZX_PKT_TYPE_GUEST_MEM)
+#define ZX_PKT_IS_GUEST_IO(type)      ((type) == ZX_PKT_TYPE_GUEST_IO)
+#define ZX_PKT_IS_GUEST_VCPU(type)    ((type) == ZX_PKT_TYPE_GUEST_VCPU)
+#define ZX_PKT_IS_INTERRUPT(type)     ((type) == ZX_PKT_TYPE_INTERRUPT)
+#define ZX_PKT_IS_PAGE_REQUEST(type)  ((type) == ZX_PKT_TYPE_PAGE_REQUEST)
 
 // zx_packet_guest_vcpu_t::type
 #define ZX_PKT_GUEST_VCPU_INTERRUPT  ((uint8_t)0)
 #define ZX_PKT_GUEST_VCPU_STARTUP    ((uint8_t)1)
+
+// zx_packet_page_request_t::command
+#define ZX_PAGER_VMO_READ ((uint16_t) 0)
+#define ZX_PAGER_VMO_COMPLETE ((uint16_t) 1)
 // clang-format on
 
 // port_packet_t::type ZX_PKT_TYPE_USER.
 typedef union zx_packet_user {
-    uint64_t u64[4];
-    uint32_t u32[8];
-    uint16_t u16[16];
-    uint8_t c8[32];
+  uint64_t u64[4];
+  uint32_t u32[8];
+  uint16_t u16[16];
+  uint8_t c8[32];
 } zx_packet_user_t;
 
-// port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE and ZX_PKT_TYPE_SIGNAL_REP.
+// port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE.
 typedef struct zx_packet_signal {
-    zx_signals_t trigger;
-    zx_signals_t observed;
-    uint64_t count;
-    uint64_t reserved0;
-    uint64_t reserved1;
+  zx_signals_t trigger;
+  zx_signals_t observed;
+  uint64_t count;
+  uint64_t timestamp;
+  uint64_t reserved1;
 } zx_packet_signal_t;
 
-typedef struct zx_packet_exception {
-    uint64_t pid;
-    uint64_t tid;
-    uint64_t reserved0;
-    uint64_t reserved1;
-} zx_packet_exception_t;
-
 typedef struct zx_packet_guest_bell {
-    zx_gpaddr_t addr;
-    uint64_t reserved0;
-    uint64_t reserved1;
-    uint64_t reserved2;
+  zx_gpaddr_t addr;
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_guest_bell_t;
 
 typedef struct zx_packet_guest_mem {
-    zx_gpaddr_t addr;
+  zx_gpaddr_t addr;
 #if __aarch64__
-    uint8_t access_size;
-    bool sign_extend;
-    uint8_t xt;
-    bool read;
-    uint64_t data;
-    uint64_t reserved;
+  uint8_t access_size;
+  bool sign_extend;
+  uint8_t xt;
+  bool read;
+  uint8_t padding1[4];
+  uint64_t data;
+  uint64_t reserved;
 #elif __x86_64__
 // NOTE: x86 instructions are guaranteed to be 15 bytes or fewer.
 #define X86_MAX_INST_LEN 15u
-    uint8_t inst_len;
-    uint8_t inst_buf[X86_MAX_INST_LEN];
-    uint8_t default_operand_size;
-    uint8_t reserved[7];
+  uint8_t inst_len;
+  uint8_t inst_buf[X86_MAX_INST_LEN];
+  // This is the default operand size as determined by the CS and EFER register (Volume 3,
+  // Section 5.2.1). If operating in 64-bit mode then near branches and all instructions, except
+  // far branches, that implicitly reference the RSP will actually have a default operand size of
+  // 64-bits (Volume 2, Section 2.2.1.7), and not the 32-bits that will be given here.
+  uint8_t default_operand_size;
+  uint8_t reserved[7];
 #endif
 } zx_packet_guest_mem_t;
 
 typedef struct zx_packet_guest_io {
-    uint16_t port;
-    uint8_t access_size;
-    bool input;
-    union {
-        uint8_t u8;
-        uint16_t u16;
-        uint32_t u32;
-        uint8_t data[4];
+  uint16_t port;
+  uint8_t access_size;
+  bool input;
+  union {
+    struct {
+      uint8_t u8;
+      uint8_t padding1[3];
     };
-    uint64_t reserved0;
-    uint64_t reserved1;
-    uint64_t reserved2;
+    struct {
+      uint16_t u16;
+      uint8_t padding2[2];
+    };
+    uint32_t u32;
+    uint8_t data[4];
+  };
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_guest_io_t;
 
 typedef struct zx_packet_guest_vcpu {
-    union {
-        struct {
-            uint64_t mask;
-            uint8_t vector;
-        } interrupt;
-        struct {
-            uint64_t id;
-            zx_gpaddr_t entry;
-        } startup;
-    };
-    uint8_t type;
-    uint64_t reserved;
+  union {
+    struct {
+      uint64_t mask;
+      uint8_t vector;
+      uint8_t padding1[7];
+    } interrupt;
+    struct {
+      uint64_t id;
+      zx_gpaddr_t entry;
+    } startup;
+  };
+  uint8_t type;
+  uint8_t padding1[7];
+  uint64_t reserved;
 } zx_packet_guest_vcpu_t;
 
 typedef struct zx_packet_interrupt {
-    zx_time_t timestamp;
+  zx_time_t timestamp;
+  uint64_t reserved0;
+  uint64_t reserved1;
+  uint64_t reserved2;
 } zx_packet_interrupt_t;
 
+typedef struct zx_packet_page_request {
+  uint16_t command;
+  uint16_t flags;
+  uint32_t reserved0;
+  uint64_t offset;
+  uint64_t length;
+  uint64_t reserved1;
+} zx_packet_page_request_t;
+
 typedef struct zx_port_packet {
-    uint64_t key;
-    uint32_t type;
-    int32_t status;
-    union {
-        zx_packet_user_t user;
-        zx_packet_signal_t signal;
-        zx_packet_exception_t exception;
-        zx_packet_guest_bell_t guest_bell;
-        zx_packet_guest_mem_t guest_mem;
-        zx_packet_guest_io_t guest_io;
-        zx_packet_guest_vcpu_t guest_vcpu;
-        zx_packet_interrupt_t interrupt;
-    };
+  uint64_t key;
+  uint32_t type;
+  zx_status_t status;
+  union {
+    zx_packet_user_t user;
+    zx_packet_signal_t signal;
+    zx_packet_guest_bell_t guest_bell;
+    zx_packet_guest_mem_t guest_mem;
+    zx_packet_guest_io_t guest_io;
+    zx_packet_guest_vcpu_t guest_vcpu;
+    zx_packet_interrupt_t interrupt;
+    zx_packet_page_request_t page_request;
+  };
 } zx_port_packet_t;
 
 __END_CDECLS
 
-#endif // ZIRCON_SYSCALLS_PORT_H_
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PORT_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/profile.h b/arch/x64/sysroot/include/zircon/syscalls/profile.h
index 10ed499..5abf561 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/profile.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/profile.h
@@ -2,36 +2,48 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
+#define SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
 
+#include <zircon/syscalls/scheduler.h>
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
-// ask clang format not to mess up the indentation:
-// clang-format off
+#define ZX_PRIORITY_LOWEST 0
+#define ZX_PRIORITY_LOW 8
+#define ZX_PRIORITY_DEFAULT 16
+#define ZX_PRIORITY_HIGH 24
+#define ZX_PRIORITY_HIGHEST 31
 
-#define ZX_PROFILE_INFO_SCHEDULER   1
-
-typedef struct zx_profile_scheduler {
-    int32_t priority;
-    uint32_t boost;
-    uint32_t deboost;
-    uint32_t quantum;
-} zx_profile_scheduler_t;
-
-#define ZX_PRIORITY_LOWEST              0
-#define ZX_PRIORITY_LOW                 8
-#define ZX_PRIORITY_DEFAULT             16
-#define ZX_PRIORITY_HIGH                24
-#define ZX_PRIORITY_HIGHEST             31
+#define ZX_PROFILE_INFO_FLAG_PRIORITY (1 << 0)
+#define ZX_PROFILE_INFO_FLAG_CPU_MASK (1 << 1)
+#define ZX_PROFILE_INFO_FLAG_DEADLINE (1 << 2)
 
 typedef struct zx_profile_info {
-    uint32_t type;                  // one of ZX_PROFILE_INFO_
-    union {
-        zx_profile_scheduler_t scheduler;
+  // A bitmask of ZX_PROFILE_INFO_FLAG_* values. Specifies which fields
+  // below have been specified. Other fields are considered unset.
+  uint32_t flags;
+
+  uint8_t padding1[4];
+
+  union {
+    struct {
+      // Scheduling priority. |flags| must have ZX_PROFILE_INFO_FLAG_PRIORITY set.
+      int32_t priority;
+
+      uint8_t padding2[20];
     };
+
+    // Scheduling deadline. |flags| must have ZX_PROFILE_INFO_FLAG_DEADLINE set.
+    zx_sched_deadline_params_t deadline_params;
+  };
+
+  // CPUs that threads may be scheduled on. |flags| must have
+  // ZX_PROFILE_INFO_FLAG_CPU_MASK set.
+  zx_cpu_set_t cpu_affinity_mask;
 } zx_profile_info_t;
 
-
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_PROFILE_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/resource.h b/arch/x64/sysroot/include/zircon/syscalls/resource.h
index 6defbda..9243d17 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/resource.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/resource.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
+#define SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
 
 #include <stdint.h>
-
 #include <zircon/compiler.h>
 
 // Resources that require a region allocator to handle exclusive reservations
@@ -14,21 +14,23 @@
 // bookkeeping. It's important that ZX_RSRC_KIND_COUNT is defined for each
 // architecture to properly allocate only the bookkeeping necessary.
 //
-// TODO(ZX-2419): Don't expose ZX_RSRC_KIND_COUNT to userspace
+// TODO(fxbug.dev/32272): Don't expose ZX_RSRC_KIND_COUNT to userspace
 
 typedef uint32_t zx_rsrc_kind_t;
-#define ZX_RSRC_KIND_MMIO           ((zx_rsrc_kind_t)0u)
-#define ZX_RSRC_KIND_IRQ            ((zx_rsrc_kind_t)1u)
-#define ZX_RSRC_KIND_IOPORT         ((zx_rsrc_kind_t)2u)
-#define ZX_RSRC_KIND_HYPERVISOR     ((zx_rsrc_kind_t)3u)
-#define ZX_RSRC_KIND_ROOT           ((zx_rsrc_kind_t)4u)
-#define ZX_RSRC_KIND_VMEX           ((zx_rsrc_kind_t)5u)
-#define ZX_RSRC_KIND_SMC            ((zx_rsrc_kind_t)6u)
-#define ZX_RSRC_KIND_COUNT          ((zx_rsrc_kind_t)7u)
+#define ZX_RSRC_KIND_MMIO ((zx_rsrc_kind_t)0u)
+#define ZX_RSRC_KIND_IRQ ((zx_rsrc_kind_t)1u)
+#define ZX_RSRC_KIND_IOPORT ((zx_rsrc_kind_t)2u)
+#define ZX_RSRC_KIND_HYPERVISOR ((zx_rsrc_kind_t)3u)
+#define ZX_RSRC_KIND_ROOT ((zx_rsrc_kind_t)4u)
+#define ZX_RSRC_KIND_VMEX ((zx_rsrc_kind_t)5u)
+#define ZX_RSRC_KIND_SMC ((zx_rsrc_kind_t)6u)
+#define ZX_RSRC_KIND_COUNT ((zx_rsrc_kind_t)7u)
 
 typedef uint32_t zx_rsrc_flags_t;
-#define ZX_RSRC_FLAG_EXCLUSIVE      ((zx_rsrc_flags_t)0x00010000u)
-#define ZX_RSRC_FLAGS_MASK          ((zx_rsrc_flags_t)ZX_RSRC_FLAG_EXCLUSIVE)
+#define ZX_RSRC_FLAG_EXCLUSIVE ((zx_rsrc_flags_t)0x00010000u)
+#define ZX_RSRC_FLAGS_MASK ((zx_rsrc_flags_t)ZX_RSRC_FLAG_EXCLUSIVE)
 
-#define ZX_RSRC_EXTRACT_KIND(x)     ((x) & 0x0000FFFF)
-#define ZX_RSRC_EXTRACT_FLAGS(x)    ((x) & 0xFFFF0000)
+#define ZX_RSRC_EXTRACT_KIND(x) ((x)&0x0000FFFF)
+#define ZX_RSRC_EXTRACT_FLAGS(x) ((x)&0xFFFF0000)
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_RESOURCE_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/scheduler.h b/arch/x64/sysroot/include/zircon/syscalls/scheduler.h
new file mode 100644
index 0000000..c119562
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/syscalls/scheduler.h
@@ -0,0 +1,36 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
+
+#include <zircon/compiler.h>
+#include <zircon/time.h>
+
+__BEGIN_CDECLS
+
+// Parameters for deadline scheduler profiles.
+//
+// At minimum, the following relation must hold:
+//
+//   0 < capacity <= relative_deadline <= period
+//
+// Additional restrictions on the range and granularity of the parameters may be
+// enforced, which can vary from system to system.
+//
+typedef struct zx_sched_deadline_params {
+  // The worst case execution time of the deadline work per interarrival period.
+  zx_duration_t capacity;
+
+  // The worst case finish time of the deadline work, relative to the beginning
+  // of the current interarrival period.
+  zx_duration_t relative_deadline;
+
+  // The worst case interarrival period of the deadline work.
+  zx_duration_t period;
+} zx_sched_deadline_params_t;
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SCHEDULER_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/smc.h b/arch/x64/sysroot/include/zircon/syscalls/smc.h
index 5c8f9ba..93f1761 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/smc.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/smc.h
@@ -2,37 +2,46 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SMC_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SMC_H_
 
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
+// Silicon Partner.
+#define ARM_SMC_SERVICE_CALL_NUM_SIP_SERVICE_BASE 0x02
+#define ARM_SMC_SERVICE_CALL_NUM_SIP_SERVICE_LENGTH 0x01
 #define ARM_SMC_SERVICE_CALL_NUM_TRUSTED_OS_BASE 0x32
 #define ARM_SMC_SERVICE_CALL_NUM_TRUSTED_OS_LENGTH 0xE
 #define ARM_SMC_SERVICE_CALL_NUM_MAX 0x3F
 #define ARM_SMC_SERVICE_CALL_NUM_MASK 0x3F
 #define ARM_SMC_SERVICE_CALL_NUM_SHIFT 24
 #define ARM_SMC_GET_SERVICE_CALL_NUM_FROM_FUNC_ID(func_id) \
-    (((func_id) >> ARM_SMC_SERVICE_CALL_NUM_SHIFT) & ARM_SMC_SERVICE_CALL_NUM_MASK)
+  (((func_id) >> ARM_SMC_SERVICE_CALL_NUM_SHIFT) & ARM_SMC_SERVICE_CALL_NUM_MASK)
 
 typedef struct zx_smc_parameters {
-    uint32_t func_id;
-    uint64_t arg1;
-    uint64_t arg2;
-    uint64_t arg3;
-    uint64_t arg4;
-    uint64_t arg5;
-    uint64_t arg6;
-    uint16_t client_id;
-    uint16_t secure_os_id;
+  uint32_t func_id;
+  uint8_t padding1[4];
+  uint64_t arg1;
+  uint64_t arg2;
+  uint64_t arg3;
+  uint64_t arg4;
+  uint64_t arg5;
+  uint64_t arg6;
+  uint16_t client_id;
+  uint16_t secure_os_id;
+  uint8_t padding2[4];
 } zx_smc_parameters_t;
 
 typedef struct zx_smc_result {
-    uint64_t arg0;
-    uint64_t arg1;
-    uint64_t arg2;
-    uint64_t arg3;
+  uint64_t arg0;
+  uint64_t arg1;
+  uint64_t arg2;
+  uint64_t arg3;
+  uint64_t arg6;  // at least one implementation uses it as a way to return session_id.
 } zx_smc_result_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SMC_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/system.h b/arch/x64/sysroot/include/zircon/syscalls/system.h
index c58de1d..b54d443 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/system.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/system.h
@@ -2,36 +2,43 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
+#define SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
 
 #include <zircon/types.h>
 
 __BEGIN_CDECLS
 
 // Commands used by zx_system_powerctl()
-#define ZX_SYSTEM_POWERCTL_ENABLE_ALL_CPUS              1u
+#define ZX_SYSTEM_POWERCTL_ENABLE_ALL_CPUS 1u
 #define ZX_SYSTEM_POWERCTL_DISABLE_ALL_CPUS_BUT_PRIMARY 2u
-#define ZX_SYSTEM_POWERCTL_ACPI_TRANSITION_S_STATE      3u
-#define ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1              4u
-#define ZX_SYSTEM_POWERCTL_REBOOT                       5u
-#define ZX_SYSTEM_POWERCTL_REBOOT_BOOTLOADER            6u
-#define ZX_SYSTEM_POWERCTL_REBOOT_RECOVERY              7u
-#define ZX_SYSTEM_POWERCTL_SHUTDOWN                     8u
+#define ZX_SYSTEM_POWERCTL_ACPI_TRANSITION_S_STATE 3u
+#define ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1 4u
+#define ZX_SYSTEM_POWERCTL_REBOOT 5u
+#define ZX_SYSTEM_POWERCTL_REBOOT_BOOTLOADER 6u
+#define ZX_SYSTEM_POWERCTL_REBOOT_RECOVERY 7u
+#define ZX_SYSTEM_POWERCTL_SHUTDOWN 8u
 
 typedef struct zx_system_powerctl_arg {
-    union {
-        struct {
-            uint8_t target_s_state; // Value between 1 and 5 indicating which S-state
-            uint8_t sleep_type_a; // Value from ACPI VM (SLP_TYPa)
-            uint8_t sleep_type_b; // Value from ACPI VM (SLP_TYPb)
-        } acpi_transition_s_state;
-        struct {
-            uint32_t power_limit; // PL1 value in milliwatts
-            uint32_t time_window; // PL1 time window in microseconds
-            uint8_t clamp;        // PL1 clamping enable
-            uint8_t enable;       // PL1 enable
-        } x86_power_limit;
+  union {
+    struct {
+      struct {
+        uint8_t target_s_state;  // Value between 1 and 5 indicating which S-state
+        uint8_t sleep_type_a;    // Value from ACPI VM (SLP_TYPa)
+        uint8_t sleep_type_b;    // Value from ACPI VM (SLP_TYPb)
+      } acpi_transition_s_state;
+      uint8_t padding1[9];
     };
+    struct {
+      uint32_t power_limit;  // PL1 value in milliwatts
+      uint32_t time_window;  // PL1 time window in microseconds
+      uint8_t clamp;         // PL1 clamping enable
+      uint8_t enable;        // PL1 enable
+      uint8_t padding2[2];
+    } x86_power_limit;
+  };
 } zx_system_powerctl_arg_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_SYSTEM_H_
diff --git a/arch/x64/sysroot/include/zircon/syscalls/types.h b/arch/x64/sysroot/include/zircon/syscalls/types.h
index a5a69c8..b7910f2 100644
--- a/arch/x64/sysroot/include/zircon/syscalls/types.h
+++ b/arch/x64/sysroot/include/zircon/syscalls/types.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
+#define SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
 
 #include <zircon/compiler.h>
 
@@ -20,3 +21,5 @@
 typedef struct zx_smc_result zx_smc_result_t;
 
 __END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_SYSCALLS_TYPES_H_
diff --git a/arch/x64/sysroot/include/zircon/testonly-syscalls.h b/arch/x64/sysroot/include/zircon/testonly-syscalls.h
new file mode 100644
index 0000000..d994d86
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/testonly-syscalls.h
@@ -0,0 +1,30 @@
+// Copyright 2020 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.
+
+#ifndef SYSROOT_ZIRCON_TESTONLY_SYSCALLS_H_
+#define SYSROOT_ZIRCON_TESTONLY_SYSCALLS_H_
+
+#include <zircon/syscalls.h>
+
+__BEGIN_CDECLS
+
+// Make sure this matches <zircon/syscalls.h>.
+#define _ZX_SYSCALL_DECL(name, type, attrs, nargs, arglist, prototype) \
+  extern attrs type zx_##name prototype;                               \
+  extern attrs type _zx_##name prototype;
+
+#ifdef __clang__
+#define _ZX_SYSCALL_ANNO(attr) __attribute__((attr))
+#else
+#define _ZX_SYSCALL_ANNO(attr)  // Nothing for compilers without the support.
+#endif
+
+#include <zircon/syscalls/internal/testonly-cdecls.inc>
+
+#undef _ZX_SYSCALL_ANNO
+#undef _ZX_SYSCALL_DECL
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_ONLY_SYSCALLS_H_
diff --git a/arch/x64/sysroot/include/zircon/threads.h b/arch/x64/sysroot/include/zircon/threads.h
index 937a9f9..2cfdd7e 100644
--- a/arch/x64/sysroot/include/zircon/threads.h
+++ b/arch/x64/sysroot/include/zircon/threads.h
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_THREADS_H_
+#define SYSROOT_ZIRCON_THREADS_H_
 
 #include <threads.h>
 #include <zircon/compiler.h>
@@ -19,19 +20,37 @@
 
 // Converts a threads.h-style status value to an |zx_status_t|.
 static inline zx_status_t __PURE thrd_status_to_zx_status(int thrd_status) {
-    switch (thrd_status) {
+  switch (thrd_status) {
     case thrd_success:
-        return ZX_OK;
+      return ZX_OK;
     case thrd_nomem:
-        return ZX_ERR_NO_MEMORY;
+      return ZX_ERR_NO_MEMORY;
     case thrd_timedout:
-        return ZX_ERR_TIMED_OUT;
+      return ZX_ERR_TIMED_OUT;
     case thrd_busy:
-        return ZX_ERR_SHOULD_WAIT;
+      return ZX_ERR_SHOULD_WAIT;
     default:
     case thrd_error:
-        return ZX_ERR_INTERNAL;
-    }
+      return ZX_ERR_INTERNAL;
+  }
 }
 
 __END_CDECLS
+
+#ifdef __cplusplus
+
+#if __has_include(<thread>)
+
+#include <thread>
+
+// Get the zx_handle_t corresponding to the std::thread::native_handle() value.
+// See `thrd_get_zx_handle` (above) for constraints on the returned handle.
+// Using this API avoids any assumptions about std::thread::native_handle_type
+// corresponding exactly to thrd_t or any other particular type.
+zx_handle_t native_thread_get_zx_handle(std::thread::native_handle_type);
+
+#endif  // __has_include(<thread>)
+
+#endif  // __cplusplus
+
+#endif  // SYSROOT_ZIRCON_THREADS_H_
diff --git a/arch/x64/sysroot/include/zircon/time.h b/arch/x64/sysroot/include/zircon/time.h
index a075d89..33f5452 100644
--- a/arch/x64/sysroot/include/zircon/time.h
+++ b/arch/x64/sysroot/include/zircon/time.h
@@ -1,96 +1,184 @@
-// Copyright 2018 The Fuchsia Authors
-//
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file or at
-// https://opensource.org/licenses/MIT
+// 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.
 
-#pragma once
+#ifndef SYSROOT_ZIRCON_TIME_H_
+#define SYSROOT_ZIRCON_TIME_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
-#include <zircon/types.h>
 
-// These functions perform overflow-safe time arithmetic, clamping to ZX_TIME_INFINITE in case of
-// overflow and ZX_TIME_INFINITE_PAST in case of underflow.
+#if __has_include(<time.h>)
+#include <time.h>
+#endif
+
+__BEGIN_CDECLS
+
+// absolute time in nanoseconds (generally with respect to the monotonic clock)
+typedef int64_t zx_time_t;
+// a duration in nanoseconds
+typedef int64_t zx_duration_t;
+// a duration in hardware ticks
+typedef int64_t zx_ticks_t;
+
+#define ZX_TIME_INFINITE INT64_MAX
+#define ZX_TIME_INFINITE_PAST INT64_MIN
+
+// These functions perform overflow-safe time arithmetic and unit conversion, clamping to
+// ZX_TIME_INFINITE in case of overflow and ZX_TIME_INFINITE_PAST in case of underflow.
 //
 // C++ code should use zx::time and zx::duration instead.
 //
-// The naming scheme is zx_<first argument>_<operation>_<second argument>.
+// For arithmetic the naming scheme is:
+//     zx_<first argument>_<operation>_<second argument>
 //
-// TODO(maniscalco): Consider expanding the set of operations to include division, modulo, unit
-// conversion, and floating point math.
+// For unit conversion the naming scheme is:
+//     zx_duration_from_<unit of argument>
+//
+// TODO(maniscalco): Consider expanding the set of operations to include division, modulo, and
+// floating point math.
 
 __CONSTEXPR static inline zx_time_t zx_time_add_duration(zx_time_t time, zx_duration_t duration) {
-    zx_time_t x = 0;
-    if (unlikely(add_overflow(time, duration, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_time_t x = 0;
+  if (unlikely(add_overflow(time, duration, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_time_t zx_time_sub_duration(zx_time_t time, zx_duration_t duration) {
-    zx_time_t x = 0;
-    if (unlikely(sub_overflow(time, duration, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
-
+  zx_time_t x = 0;
+  if (unlikely(sub_overflow(time, duration, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_time_sub_time(zx_time_t time1, zx_time_t time2) {
-    zx_duration_t x = 0;
-    if (unlikely(sub_overflow(time1, time2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(sub_overflow(time1, time2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_add_duration(zx_duration_t dur1,
                                                                  zx_duration_t dur2) {
-    zx_duration_t x = 0;
-    if (unlikely(add_overflow(dur1, dur2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(add_overflow(dur1, dur2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_sub_duration(zx_duration_t dur1,
                                                                  zx_duration_t dur2) {
-    zx_duration_t x = 0;
-    if (unlikely(sub_overflow(dur1, dur2, &x))) {
-        if (x >= 0) {
-            return ZX_TIME_INFINITE_PAST;
-        } else {
-            return ZX_TIME_INFINITE;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(sub_overflow(dur1, dur2, &x))) {
+    if (x >= 0) {
+      return ZX_TIME_INFINITE_PAST;
+    } else {
+      return ZX_TIME_INFINITE;
     }
-    return x;
+  }
+  return x;
 }
 
 __CONSTEXPR static inline zx_duration_t zx_duration_mul_int64(zx_duration_t duration,
                                                               int64_t multiplier) {
-    zx_duration_t x = 0;
-    if (unlikely(mul_overflow(duration, multiplier, &x))) {
-        if ((duration > 0 && multiplier > 0) || (duration < 0 && multiplier < 0)) {
-            return ZX_TIME_INFINITE;
-        } else {
-            return ZX_TIME_INFINITE_PAST;
-        }
+  zx_duration_t x = 0;
+  if (unlikely(mul_overflow(duration, multiplier, &x))) {
+    if ((duration > 0 && multiplier > 0) || (duration < 0 && multiplier < 0)) {
+      return ZX_TIME_INFINITE;
+    } else {
+      return ZX_TIME_INFINITE_PAST;
     }
-    return x;
+  }
+  return x;
 }
+
+__CONSTEXPR static inline int64_t zx_nsec_from_duration(zx_duration_t n) { return n; }
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_nsec(int64_t n) {
+  return zx_duration_mul_int64(1, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_usec(int64_t n) {
+  return zx_duration_mul_int64(1000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_msec(int64_t n) {
+  return zx_duration_mul_int64(1000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_sec(int64_t n) {
+  return zx_duration_mul_int64(1000000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_min(int64_t n) {
+  return zx_duration_mul_int64(60000000000, n);
+}
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_hour(int64_t n) {
+  return zx_duration_mul_int64(3600000000000, n);
+}
+
+#if __has_include(<time.h>)
+
+__CONSTEXPR static inline zx_duration_t zx_duration_from_timespec(struct timespec ts) {
+  return zx_duration_add_duration(zx_duration_from_sec(ts.tv_sec),
+                                  zx_duration_from_nsec(ts.tv_nsec));
+}
+
+__CONSTEXPR static inline struct timespec zx_timespec_from_duration(zx_duration_t duration) {
+  const struct timespec ts = {
+      (time_t)(duration / 1000000000),
+      (long int)(duration % 1000000000),
+  };
+  return ts;
+}
+
+__CONSTEXPR static inline zx_time_t zx_time_from_timespec(struct timespec ts) {
+  // implicit converstion of the return type (zx_time_t and zx_duration_t are the same)
+  return zx_duration_from_timespec(ts);
+}
+
+__CONSTEXPR static inline struct timespec zx_timespec_from_time(zx_time_t time) {
+  // implicit conversion of the parameter type (zx_time_t and zx_duration_t are the same)
+  return zx_timespec_from_duration(time);
+}
+
+#endif  // __has_include(<time.h>)
+
+// Similar to the functions above, these macros perform overflow-safe unit conversion. Prefer to use
+// the functions above instead of these macros.
+#define ZX_NSEC(n) (__ISCONSTANT(n) ? ((zx_duration_t)(1LL * (n))) : (zx_duration_from_nsec(n)))
+#define ZX_USEC(n) (__ISCONSTANT(n) ? ((zx_duration_t)(1000LL * (n))) : (zx_duration_from_usec(n)))
+#define ZX_MSEC(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(1000000LL * (n))) : (zx_duration_from_msec(n)))
+#define ZX_SEC(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(1000000000LL * (n))) : (zx_duration_from_sec(n)))
+#define ZX_MIN(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(60LL * 1000000000LL * (n))) : (zx_duration_from_min(n)))
+#define ZX_HOUR(n) \
+  (__ISCONSTANT(n) ? ((zx_duration_t)(3600LL * 1000000000LL * (n))) : (zx_duration_from_hour(n)))
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_TIME_H_
diff --git a/arch/x64/sysroot/include/zircon/tls.h b/arch/x64/sysroot/include/zircon/tls.h
index acacef1..91a6f43 100644
--- a/arch/x64/sysroot/include/zircon/tls.h
+++ b/arch/x64/sysroot/include/zircon/tls.h
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_TLS_
-#define ZIRCON_TLS_
+#ifndef SYSROOT_ZIRCON_TLS_
+#define SYSROOT_ZIRCON_TLS_
 
 // These constants are part of the C/C++ ABI known to compilers for
 // *-fuchsia targets.  These are offsets from the thread pointer.
 
 // This file must be includable in assembly files.
 
-#if defined(__x86_64__)
+#if defined(__x86_64__) || defined(__i386__)
 
-#define ZX_TLS_STACK_GUARD_OFFSET       0x10
-#define ZX_TLS_UNSAFE_SP_OFFSET         0x18
+#define ZX_TLS_STACK_GUARD_OFFSET 0x10
+#define ZX_TLS_UNSAFE_SP_OFFSET 0x18
 
 #elif defined(__aarch64__)
 
-#define ZX_TLS_STACK_GUARD_OFFSET       (-0x10)
-#define ZX_TLS_UNSAFE_SP_OFFSET         (-0x8)
+#define ZX_TLS_STACK_GUARD_OFFSET (-0x10)
+#define ZX_TLS_UNSAFE_SP_OFFSET (-0x8)
 
 #else
 
@@ -26,4 +26,4 @@
 
 #endif
 
-#endif // ZIRCON_TLS_
+#endif  // SYSROOT_ZIRCON_TLS_
diff --git a/arch/x64/sysroot/include/zircon/types.h b/arch/x64/sysroot/include/zircon/types.h
index 6f93626..5832d95 100644
--- a/arch/x64/sysroot/include/zircon/types.h
+++ b/arch/x64/sysroot/include/zircon/types.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ZIRCON_TYPES_H_
-#define ZIRCON_TYPES_H_
+#ifndef SYSROOT_ZIRCON_TYPES_H_
+#define SYSROOT_ZIRCON_TYPES_H_
 
 #include <stdbool.h>
 #include <stddef.h>
@@ -12,6 +12,7 @@
 #include <zircon/errors.h>
 #include <zircon/limits.h>
 #include <zircon/rights.h>
+#include <zircon/time.h>
 
 #ifndef __cplusplus
 #ifndef _KERNEL
@@ -33,26 +34,12 @@
 
 typedef uint32_t zx_handle_t;
 
-#define ZX_HANDLE_INVALID         ((zx_handle_t)0)
+#define ZX_HANDLE_INVALID           ((zx_handle_t)0)
+#define ZX_HANDLE_FIXED_BITS_MASK   ((zx_handle_t)0x3)
 
 // See errors.h for the values zx_status_t can take.
 typedef int32_t zx_status_t;
 
-// absolute time in nanoseconds (generally with respect to the monotonic clock)
-typedef int64_t zx_time_t;
-// a duration in nanoseconds
-typedef int64_t zx_duration_t;
-// a duration in hardware ticks
-typedef uint64_t zx_ticks_t;
-#define ZX_TIME_INFINITE INT64_MAX
-#define ZX_TIME_INFINITE_PAST INT64_MIN
-#define ZX_NSEC(n) ((zx_duration_t)(1LL * (n)))
-#define ZX_USEC(n) ((zx_duration_t)(1000LL * (n)))
-#define ZX_MSEC(n) ((zx_duration_t)(1000000LL * (n)))
-#define ZX_SEC(n)  ((zx_duration_t)(1000000000LL * (n)))
-#define ZX_MIN(n)  (ZX_SEC(n) * 60LL)
-#define ZX_HOUR(n) (ZX_MIN(n) * 60LL)
-
 // clock ids
 typedef uint32_t zx_clock_t;
 #define ZX_CLOCK_MONOTONIC        ((zx_clock_t)0)
@@ -107,7 +94,7 @@
 #define ZX_USER_SIGNAL_6            ((zx_signals_t)1u << 30)
 #define ZX_USER_SIGNAL_7            ((zx_signals_t)1u << 31)
 
-// Cancelation (handle was closed while waiting with it)
+// Cancellation (handle was closed while waiting with it)
 #define ZX_SIGNAL_HANDLE_CLOSED     __ZX_OBJECT_HANDLE_CLOSED
 
 // Event
@@ -124,22 +111,18 @@
 #define ZX_CHANNEL_WRITABLE         __ZX_OBJECT_WRITABLE
 #define ZX_CHANNEL_PEER_CLOSED      __ZX_OBJECT_PEER_CLOSED
 
+// Clock
+#define ZX_CLOCK_STARTED            __ZX_OBJECT_SIGNAL_4
+
 // Socket
 #define ZX_SOCKET_READABLE            __ZX_OBJECT_READABLE
 #define ZX_SOCKET_WRITABLE            __ZX_OBJECT_WRITABLE
 #define ZX_SOCKET_PEER_CLOSED         __ZX_OBJECT_PEER_CLOSED
 #define ZX_SOCKET_PEER_WRITE_DISABLED __ZX_OBJECT_SIGNAL_4
 #define ZX_SOCKET_WRITE_DISABLED      __ZX_OBJECT_SIGNAL_5
-#define ZX_SOCKET_CONTROL_READABLE    __ZX_OBJECT_SIGNAL_6
-#define ZX_SOCKET_CONTROL_WRITABLE    __ZX_OBJECT_SIGNAL_7
-#define ZX_SOCKET_ACCEPT              __ZX_OBJECT_SIGNAL_8
-#define ZX_SOCKET_SHARE               __ZX_OBJECT_SIGNAL_9
 #define ZX_SOCKET_READ_THRESHOLD      __ZX_OBJECT_SIGNAL_10
 #define ZX_SOCKET_WRITE_THRESHOLD     __ZX_OBJECT_SIGNAL_11
 
-// Deprecated
-#define ZX_SOCKET_READ_DISABLED       ZX_SOCKET_PEER_WRITE_DISABLED
-
 // Fifo
 #define ZX_FIFO_READABLE            __ZX_OBJECT_READABLE
 #define ZX_FIFO_WRITABLE            __ZX_OBJECT_WRITABLE
@@ -149,8 +132,9 @@
 #define ZX_TASK_TERMINATED          __ZX_OBJECT_SIGNALED
 
 // Job
-#define ZX_JOB_NO_PROCESSES         __ZX_OBJECT_SIGNALED
+#define ZX_JOB_TERMINATED           __ZX_OBJECT_SIGNALED
 #define ZX_JOB_NO_JOBS              __ZX_OBJECT_SIGNAL_4
+#define ZX_JOB_NO_PROCESSES         __ZX_OBJECT_SIGNAL_5
 
 // Process
 #define ZX_PROCESS_TERMINATED       __ZX_OBJECT_SIGNALED
@@ -173,28 +157,15 @@
 // global kernel object id.
 // Note: kernel object ids use 63 bits, with the most significant bit being zero.
 // The remaining values (msb==1) are for use by programs and tools that wish to
-// create koids for artificial objets.
+// create koids for artificial objects.
 typedef uint64_t zx_koid_t;
 #define ZX_KOID_INVALID ((uint64_t) 0)
 #define ZX_KOID_KERNEL  ((uint64_t) 1)
-
-// Transaction ID and argument types for zx_channel_call.
-typedef uint32_t zx_txid_t;
-
-typedef struct zx_channel_call_args {
-    const void* wr_bytes;
-    const zx_handle_t* wr_handles;
-    void *rd_bytes;
-    zx_handle_t* rd_handles;
-    uint32_t wr_num_bytes;
-    uint32_t wr_num_handles;
-    uint32_t rd_num_bytes;
-    uint32_t rd_num_handles;
-} zx_channel_call_args_t;
+// The first non-reserved koid. The first 1024 are reserved.
+#define ZX_KOID_FIRST   ((uint64_t) 1024)
 
 // Maximum number of wait items allowed for zx_object_wait_many()
-// TODO(ZX-1349) Re-lower this.
-#define ZX_WAIT_MANY_MAX_ITEMS ((size_t)16)
+#define ZX_WAIT_MANY_MAX_ITEMS ((size_t)64)
 
 // Structure for zx_object_wait_many():
 typedef struct zx_wait_item {
@@ -204,10 +175,11 @@
 } zx_wait_item_t;
 
 // VM Object creation options
-#define ZX_VMO_NON_RESIZABLE             ((uint32_t)1u)
+#define ZX_VMO_RESIZABLE                 ((uint32_t)1u << 1)
 
 // VM Object opcodes
 #define ZX_VMO_OP_COMMIT                 ((uint32_t)1u)
+// Keep value in sync with ZX_VMAR_OP_DECOMMIT.
 #define ZX_VMO_OP_DECOMMIT               ((uint32_t)2u)
 #define ZX_VMO_OP_LOCK                   ((uint32_t)3u)
 #define ZX_VMO_OP_UNLOCK                 ((uint32_t)4u)
@@ -216,10 +188,26 @@
 #define ZX_VMO_OP_CACHE_INVALIDATE       ((uint32_t)7u)
 #define ZX_VMO_OP_CACHE_CLEAN            ((uint32_t)8u)
 #define ZX_VMO_OP_CACHE_CLEAN_INVALIDATE ((uint32_t)9u)
+#define ZX_VMO_OP_ZERO                   ((uint32_t)10u)
+
+// VMAR opcodes
+// Keep value in sync with ZX_VMO_OP_DECOMMIT.
+#define ZX_VMAR_OP_DECOMMIT              ((uint32_t)2u)
+#define ZX_VMAR_OP_MAP_RANGE             ((uint32_t)3u)
+
+// Pager opcodes
+#define ZX_PAGER_OP_FAIL                 ((uint32_t)1u)
 
 // VM Object clone flags
-#define ZX_VMO_CLONE_COPY_ON_WRITE        ((uint32_t)1u << 0)
-#define ZX_VMO_CLONE_NON_RESIZEABLE       ((uint32_t)1u << 1)
+#define ZX_VMO_CHILD_SNAPSHOT             ((uint32_t)1u << 0)
+#define ZX_VMO_CHILD_SNAPSHOT_AT_LEAST_ON_WRITE ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_RESIZABLE            ((uint32_t)1u << 2)
+#define ZX_VMO_CHILD_SLICE                ((uint32_t)1u << 3)
+#define ZX_VMO_CHILD_NO_WRITE             ((uint32_t)1u << 5)
+// Old clone flags that are on the path to deprecation.
+#define ZX_VMO_CLONE_COPY_ON_WRITE        ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_COPY_ON_WRITE        ((uint32_t)1u << 4)
+#define ZX_VMO_CHILD_PRIVATE_PAGER_COPY   ((uint32_t)1u << 4)
 
 typedef uint32_t zx_vm_option_t;
 // Mapping flags to vmar routines
@@ -235,7 +223,33 @@
 #define ZX_VM_CAN_MAP_EXECUTE       ((zx_vm_option_t)(1u << 9))
 #define ZX_VM_MAP_RANGE             ((zx_vm_option_t)(1u << 10))
 #define ZX_VM_REQUIRE_NON_RESIZABLE ((zx_vm_option_t)(1u << 11))
+#define ZX_VM_ALLOW_FAULTS          ((zx_vm_option_t)(1u << 12))
+#define ZX_VM_OFFSET_IS_UPPER_LIMIT ((zx_vm_option_t)(1u << 13))
 
+#define ZX_VM_ALIGN_BASE            24
+#define ZX_VM_ALIGN_1KB             ((zx_vm_option_t)(10u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2KB             ((zx_vm_option_t)(11u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4KB             ((zx_vm_option_t)(12u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_8KB             ((zx_vm_option_t)(13u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_16KB            ((zx_vm_option_t)(14u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_32KB            ((zx_vm_option_t)(15u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_64KB            ((zx_vm_option_t)(16u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_128KB           ((zx_vm_option_t)(17u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_256KB           ((zx_vm_option_t)(18u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_512KB           ((zx_vm_option_t)(19u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_1MB             ((zx_vm_option_t)(20u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2MB             ((zx_vm_option_t)(21u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4MB             ((zx_vm_option_t)(22u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_8MB             ((zx_vm_option_t)(23u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_16MB            ((zx_vm_option_t)(24u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_32MB            ((zx_vm_option_t)(25u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_64MB            ((zx_vm_option_t)(26u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_128MB           ((zx_vm_option_t)(27u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_256MB           ((zx_vm_option_t)(28u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_512MB           ((zx_vm_option_t)(29u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_1GB             ((zx_vm_option_t)(30u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_2GB             ((zx_vm_option_t)(31u << ZX_VM_ALIGN_BASE))
+#define ZX_VM_ALIGN_4GB             ((zx_vm_option_t)(32u << ZX_VM_ALIGN_BASE))
 
 // virtual address
 typedef uintptr_t zx_vaddr_t;
@@ -250,14 +264,22 @@
 // offset
 typedef uint64_t zx_off_t;
 
+// vectorized I/O
+typedef struct zx_iovec {
+  void* buffer;
+  size_t capacity;
+} zx_iovec_t;
+
 // Maximum string length for kernel names (process name, thread name, etc)
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
 #define ZX_MAX_NAME_LEN              ((size_t)32u)
 
 // Buffer size limits on the cprng syscalls
 #define ZX_CPRNG_DRAW_MAX_LEN        ((size_t)256u)
 #define ZX_CPRNG_ADD_ENTROPY_MAX_LEN ((size_t)256u)
 
-// interrupt bind flags
+// interrupt_create flags
 #define ZX_INTERRUPT_REMAP_IRQ       ((uint32_t)0x1u)
 #define ZX_INTERRUPT_MODE_DEFAULT    ((uint32_t)0u << 1)
 #define ZX_INTERRUPT_MODE_EDGE_LOW   ((uint32_t)1u << 1)
@@ -268,35 +290,58 @@
 #define ZX_INTERRUPT_MODE_MASK       ((uint32_t)0xe)
 #define ZX_INTERRUPT_VIRTUAL         ((uint32_t)0x10)
 
+// interrupt_bind flags
+#define ZX_INTERRUPT_BIND            ((uint32_t)0x0u)
+#define ZX_INTERRUPT_UNBIND          ((uint32_t)0x1u)
+
 // Preallocated virtual interrupt slot, typically used for signaling interrupt threads to exit.
 #define ZX_INTERRUPT_SLOT_USER              ((uint32_t)62u)
 // interrupt wait slots must be in the range 0 - 62 inclusive
 #define ZX_INTERRUPT_MAX_SLOTS              ((uint32_t)62u)
 
+// msi_create flags
+#define ZX_MSI_MODE_MSI_X                   ((uint32_t)0x1u)
+
 // PCI interrupt handles use interrupt slot 0 for the PCI hardware interrupt
 #define ZX_PCI_INTERRUPT_SLOT               ((uint32_t)0u)
 
 // Channel options and limits.
 #define ZX_CHANNEL_READ_MAY_DISCARD         ((uint32_t)1u)
 
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
 #define ZX_CHANNEL_MAX_MSG_BYTES            ((uint32_t)65536u)
 #define ZX_CHANNEL_MAX_MSG_HANDLES          ((uint32_t)64u)
 
+// Fifo limits.
+#define ZX_FIFO_MAX_SIZE_BYTES              ZX_PAGE_SIZE
+
 // Socket options and limits.
-// These options can be passed to zx_socket_shutdown()
+// These options can be passed to zx_socket_shutdown().
 #define ZX_SOCKET_SHUTDOWN_WRITE            ((uint32_t)1u << 0)
 #define ZX_SOCKET_SHUTDOWN_READ             ((uint32_t)1u << 1)
 #define ZX_SOCKET_SHUTDOWN_MASK             (ZX_SOCKET_SHUTDOWN_WRITE | ZX_SOCKET_SHUTDOWN_READ)
 
-// These can be passed to zx_socket_create()
+// These can be passed to zx_socket_create().
 #define ZX_SOCKET_STREAM                    ((uint32_t)0u)
 #define ZX_SOCKET_DATAGRAM                  ((uint32_t)1u << 0)
-#define ZX_SOCKET_HAS_CONTROL               ((uint32_t)1u << 1)
-#define ZX_SOCKET_HAS_ACCEPT                ((uint32_t)1u << 2)
-#define ZX_SOCKET_CREATE_MASK               (ZX_SOCKET_DATAGRAM | ZX_SOCKET_HAS_CONTROL | ZX_SOCKET_HAS_ACCEPT)
+#define ZX_SOCKET_CREATE_MASK               (ZX_SOCKET_DATAGRAM)
 
-// These can be passed to zx_socket_read() and zx_socket_write().
-#define ZX_SOCKET_CONTROL                   ((uint32_t)1u << 2)
+// These can be passed to zx_socket_read().
+#define ZX_SOCKET_PEEK                      ((uint32_t)1u << 3)
+
+// These can be passed to zx_stream_create().
+#define ZX_STREAM_MODE_READ                 ((uint32_t)1u << 0)
+#define ZX_STREAM_MODE_WRITE                ((uint32_t)1u << 1)
+#define ZX_STREAM_CREATE_MASK               (ZX_STREAM_MODE_READ | ZX_STREAM_MODE_WRITE)
+
+// These can be passed to zx_stream_writev().
+#define ZX_STREAM_APPEND                    ((uint32_t)1u << 0)
+
+typedef uint32_t zx_stream_seek_origin_t;
+#define ZX_STREAM_SEEK_ORIGIN_START      ((zx_stream_seek_origin_t)0u)
+#define ZX_STREAM_SEEK_ORIGIN_CURRENT    ((zx_stream_seek_origin_t)1u)
+#define ZX_STREAM_SEEK_ORIGIN_END        ((zx_stream_seek_origin_t)2u)
 
 // Flags which can be used to to control cache policy for APIs which map memory.
 #define ZX_CACHE_POLICY_CACHED              ((uint32_t)0u)
@@ -316,11 +361,15 @@
 #define ZX_TIMER_SLACK_LATE         ((uint32_t)2u)
 
 // Bus Transaction Initiator options.
-#define ZX_BTI_PERM_READ          ((uint32_t)1u << 0)
-#define ZX_BTI_PERM_WRITE         ((uint32_t)1u << 1)
-#define ZX_BTI_PERM_EXECUTE       ((uint32_t)1u << 2)
-#define ZX_BTI_COMPRESS           ((uint32_t)1u << 3)
-#define ZX_BTI_CONTIGUOUS         ((uint32_t)1u << 4)
+#define ZX_BTI_PERM_READ            ((uint32_t)1u << 0)
+#define ZX_BTI_PERM_WRITE           ((uint32_t)1u << 1)
+#define ZX_BTI_PERM_EXECUTE         ((uint32_t)1u << 2)
+#define ZX_BTI_COMPRESS             ((uint32_t)1u << 3)
+#define ZX_BTI_CONTIGUOUS           ((uint32_t)1u << 4)
+
+// Job options.
+// These options can be passed to zx_job_set_critical().
+#define ZX_JOB_CRITICAL_PROCESS_RETCODE_NONZERO     ((uint32_t)1u << 0)
 
 typedef uint32_t zx_obj_type_t;
 
@@ -349,8 +398,25 @@
 #define ZX_OBJ_TYPE_PMT             ((zx_obj_type_t)26u)
 #define ZX_OBJ_TYPE_SUSPEND_TOKEN   ((zx_obj_type_t)27u)
 #define ZX_OBJ_TYPE_PAGER           ((zx_obj_type_t)28u)
-#define ZX_OBJ_TYPE_LAST            ((zx_obj_type_t)29u)
+#define ZX_OBJ_TYPE_EXCEPTION       ((zx_obj_type_t)29u)
+#define ZX_OBJ_TYPE_CLOCK           ((zx_obj_type_t)30u)
+#define ZX_OBJ_TYPE_STREAM          ((zx_obj_type_t)31u)
+#define ZX_OBJ_TYPE_MSI_ALLOCATION  ((zx_obj_type_t)32u)
+#define ZX_OBJ_TYPE_MSI_INTERRUPT   ((zx_obj_type_t)33u)
 
+// System ABI commits to having no more than 64 object types.
+//
+// See zx_info_process_handle_stats_t for an example of a binary interface that
+// depends on having an upper bound for the number of object types.
+#define ZX_OBJ_TYPE_UPPER_BOUND     ((zx_obj_type_t)64u)
+
+typedef uint32_t zx_system_event_type_t;
+#define ZX_SYSTEM_EVENT_OUT_OF_MEMORY               ((zx_system_event_type_t)1u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_CRITICAL    ((zx_system_event_type_t)2u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_WARNING     ((zx_system_event_type_t)3u)
+#define ZX_SYSTEM_EVENT_MEMORY_PRESSURE_NORMAL      ((zx_system_event_type_t)4u)
+
+// Used in channel_read_etc.
 typedef struct zx_handle_info {
     zx_handle_t handle;
     zx_obj_type_t type;
@@ -358,6 +424,45 @@
     uint32_t unused;
 } zx_handle_info_t;
 
+typedef uint32_t zx_handle_op_t;
+
+#define ZX_HANDLE_OP_MOVE           ((zx_handle_op_t)0u)
+#define ZX_HANDLE_OP_DUPLICATE      ((zx_handle_op_t)1u)
+
+// Used in channel_write_etc.
+typedef struct zx_handle_disposition {
+    zx_handle_op_t operation;
+    zx_handle_t handle;
+    zx_obj_type_t type;
+    zx_rights_t rights;
+    zx_status_t result;
+} zx_handle_disposition_t;
+
+// Transaction ID and argument types for zx_channel_call.
+typedef uint32_t zx_txid_t;
+
+typedef struct zx_channel_call_args {
+    const void* wr_bytes;
+    const zx_handle_t* wr_handles;
+    void *rd_bytes;
+    zx_handle_t* rd_handles;
+    uint32_t wr_num_bytes;
+    uint32_t wr_num_handles;
+    uint32_t rd_num_bytes;
+    uint32_t rd_num_handles;
+} zx_channel_call_args_t;
+
+typedef struct zx_channel_call_etc_args {
+    const void* wr_bytes;
+    zx_handle_disposition_t* wr_handles;
+    void *rd_bytes;
+    zx_handle_info_t* rd_handles;
+    uint32_t wr_num_bytes;
+    uint32_t wr_num_handles;
+    uint32_t rd_num_bytes;
+    uint32_t rd_num_handles;
+} zx_channel_call_etc_args_t;
+
 // The ZX_VM_FLAG_* constants are to be deprecated in favor of the ZX_VM_*
 // versions.
 #define ZX_VM_FLAG_PERM_READ              ((uint32_t)1u << 0)
@@ -373,6 +478,24 @@
 #define ZX_VM_FLAG_MAP_RANGE              ((uint32_t)1u << 10)
 #define ZX_VM_FLAG_REQUIRE_NON_RESIZABLE  ((uint32_t)1u << 11)
 
+// CPU masks specifying sets of CPUs.
+//
+// We currently are limited to systems with 512 CPUs or less.
+// TODO(fxbug.dev/7802): This must be manually kept in sync with zx_common.fidl.
+// Eventually (some of) this file will be generated from //zircon/vdso.
+#define ZX_CPU_SET_MAX_CPUS 512
+#define ZX_CPU_SET_BITS_PER_WORD 64
+
+typedef struct zx_cpu_set {
+    // The |N|'th CPU is considered in the CPU set if the bit:
+    //
+    //   cpu_mask[N / ZX_CPU_SET_BITS_PER_WORD]
+    //       & (1 << (N % ZX_CPU_SET_BITS_PER_WORD))
+    //
+    // is set.
+    uint64_t mask[ZX_CPU_SET_MAX_CPUS / ZX_CPU_SET_BITS_PER_WORD];
+} zx_cpu_set_t;
+
 #ifdef __cplusplus
 // We cannot use <stdatomic.h> with C++ code as _Atomic qualifier defined by
 // C11 is not valid in C++11. There is not a single standard name that can
@@ -389,7 +512,8 @@
 typedef atomic_int zx_futex_t;
 #endif
 #endif
+typedef int zx_futex_storage_t;
 
 __END_CDECLS
 
-#endif // ZIRCON_TYPES_H_
+#endif // SYSROOT_ZIRCON_TYPES_H_
diff --git a/arch/x64/sysroot/include/zircon/utc.h b/arch/x64/sysroot/include/zircon/utc.h
new file mode 100644
index 0000000..180fd50
--- /dev/null
+++ b/arch/x64/sysroot/include/zircon/utc.h
@@ -0,0 +1,71 @@
+// Copyright 2019 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.
+
+#ifndef SYSROOT_ZIRCON_UTC_H_
+#define SYSROOT_ZIRCON_UTC_H_
+
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// Accessors for the Zircon-specific UTC clock reference maintained by the
+// language runtime
+
+// zx_utc_reference_get
+//
+// Returns a handle to the currently assigned UTC clock, or ZX_HANDLE_INVALID if
+// no such clock currently exists.  The handle returned has borrow semantics,
+// and should never be directly closed by the user.  If a program wishes to take
+// ownership of the clock, it should do so using |zx_utc_reference_swap|.
+//
+// Thread safety is the responsibility of the user.  In particular, if a clock
+// is fetched by a user using |zx_utc_reference_get|, but then the clock is
+// swapped out using |zx_utc_reference_swap| and the original clock is closed,
+// then the initial clock handle returned is now invalid and could result in a
+// use-after-close situation.  It is the user's responsibility to avoid these
+// situations.
+//
+zx_handle_t _zx_utc_reference_get(void);
+zx_handle_t zx_utc_reference_get(void);
+
+// zx_utc_reference_swap
+//
+// Atomically swap the clock handle provided with the current UTC reference.
+//
+// Upon success, the runtime takes ownership of the handle provided by
+// |new_utc_reference| and returns the previous clock handle to the caller via
+// |prev_utc_reference_out|, or ZX_HANDLE_INVALID if no clock was currently
+// assigned.  The clock returned via swap is now owned by the caller.
+//
+// In the case of failure, the handle passed in by new_utc_reference will be
+// consumed, and the clock held by the runtime will remain unchanged.
+//
+// Clock handles provided to libc via zx_utc_reference_swap must have read rights
+// or they will be rejected.
+//
+// Parameters:
+// new_utc_reference      : A handle to the clock to install as the UTC reference.
+//                          Ownership of this handle will _always_ be consumed
+//                          by zx_utc_reference_swap.
+// prev_utc_reference_out : Either the handle to the previous UTC clock (success
+//                          case), or ZX_HANDLE_INVALID in the case of failure.
+//                          If a valid handle is returned in this out parameter,
+//                          it is _always_ owned by the caller after the call.
+//                          It is illegal to pass NULL for this parameter.
+//
+//
+// Return Values:
+// If a new clock reference is being provided, the return value of
+// |zx_utc_reference_swap| will be the result of a |zx_clock_read| call made to
+// verify the clock.  If ZX_HANDLE_INVALID was passed in order to uninstall a
+// reference clock, the function cannot fail and will always return ZX_OK.
+//
+zx_status_t _zx_utc_reference_swap(zx_handle_t new_utc_reference,
+                                   zx_handle_t* prev_utc_reference_out) __NONNULL((2));
+zx_status_t zx_utc_reference_swap(zx_handle_t new_utc_reference,
+                                  zx_handle_t* prev_utc_reference_out) __NONNULL((2));
+
+__END_CDECLS
+
+#endif  // SYSROOT_ZIRCON_UTC_H_
diff --git a/arch/x64/sysroot/lib/Scrt1.o b/arch/x64/sysroot/lib/Scrt1.o
index ca35323..2a0286c 100644
--- a/arch/x64/sysroot/lib/Scrt1.o
+++ b/arch/x64/sysroot/lib/Scrt1.o
Binary files differ
diff --git a/arch/x64/sysroot/lib/libc.so b/arch/x64/sysroot/lib/libc.so
index 4989bef..f74a2c3 100755
--- a/arch/x64/sysroot/lib/libc.so
+++ b/arch/x64/sysroot/lib/libc.so
Binary files differ
diff --git a/arch/x64/sysroot/lib/libzircon.so b/arch/x64/sysroot/lib/libzircon.so
index 49b147a..26c8f72 100755
--- a/arch/x64/sysroot/lib/libzircon.so
+++ b/arch/x64/sysroot/lib/libzircon.so
Binary files differ
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..aa2e88c
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,13 @@
+# Documentation
+
+## General
+
+For general information about this SDK, see the [root README](../README.md).
+
+
+## Workflows
+
+- [Creating and deploying Fuchsia packages](packages.md)
+- [Communicating with target devices](devices.md)
+- [Creating and consuming logs](logging.md)
+- [Debugging native code](debugger.md)
diff --git a/docs/bootserver.md b/docs/bootserver.md
index a61d09b..d8ebb67 100644
--- a/docs/bootserver.md
+++ b/docs/bootserver.md
@@ -1,22 +1,47 @@
 # Bootserver
 
 The `bootserver` host tool can be used to pave, netboot or boot Fuchsia on a
-target device. This tool is very likely to go away in the short future with
-a replacement being currently implemented.
-
+target device. It serves the needed image artifacts to the device, as well
+as performs validations that the images/device are both valid and
+compatible. Lastly, it signals the device to begin the boot process.
 
 ## x64
 
-To pave and boot on an `x64` target, run:
+### Generic
+
+To pave and boot on a generic `x64` target, run:
 
 ```
-bootserver --efi "<IMAGE_PATH>/local.esp.blk" --fvm "<IMAGE_PATH>/fvm.sparse.blk" --kernc "<IMAGE_PATH>/zircon.vboot" --zircona "<IMAGE_PATH>/fuchsia.zbi" "<IMAGE_PATH>/fuchsia.zbi" -1
+bootserver \
+    --boot "$IMAGES_PATH/fuchsia.zbi" \
+    --bootloader "$IMAGES_PATH/fuchsia.esp.blk" \
+    --fvm "$IMAGES_PATH/obj/build/images/fvm.sparse.blk" \
+    --zircona "$IMAGES_PATH/fuchsia.zbi" \
+    --zirconr "$IMAGES_PATH/zedboot.zbi"
 ```
 
+### Chromebook
+
+To pave and boot on a `chromebook` target, run:
+
+
+```
+bootserver \
+    --boot "$IMAGES_PATH/fuchsia.zbi" \
+    --fvm "$IMAGES_PATH/obj/build/images/fvm.sparse.blk" \
+    --zircona "$IMAGES_PATH/fuchsia.zbi.vboot" \
+    --zirconr "$IMAGES_PATH/zedboot.vboot"
+```
+
+
 ## arm64
 
 To pave and boot on an `arm64` target, run:
 
 ```
-bootserver --fvm "<IMAGE_PATH>/obj/build/images/fvm.sparse.blk" --zircona "<IMAGE_PATH>/fuchsia.zbi" --zirconb "<IMAGE_PATH>/fuchsia.zbi" -1
+bootserver \
+    --boot "$IMAGES_PATH/fuchsia.zbi" \
+    --fvm "$IMAGES_PATH/obj/build/images/fvm.sparse.blk" \
+    --zircona "$IMAGES_PATH/fuchsia.zbi" \
+    --zirconr "$IMAGES_PATH/zedboot.zbi"
 ```
diff --git a/docs/compilation.md b/docs/compilation.md
new file mode 100644
index 0000000..dcf9c71
--- /dev/null
+++ b/docs/compilation.md
@@ -0,0 +1,41 @@
+# Compiling C/C++ code
+
+The present document compiles a list of guidelines, recommendations, and
+expectations around the topic of compiling C and C++ code against the Core SDK.
+
+
+## Sysroot
+
+The Fuchsia sysroot for a given target architecture is available under
+`//arch/<architecture>/sysroot`.
+That directory contains a complete sysroot and may be used with any tool that
+accepts a `--sysroot` flag.
+
+
+## Prebuilts
+
+All prebuilts have C linkage.
+
+### Debug symbols
+
+Debug symbols for all prebuilts are available under `//.build-id`, which follows
+a [standard convention][build-id].
+
+
+## Compilation parameters
+
+- C++ sources are compatible with both C++14 and C++17.
+
+### Warning flags
+
+The following flags are guaranteed to not generate any warning:
+- `-Wall`
+- `-Wextra-semi`
+- `-Wnewline-eof`
+- `-Wshadow`
+
+The following flags may generate warnings:
+- `-Wdeprecated-declarations`
+
+
+[build-id]: https://fedoraproject.org/wiki/Releases/FeatureBuildId#Find_files_by_build_ID
diff --git a/docs/debugger.md b/docs/debugger.md
new file mode 100644
index 0000000..65a4966
--- /dev/null
+++ b/docs/debugger.md
@@ -0,0 +1,45 @@
+# Debugger (zxdb)
+
+Zxdb is a console debugger for native code compiled with DWARF symbols (C, C++
+and Rust). The frontend runs on the host computer and connects to the on-device
+`debug_agent`. This document describes how to set up these processes.
+
+## Running the agent
+
+The `debug_agent` is run on the target device along with the port number that
+it should listen to for incoming client connections. Typically this command
+will be run from a console after [ssh-ing](ssh.md) in to the system:
+
+```
+run fuchsia-pkg://fuchsia.com/debug_agent#meta/debug_agent.cmx --port=2345
+```
+
+## Connecting the client
+
+The `zxdb` client program is run on the host computer. It can be connected to
+the `debug_agent` via the interactive `connect` debugger command or it can
+automatically connect based on a command-line flag. Both IPv4 and IPv6
+addresses are supported (see [device discovery](device_discovery.md) to find
+the address). The port should match the port number passed to the agent.
+
+```
+zxdb -c "[f370::5051:ff:1e53:589a%qemu]:2345"
+```
+
+### Connecting via a script
+
+Scripts may want to automatically launch the agent and client automatically.
+The script should wait for the port to be open on the target system before
+launching the client. Automatic retry is not yet implemented in the client.
+
+To clean up the debug agent gracefully when the client exits, pass the
+`--quit-agent-on-exit` command-line flag to the client.
+
+## Specifying symbol paths
+
+The debugger expects unstripped ELF files to be available on the local host
+system. Symbols on the target are not used. The location where the local build
+stores symbols must be passed to the `zxdb` client.
+
+For more information on how to specify symbol paths, see [set the symbol
+location](/docs/development/debugger/README.md#set-symbol-location)
diff --git a/docs/device_discovery.md b/docs/device_discovery.md
new file mode 100644
index 0000000..3906f3a
--- /dev/null
+++ b/docs/device_discovery.md
@@ -0,0 +1,61 @@
+# `device-finder`
+
+`device-finder` is the command line tool for device discovery. It uses mDNS to
+find Fuchsia devices.
+
+Currently only Linux is supported. For Mac users see the section
+[for Mac Users](#for_mac_users).
+
+## For Linux Users
+
+### Finding all Devices
+
+The simplest way to get all the devices on the network by their address is to
+run
+
+```
+$ ./device-finder list
+192.168.42.156
+```
+
+This will give you the addresses of all Fuchsia devices on the network. If you'd
+like to get their hostnames as well as their addresses, you can include the
+`-full` flag.
+
+### Finding devices by hostname
+
+If you'd like to find your device by its unique hostname (e.g.
+`lunch-feta-stool-woozy`) you can use the `resolve` command:
+
+```
+$ ./device-finder resolve lunch-feta-stool-woozy
+192.168.42.156
+```
+
+### Finding the Interface Connected to the Device
+
+To find the interface connected to the device, include the `-local` flag to
+either the `list` command or the `resolve` command, which will give you the
+address that the Fuchsia device can use to connect to your host.
+
+## For Mac Users
+
+For those on Mac hosts, you can use the included `dns-sd` command to find your
+device. Here's an example command along with the output you should see when a
+device is on your network:
+
+```
+$ dns-sd -B _fuchsia._udp .
+Browsing for _fuchsia._udp
+DATE: ---Fri 14 Dec 2018---
+15:28:21.447  ...STARTING...
+Timestamp     A/R    Flags  if Domain       Service Type   Instance Name
+15:28:21.448  Add        2   7 local.       _fuchsia._udp. quake-agile-lurk-even
+```
+
+Mac does not support the equivalent of a `local` flag as described above in the
+`device-finder` docs.
+
+## For additional help
+
+For additional help using any of the `device-finder` subcommands, run the subcommand with the `-help` flag.
diff --git a/docs/devices.md b/docs/devices.md
new file mode 100644
index 0000000..c28d982
--- /dev/null
+++ b/docs/devices.md
@@ -0,0 +1,29 @@
+# Working with target devices
+
+## Connecting to a device
+
+Fuchsia target devices must be connected to a host device via a network link.
+SSH is the protocol for communications over that link, as described in
+[this document](ssh.md).
+
+### Getting the device address
+
+Getting the Fuchsia device address can be done using mDNS. Methods for device
+discovery are outlined in [this document](device_discovery.md)
+
+## Flashing a device
+
+In order to flash a device, start a [bootserver](bootserver.md) on the host and
+restart the device into its bootloader.
+
+## Installing software onto a device
+
+The unit of installation on Fuchsia is a package.
+For information on how to push packages to a Fuchsia device, see the
+[this document](packages.md).
+
+## Getting logs from a device
+
+In order to retrieve logs from a device, open a shell on the device and run the
+`log_listener` command, which provides various filtering knobs. See
+[this page](logging.md) for more details.
diff --git a/docs/logging.md b/docs/logging.md
new file mode 100644
index 0000000..660e448
--- /dev/null
+++ b/docs/logging.md
@@ -0,0 +1,27 @@
+# Logging
+
+The preferred way to publish logs is to use the `syslog` API, currently
+available for C in `//pkg/syslog`.
+
+The library provides the ability to tag logs so that they can later be filtered
+upon retrieval.
+
+In order to get logs from a device, open a shell on the device as described in
+[this document](ssh.md) and run:
+```
+$ log_listener
+```
+
+To view specifics logs, add a tag specification:
+```
+$ log_listener --tag foobar
+```
+
+## Symbolization
+
+`//tools/symbolize` should be used to symbolize stack traces. It should be
+pointed to the `.build-id` directory at the root of the SDK, where debug symbols
+are hosted:
+```
+tools/symbolize --build-id-dir .build-id
+```
diff --git a/docs/low_level.json b/docs/low_level.json
index 55793d6..4f48575 100644
--- a/docs/low_level.json
+++ b/docs/low_level.json
@@ -1,10 +1,16 @@
 {
   "docs": [
-    "docs/ssh.md", 
-    "docs/bootserver.md", 
-    "docs/packages.md"
-  ], 
-  "name": "low_level", 
-  "root": "docs", 
+    "README.md",
+    "docs/README.md",
+    "docs/bootserver.md",
+    "docs/compilation.md",
+    "docs/debugger.md",
+    "docs/device_discovery.md",
+    "docs/devices.md",
+    "docs/logging.md",
+    "docs/packages.md",
+    "docs/ssh.md"
+  ],
+  "name": "low_level",
   "type": "documentation"
 }
\ No newline at end of file
diff --git a/docs/metadata_schemas.json b/docs/metadata_schemas.json
index 7eaf414..d460e24 100644
--- a/docs/metadata_schemas.json
+++ b/docs/metadata_schemas.json
@@ -1,18 +1,18 @@
 {
   "docs": [
-    "meta/schemas/cc_prebuilt_library.json", 
-    "meta/schemas/cc_source_library.json", 
-    "meta/schemas/common.json", 
-    "meta/schemas/dart_library.json", 
-    "meta/schemas/documentation.json", 
-    "meta/schemas/fidl_library.json", 
-    "meta/schemas/host_tool.json", 
-    "meta/schemas/image.json", 
-    "meta/schemas/loadable_module.json", 
-    "meta/schemas/manifest.json", 
+    "meta/schemas/cc_prebuilt_library.json",
+    "meta/schemas/cc_source_library.json",
+    "meta/schemas/common.json",
+    "meta/schemas/dart_library.json",
+    "meta/schemas/data.json",
+    "meta/schemas/device_profile.json",
+    "meta/schemas/documentation.json",
+    "meta/schemas/fidl_library.json",
+    "meta/schemas/host_tool.json",
+    "meta/schemas/loadable_module.json",
+    "meta/schemas/manifest.json",
     "meta/schemas/sysroot.json"
-  ], 
-  "name": "metadata_schemas", 
-  "root": "docs", 
+  ],
+  "name": "metadata_schemas",
   "type": "documentation"
 }
\ No newline at end of file
diff --git a/docs/musl_license.json b/docs/musl_license.json
new file mode 100644
index 0000000..e2121e9
--- /dev/null
+++ b/docs/musl_license.json
@@ -0,0 +1,7 @@
+{
+  "docs": [
+    "COPYRIGHT.musl"
+  ],
+  "name": "musl_license",
+  "type": "documentation"
+}
\ No newline at end of file
diff --git a/docs/open_source.json b/docs/open_source.json
new file mode 100644
index 0000000..376bda4
--- /dev/null
+++ b/docs/open_source.json
@@ -0,0 +1,9 @@
+{
+  "docs": [
+    "AUTHORS",
+    "LICENSE",
+    "PATENTS"
+  ],
+  "name": "open_source",
+  "type": "documentation"
+}
\ No newline at end of file
diff --git a/docs/packages.md b/docs/packages.md
index eece00a..b230a7f 100644
--- a/docs/packages.md
+++ b/docs/packages.md
@@ -6,60 +6,156 @@
 
 _To be added..._
 
-## Building a package
+## Working with packages
 
-The majority of this process relies on a tool called `pm` which is available
-under `//tools`.
-This document describes the various steps to generate a package. For more
-details about each step, see `pm`'s help messages.
+The majority of these instructions rely on the `pm` tool which is available
+in `//tools`.
 
-The initial step is to create a manifest file `$MANIFEST_FILE` describing the
-contents of the package.
-The manifest is a mere list of lines of the form `destination=source`, where
-`source` is the path to the file on the host machine and `destination` the
-location of that file in the final package.
+This document describes the various steps to build and install a package:
 
-The manifest must include at least one line for the package identity file:
-```
-meta/package=path/to/generated/package.json
-```
-This identity file should contain the following data:
-```
-{
-  "name": "<package name",
-  "version": "<package version>"
-}
-```
-That file can be created using the `pm init` command.
+* [Build a package](#build-package)
+* [Publish a package](#publish-package)
+* [Install a package](#install-package)
+* [Run a component from an installed package](#run-component)
 
-From this point on, we are going to use `$PACKAGE_DIR` to denote a staging dir
-where the package is going to be built.
+For more details about each step, see `pm`'s help messages.
 
-First, we need to initialize the package with:
-```
-pm -o $PACKAGE_DIR -n $PACKAGE_NAME init
-```
+### Build a package {#build-package}
 
-In order to create the package, a signing key is required. You may provide your
-own key or generate one at `$SIGNING_KEY` with:
-```
-pm -o $PACKAGE_DIR -k $SIGNING_KEY genkey
-```
-_TODO: add more details about signing keys, possibly in pm's help_
+To build a package:
 
-The next step is to generate an archive with the package's metadata:
-```
-pm -o $PACKAGE_DIR -k $SIGNING_KEY -m $MANIFEST_FILE build
-```
-This will create the metadata archive at `$PACKAGE_DIR/meta.far`.
+1. Create the package ID file:
 
-Finally, we put it all together to generate the package itself:
-```
-pm -o $PACKAGE_DIR -k $SIGNING_KEY -m $MANIFEST_FILE archive
-```
-This will create the package archive at `$PACKAGE_DIR/$PACKAGE_NAME-0.far`.
-Note that this step needs to be re-run if the contents of the package change.
+   Note: `$PACKAGE_DIR` is a staging directory where the package
+   is built.
 
-## Deploying a package
+   ```
+   pm -o $PACKAGE_DIR -n $PACKAGE_NAME init
+   ```
 
-_To be added..._
+   This generates the package ID file implicitly as
+   `$PACKAGE_DIR/meta/package`.  Set `$PACKAGE_ID_FILE` accordingly
+   for use in subsequent steps:
+
+   ```
+   export PACKAGE_ID_FILE=${PACKAGE_DIR}/meta/package
+   ```
+
+   `$PACKAGE_ID_FILE` will contain the following data:
+
+   ```
+   {
+     "name": "<package name>",
+     "version": "<package version>"
+   }
+   ```
+
+2. Create the manifest file, `$MANIFEST_FILE`, that provides the path to
+   the package ID file.  Each line of a manifest file maps a single file that
+   is contained in the package and is in the form of `destination=source` where:
+
+   * `destination` is the path to the file in the final package
+   * `source` is the path to the file on the host machine
+
+   The manifest file must include at least one line for the package ID file like
+   this:
+
+   ```
+   meta/package=<package ID file>
+   ```
+
+3. Generate the package metadata archive:
+
+   ```
+   pm -o $PACKAGE_DIR -m $MANIFEST_FILE build
+   ```
+
+   This creates the metadata archive at `$PACKAGE_DIR/meta.far`.
+
+4. Create the package archive `$PACKAGE_ARCHIVE`:
+
+   ```
+   pm -o $PACKAGE_DIR -m $MANIFEST_FILE archive
+   ```
+
+   This command creates the package archive implicitly as
+   `$PACKAGE_DIR/$PACKAGE_NAME-0.far`.  Set `$PACKAGE_ARCHIVE` accordingly
+   for use in subsequent steps:
+
+   ```
+   export PACKAGE_ARCHIVE=${PACKAGE_DIR}/${PACKAGE_NAME}-0.far
+   ```
+
+   If the contents of the package change, you need to re-run the
+   `pm -o $PACKAGE_DIR -m $MANIFEST_FILE archive` command.
+
+You have successfully built a package. You are now ready to publish the package.
+
+### Publish a package {#publish-package}
+
+To publish a package:
+
+1. Initialize a directory, `$REPO`, that serves as a packages repository:
+
+   ```
+   pm newrepo -repo $REPO
+   ```
+
+   This creates a directory structure named `$REPO` that is ready for
+   publishing packages.
+
+2. Publish packages to the repository `$REPO`:
+
+   ```
+   pm publish -a -r $REPO -f $PACKAGE_ARCHIVE
+   ```
+
+   `pm publish` parses `$PACKAGE_ARCHIVE` and publishes the package in the
+   provided `$REPO` directory. If you run this command multiple times with
+   different package archives, `pm publish` publishes the packages to the same
+   repository. New versions of a same package can be published using the same
+   command.
+
+You have successfully published a package. You are now ready to install a
+package.
+
+### Install a package {#install-package}
+
+To install a package:
+
+1. Start the package server:
+
+   ```
+   pm serve -repo $REPO
+   ```
+
+   By default, this starts an amber server on the host machine at port `8083`.
+
+2. (On the target device) Add the new repository as an update source with
+   `amberctl`:
+
+   ```
+   amberctl add_repo_cfg -n $REPO -f http://$HOST_ADDRESS:8083/config.json
+   ```
+
+   If the component is not already on the system, `amberctl` installs the package.
+   If the package already exists, `amberctl` installs any package updates.
+
+You have successfully installed or updated the package. You are now ready to
+run a component from the installed package.
+
+### Run a component from an installed package {#run-component}
+
+To run a component published in a package:
+
+1. (On the target device) Run:
+
+  Note: `$COMPONENT_URI` is in this form
+  `fuchsia-pkg://${REPO}/${PACKAGE_NAME}#meta/<component name>.cmx`.
+
+  ```
+  run $COMPONENT_URI
+  ```
+
+You have successfully run a component from the installed package.
+
diff --git a/docs/ssh.md b/docs/ssh.md
index b884d2a..3426c5b 100644
--- a/docs/ssh.md
+++ b/docs/ssh.md
@@ -1,3 +1,59 @@
 # SSH
 
-_Content to be added soon!_
+SSH is the supported protocol for communication between a Fuchsia target device
+and a host device.
+This document describes how to properly set up an SSH connection between these
+devices.
+
+## Prerequisites
+
+On the host side, a proper SSH distribution is required.
+
+A public/private keypair is also needed.
+It may be generated via the `ssh-keygen` command, or extracted from the running
+SSH agent via `ssh-add -L`.
+
+## Provisioning a device
+
+There are two options for installing the public key onto the target.
+
+### By installing it during paving (preferred)
+
+Follow the instruction for [paving](bootserver.md) the target device, and add an
+extra argument to the `bootserver` call pointing to the public key:
+```
+$ bootserver --authorized-keys $PUBLIC_KEY <other args>
+```
+
+### By modifying the Fuchsia image directly
+
+The `fuchsia.zbi` image may be modified to include the public key using the
+`zbi` tool:
+```
+$ zbi -o $FUCHSIA_DOT_ZBI -e data/ssh/authorized_keys=$PUBLIC_KEY
+```
+
+Note that this method is mainly designed for situations where paving is not
+necessarily an efficient option (e.g. testing on an emulator).
+Use with care.
+
+## Connecting to a device
+
+Provided that the address of the target device is known as `$TARGET_ADDRESS`,
+open a shell on that device with:
+```
+$ ssh -i $PRIVATE_KEY fuchsia@$TARGET_ADDRESS
+```
+
+Note that if you got the key from your SSH agent, or if the key is in a well
+known location (`$SSH_HOME`) under a well known name (`id_*`), you may omit the
+`-i` argument.
+
+Note also that the host keys for a Fuchsia target device are generated at first
+boot, meaning that every time the device gets paved the keys are going to
+change.
+You may want to disable host key checking when connecting to a Fuchsia device to
+avoid running into errors by adding the following flags:
+```
+-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
+```
diff --git a/fidl/fuchsia.bluetooth.gatt/client.fidl b/fidl/fuchsia.bluetooth.gatt/client.fidl
deleted file mode 100644
index fad056b..0000000
--- a/fidl/fuchsia.bluetooth.gatt/client.fidl
+++ /dev/null
@@ -1,120 +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.
-
-library fuchsia.bluetooth.gatt;
-
-using fuchsia.bluetooth;
-
-interface RemoteService {
-  // Returns the characteristics and characteristic descriptors that belong to
-  // this service.
-  1: DiscoverCharacteristics() -> (fuchsia.bluetooth.Status status, vector<Characteristic> characteristics);
-
-  // Reads the value of the characteristic with |id| and returns it in the
-  // reply. If |status| indicates an error |value| will be empty.
-  //
-  // If the characteristic has a long value (i.e. larger than the current MTU)
-  // this method will return only the first (MTU - 1) bytes of the value. Use
-  // ReadLongCharacteristic() to read larger values or starting at a non-zero
-  // offset.
-  2: ReadCharacteristic(uint64 id) -> (fuchsia.bluetooth.Status status, vector<uint8> value);
-
-  // Reads the complete value of a characteristic with the given |id|. This
-  // procedure should be used if the characteristic is known to have a value
-  // that can not be read in a single request.
-  //
-  // Returns up to |max_bytes| octets of the characteristic value starting at
-  // the given |offset|.
-  //
-  // This may return an error if:
-  //   a. |max_bytes| is 0;
-  //   b. The |offset| is invalid;
-  //   c. The characteristic does not have a long value;
-  //   d. The server does not support the long read procedure.
-  3: ReadLongCharacteristic(uint64 id, uint16 offset, uint16 max_bytes) -> (fuchsia.bluetooth.Status status, vector<uint8> value);
-
-  // Writes |value| to the characteristic with |id|. The ATT protocol method is
-  // selected based on the input parameters and properties of the
-  // characteristic:
-  //
-  //   a. If |value| fits within a single ATT request (based on the current MTU)
-  //      and |offset| is 0, the "Write Characteristic Value" procedure will be
-  //      used.
-  //   b. If |value| is value cannot fit within a single ATT request or a
-  //      non-zero |offset| is requested, the "Write Long Characteristic Value"
-  //      procedure will be used.
-  //   c. If the characteristic does not claim to support the selected
-  //      procedure, the request will fail with ErrorCode.NotSupported.
-  4: WriteCharacteristic(uint64 id, uint16 offset, vector<uint8> value) -> (fuchsia.bluetooth.Status status);
-
-  // Writes |value| to the characteristic with |id| without soliciting an
-  // acknowledgement from the peer. This method has no response and its delivery
-  // cannot be confirmed.
-  5: WriteCharacteristicWithoutResponse(uint64 id, vector<uint8> value);
-
-  // Reads the value of the characteristic descriptor with |id| and returns it
-  // in the reply. If |status| indicates an error, |value| can be ignored.
-  //
-  // If the descriptor has a long value (i.e. larger than the current MTU)
-  // this method will return only the first (MTU - 1) bytes of the value. Use
-  // ReadLongDescriptor() to read larger values or starting at a non-zero
-  // offset.
-  6: ReadDescriptor(uint64 id) -> (fuchsia.bluetooth.Status status, vector<uint8> value);
-
-  // Reads the complete value of a characteristic descriptor with the given |id|.
-  // This procedure should be used if the descriptor is known to have a value
-  // that can not be read in a single request.
-  //
-  // Returns up to |max_bytes| octets of the characteristic value starting at
-  // the given |offset|.
-  //
-  // This may return an error if:
-  //   a. |max_bytes| is 0;
-  //   b. The |offset| is invalid;
-  //   c. The server does not support the long read procedure.
-  7: ReadLongDescriptor(uint64 id, uint16 offset, uint16 max_bytes) -> (fuchsia.bluetooth.Status status, vector<uint8> value);
-
-  // Writes |value| to the characteristic descriptor with |id|. This operation
-  // may return an error if:
-  //   a. The size of |value| exceeds the current MTU.
-  //   b. |id| refers to an internally reserved descriptor type (e.g. the Client
-  //      Characteristic Configuration descriptor).
-  8: WriteDescriptor(uint64 id, vector<uint8> value) -> (fuchsia.bluetooth.Status status);
-
-  // Subscribe or unsubscribe to notifications/indications from the characteristic with
-  // the given |id|. Notifications or indications will be enabled if |enable| is
-  // true or disabled if |enable| is false and they have been enabled for this
-  // client.
-  //
-  // Either notifications or indications will be enabled depending on
-  // characteristic properties. Indications will be preferred if they are
-  // supported.
-  //
-  // This operation fails if the characteristic does not have the "notify" or
-  // "indicate" property or does not contain a Client Characteristic
-  // Configuration descriptor.
-  //
-  // On success, the OnCharacteristicValueUpdated event will be sent whenever
-  // the peer sends a notification or indication. The local host will
-  // automically confirm indications.
-  9: NotifyCharacteristic(uint64 id, bool enable) -> (fuchsia.bluetooth.Status status);
-
-  // Events:
-  // Called when a characteristic value notification or indication is received.
-  1001: -> OnCharacteristicValueUpdated(uint64 id, vector<uint8> value);
-};
-
-interface Client {
-  // Enumerates services found on the peer that this Client represents. Results
-  // can be restricted by specifying a list of UUIDs in |uuids|. The returned
-  // ServiceInfo structures will contain only basic information about each
-  // service and the |characteristics| and |includes| fields will be null.
-  //
-  // To further interact with services, clients must obtain a RemoteService
-  // handle by calling ConnectToService().
-  1: ListServices(vector<string>? uuids) -> (fuchsia.bluetooth.Status status, vector<ServiceInfo> services);
-
-  // Connects the RemoteService with the given identifier.
-  2: ConnectToService(uint64 id, request<RemoteService> service);
-};
diff --git a/fidl/fuchsia.bluetooth.gatt/meta.json b/fidl/fuchsia.bluetooth.gatt/meta.json
deleted file mode 100644
index 03eebd2..0000000
--- a/fidl/fuchsia.bluetooth.gatt/meta.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "deps": [
-    "fuchsia.bluetooth"
-  ], 
-  "files": [
-    "fidl/fuchsia.bluetooth.gatt/client.fidl", 
-    "fidl/fuchsia.bluetooth.gatt/server.fidl", 
-    "fidl/fuchsia.bluetooth.gatt/types.fidl"
-  ], 
-  "name": "fuchsia.bluetooth.gatt", 
-  "root": "fidl/fuchsia.bluetooth.gatt", 
-  "sources": [
-    "fidl/fuchsia.bluetooth.gatt/client.fidl", 
-    "fidl/fuchsia.bluetooth.gatt/server.fidl", 
-    "fidl/fuchsia.bluetooth.gatt/types.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.bluetooth.gatt/server.fidl b/fidl/fuchsia.bluetooth.gatt/server.fidl
deleted file mode 100644
index db0599e..0000000
--- a/fidl/fuchsia.bluetooth.gatt/server.fidl
+++ /dev/null
@@ -1,68 +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.
-
-library fuchsia.bluetooth.gatt;
-
-using fuchsia.bluetooth;
-
-// Interface for responding to requests on a local service.
-interface LocalServiceDelegate {
-  // Notifies the delegate when a remote device with |peer_id| enables or
-  // disables notifications or indications on the characteristic with the given
-  // |characteristic_id|.
-  1: OnCharacteristicConfiguration(uint64 characteristic_id, string peer_id,
-                                  bool notify, bool indicate);
-
-  // Called when a remote device issues a request to read the value of the
-  // of the characteristic or descriptor with given identifier. The delegate
-  // must respond to the request by returning the characteristic value. If the
-  // read request resulted in an error it should be returned in |error_code|.
-  // On success, |error_code| should be set to NO_ERROR and a |value| should be
-  // provided.
-  2: OnReadValue(uint64 id, int32 offset) -> (vector<uint8>? value, ErrorCode status);
-
-  // Called when a remote device issues a request to write the value of the
-  // characteristic or descriptor with the given identifier.
-  3: OnWriteValue(uint64 id, uint16 offset, vector<uint8> value) -> (ErrorCode status);
-
-  // Called when a remote device issues a request to write the value of the
-  // characteristic with the given identifier. This can be called on a
-  // characteristic with the WRITE_WITHOUT_RESPONSE property.
-  4: OnWriteWithoutResponse(uint64 id, uint16 offset, vector<uint8> value);
-};
-
-// Interface for communicating with a published service.
-interface LocalService {
-  // Removes the service that this interface instance corresponds to. Does
-  // nothing if the service is already removed.
-  1: RemoveService();
-
-  // Sends a notification carrying the |value| of the characteristic with the
-  // given |characteristic_id| to the device with |peer_id|.
-  //
-  // If |confirm| is true, then this method sends an indication instead. If the
-  // peer fails to confirm the indication, the link between the peer and the
-  // local adapter will be closed.
-  //
-  // This method has no effect if the peer has not enabled notifications or
-  // indications on the requested characteristic.
-  2: NotifyValue(uint64 characteristic_id, string peer_id, vector<uint8> value, bool confirm);
-};
-
-[Discoverable]
-interface Server {
-  // Publishes the given service so that it is available to all remote peers.
-  // A LocalServiceDelegate must be provided over which to receive service requests.
-  //
-  // The caller must assign distinct identifiers to the characteristics and
-  // descriptors listed in |info|. These identifiers will be used in requests
-  // sent to |delegate|.
-  //
-  // |service| can be used to interact with the pubished service. If this
-  // service cannot be published then the handle for |service| will be closed.
-  //
-  // Returns the success or failure status of the call and a unique identifier
-  // that can be used to unregister the service.
-  1: PublishService(ServiceInfo info, LocalServiceDelegate delegate, request<LocalService> service) -> (fuchsia.bluetooth.Status status);
-};
diff --git a/fidl/fuchsia.bluetooth.gatt/types.fidl b/fidl/fuchsia.bluetooth.gatt/types.fidl
deleted file mode 100644
index 894e956..0000000
--- a/fidl/fuchsia.bluetooth.gatt/types.fidl
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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.
-
-library fuchsia.bluetooth.gatt;
-
-// Codes that can be returned in the |protocol_error_code| field of a
-// bluetooth.Error.
-enum ErrorCode {
-  // Indicates that the operation was successful.
-  NO_ERROR = 0;
-
-  // Indicates that the offset used in a read or write request exceeds the
-  // bounds of the value.
-  INVALID_OFFSET = 1;
-
-  // Indicates that the value given in a write request would exceed the maximum
-  // length allowed for the destionation characteristic or descriptor.
-  INVALID_VALUE_LENGTH = 2;
-
-  // Indicates that a read or write request is not permitted.
-  NOT_PERMITTED = 3;
-};
-
-// Represents encryption, authentication, and authorization permissions that can
-// be assigned to a specific access permission.
-struct SecurityRequirements {
-  // If true, the physical link must be encrypted to access this attribute.
-  bool encryption_required;
-
-  // If true, the physical link must be authenticated to access this
-  // attribute.
-  bool authentication_required;
-
-  // If true, the client needs to be authorized before accessing this
-  // attribute.
-  bool authorization_required;
-};
-
-// Specifies the access permissions for a specific attribute value.
-struct AttributePermissions {
-  // Specifies whether or not an attribute has the read permission. If null,
-  // then the attribute value cannot be read. Otherwise, it can be read only if
-  // the permissions specified in the Permissions struct are satisfied.
-  SecurityRequirements? read;
-
-  // Specifies whether or not an attribute has the write permission. If null,
-  // then the attribute value cannot be written. Otherwise, it be written only
-  // if the permissions specified in the Permissions struct are satisfied.
-  SecurityRequirements? write;
-
-  // Specifies the security requirements for a client to subscribe to
-  // notifications or indications on a characteristic. A characteristic's
-  // support for notifications or indiciations is specified using the NOTIFY and
-  // INDICATE characteristic properties. If a local characteristic has one of
-  // these properties then this field can not be null. Otherwise, this field
-  // must be left as null.
-  //
-  // This field is ignored for Descriptors.
-  SecurityRequirements? update;
-};
-
-// Possible values for the characteristic properties bitfield. These specify the
-// GATT procedures that are allowed for a particular characteristic.
-const uint32 kPropertyBroadcast = 1;
-const uint32 kPropertyRead = 2;
-const uint32 kPropertyWriteWithoutResponse = 4;
-const uint32 kPropertyWrite = 8;
-const uint32 kPropertyNotify = 16;
-const uint32 kPropertyIndicate = 32;
-const uint32 kPropertyAuthenticatedSignedWrites = 64;
-const uint32 kPropertyReliableWrite = 256;
-const uint32 kPropertyWritableAuxiliaries= 512;
-
-// Represents a local or remote GATT service.
-struct ServiceInfo {
-  // Uniquely identifies this GATT service. This value will be ignored for local
-  // services. Remote services will always have an identifier.
-  uint64 id;
-
-  // Indicates whether this is a primary or secondary service.
-  bool primary;
-
-  // The 128-bit UUID that identifies the type of this service. This is a string
-  // in the canonical 8-4-4-4-12 format.
-  string type;
-
-  // The characteristics of this service.
-  vector<Characteristic>? characteristics;
-
-  // Ids of other services that are included by this service.
-  vector<uint64>? includes;
-};
-
-// Represents a local or remote GATT characteristic.
-struct Characteristic {
-  // Uniquely identifies this characteristic within a service.
-  uint64 id;
-
-  // The 128-bit UUID that identifies the type of this characteristic. This is a
-  // string in the canonical 8-4-4-4-12 format.
-  string type;
-
-  // The characteristic properties bitfield. See kProperty* above for possible
-  // values.
-  uint32 properties;
-
-  // The attribute permissions of this characteristic. For remote
-  // characteristics, this value will be null until the permissions are
-  // discovered via read and write requests.
-  //
-  // For local characteristics, this value is mandatory.
-  AttributePermissions? permissions;
-
-  // The descriptors of this characteristic.
-  vector<Descriptor>? descriptors;
-};
-
-// Represents a local or remote GATT characteristic descriptor.
-struct Descriptor {
-  // Uniquely identifies this descriptor within the characteristic that it
-  // belongs to.
-  uint64 id;
-
-  // The 128-bit UUID that identifies the type of this descriptor. This is a
-  // string in the canonical 8-4-4-4-12 format.
-  string type;
-
-  // The attribute permissions of this descriptor. For remote
-  // descriptors, this value will be null until the permissions are
-  // discovered via read and write requests.
-  //
-  // For local descriptors, this value is mandatory.
-  AttributePermissions? permissions;
-};
diff --git a/fidl/fuchsia.bluetooth.le/central.fidl b/fidl/fuchsia.bluetooth.le/central.fidl
deleted file mode 100644
index e0756ea..0000000
--- a/fidl/fuchsia.bluetooth.le/central.fidl
+++ /dev/null
@@ -1,59 +0,0 @@
-// 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.
-
-library fuchsia.bluetooth.le;
-
-using fuchsia.bluetooth;
-using fuchsia.bluetooth.gatt;
-
-[Discoverable]
-interface Central {
-  // Returns the list of peripherals that are known to the system from previous scan, connection,
-  // and/or bonding procedures. The results can be filtered based on service UUIDs that are known to
-  // be present on the peripheral.
-  //
-  // This method only returns peripherals (i.e. connectable devices).
-  1: GetPeripherals(vector<string>? service_uuids) -> (vector<RemoteDevice> peripherals);
-
-  // Returns information about a single peripheral that is known to the system from previous scan,
-  // connection, and/or bonding procedures based on its unique identifier. Returns null if
-  // |identifier| is not recognized.
-  2: GetPeripheral(string identifier) -> (RemoteDevice? peripheral);
-
-  // Initiates a scan session for nearby peripherals and broadcasters. Discovered devices will be
-  // reported via CentralDelegate.OnDeviceDiscovered(). If a scan session is already in progress,
-  // |filter| will replace the existing session's filter.
-  //
-  // If |filter| is null or empty (i.e. none of its fields has been populated) then the delegate
-  // will be notified for all discoverable devices that are found. This is not recommended; clients
-  // should generally filter results by at least one of |filter.service_uuids|,
-  // |filter.service_data|, and/or |filter.manufacturer_identifier|.
-  3: StartScan(ScanFilter? filter) -> (fuchsia.bluetooth.Status status);
-
-  // Terminate a previously started scan session.
-  4: StopScan();
-
-  // Creates a connection to the peripheral device with the given identifier.
-  // Returns the status of the operation in |status|.
-  //
-  // On success, |gatt_client| will be bound and can be used for GATT client
-  // role procedures. On failure, |gatt_client| will be closed and |status| will
-  // indicate an error.
-  5: ConnectPeripheral(string identifier, request<fuchsia.bluetooth.gatt.Client> gatt_client) -> (fuchsia.bluetooth.Status status);
-
-  // Disconnects this Central's connection to the peripheral with the given identifier.
-  6: DisconnectPeripheral(string identifier) -> (fuchsia.bluetooth.Status status);
-
-  // Called when the scan state changes, e.g. when a scan session terminates due to a call to
-  // Central.StopScan() or another unexpected condition.
-  101: -> OnScanStateChanged(bool scanning);
-
-  // Called for each peripheral/broadcaster that is discovered during a scan session. |rssi|
-  // contains the received signal strength of the advertising packet that generated this event, if
-  // available.
-  102: -> OnDeviceDiscovered(RemoteDevice device);
-
-  // Called when this Central's connection to a peripheral with the given identifier is terminated.
-  103: -> OnPeripheralDisconnected(string identifier);
-};
diff --git a/fidl/fuchsia.bluetooth.le/meta.json b/fidl/fuchsia.bluetooth.le/meta.json
deleted file mode 100644
index db45f8e..0000000
--- a/fidl/fuchsia.bluetooth.le/meta.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "deps": [
-    "fuchsia.bluetooth", 
-    "fuchsia.bluetooth.gatt"
-  ], 
-  "files": [
-    "fidl/fuchsia.bluetooth.le/central.fidl", 
-    "fidl/fuchsia.bluetooth.le/peripheral.fidl", 
-    "fidl/fuchsia.bluetooth.le/types.fidl"
-  ], 
-  "name": "fuchsia.bluetooth.le", 
-  "root": "fidl/fuchsia.bluetooth.le", 
-  "sources": [
-    "fidl/fuchsia.bluetooth.le/central.fidl", 
-    "fidl/fuchsia.bluetooth.le/peripheral.fidl", 
-    "fidl/fuchsia.bluetooth.le/types.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.bluetooth.le/peripheral.fidl b/fidl/fuchsia.bluetooth.le/peripheral.fidl
deleted file mode 100644
index 0653825..0000000
--- a/fidl/fuchsia.bluetooth.le/peripheral.fidl
+++ /dev/null
@@ -1,56 +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.
-
-library fuchsia.bluetooth.le;
-
-using fuchsia.bluetooth;
-
-[Discoverable]
-interface Peripheral {
-    // Starts sending advertisements based on the given parameters.
-    //   - |advertising_data|: The advertising data that should be included in the payload.
-    //   - |scan_result|: The scan result that will be returned when the advertisement is
-    //                    scanned.  Setting this will mark the advertisement set as scannable.
-    //   - |connectable|: when true, this advertisement will be marked as connectable.
-    //                 NOTE: connections can be made to a GATT server even if this is not set.
-    //   - |interval_ms|: The requested interval to advertise this set at in milliseconds.
-    //                    minimum 20, maximum 10,000,000 (almost 3 hours). A reasonable
-    //                    default is 1 second (1000).
-    //   - |anonymous|: if true, the address of this device will not be included
-    //
-    // If the |tx_power_level| is set in either AdvertisingData, it will be replaced with
-    // the actual TX Power level reported by the adapter, or included in the extended header
-    // of the Advertising PDU to save advertising space.
-    //
-    // If |scan_result| and |advertising_data| are both set, legacy advertising will be used,
-    // which limits the size of the advertising data.
-    //
-    // This request will fail if:
-    //   - The |service_uuids| field of |advertising_data| contains a UUID that does not match
-    //     a GATT service that was previously registered by this application;
-    //   - If the provided advertising data cannot fit within the advertising payload MTU that
-    //     is supported on the current platform and parameters.
-    //   - If |anonymous| advertising is requested but the controller cannot support it.
-    1: StartAdvertising(AdvertisingData advertising_data, AdvertisingData? scan_result,
-                        bool connectable, uint32 interval_ms, bool anonymous)
-           -> (fuchsia.bluetooth.Status status, string? advertisement_id);
-
-    // Stop a an advertising session that was previously started by this application.
-    2: StopAdvertising(string advertisement_id) -> (fuchsia.bluetooth.Status status);
-
-    // Called when a remote central device has connected to a connectable advertisement.
-    // Provides a GATT client handle which can be used to interact with GATT service
-    // on the central device.
-    //
-    // When this is called, the Advertisement will have stopped, and StartAdvertising
-    // should be called again to re-start advertising when the peripheral can accept
-    // another connection.
-    //
-    // Note: Centrals can connect to the local device and interact with the GATT server
-    // from an application without Peripheral.StartAdvertising() being called.
-    101: -> OnCentralConnected(string advertisement_id, RemoteDevice central);
-
-    // Called when a remote central previously connected to this application is disconnected.
-    102: -> OnCentralDisconnected(string device_id);
-};
diff --git a/fidl/fuchsia.bluetooth.le/types.fidl b/fidl/fuchsia.bluetooth.le/types.fidl
deleted file mode 100644
index 88f1dd1..0000000
--- a/fidl/fuchsia.bluetooth.le/types.fidl
+++ /dev/null
@@ -1,96 +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.
-
-library fuchsia.bluetooth.le;
-
-using fuchsia.bluetooth;
-using fuchsia.bluetooth.gatt;
-
-struct ServiceDataEntry {
-  string uuid;
-  vector<uint8> data;
-};
-
-struct ManufacturerSpecificDataEntry {
-  uint16 company_id;
-  vector<uint8> data;
-};
-
-// Represents advertising and scan response data advertised by a broadcaster or peripheral.
-struct AdvertisingData {
-  // Name of the device.
-  string? name;
-
-  // The radio transmission power level reported in the advertisement.
-  fuchsia.bluetooth.Int8? tx_power_level;
-
-  // The appearance reported in the advertisemet.
-  fuchsia.bluetooth.UInt16? appearance;
-
-  // List of service UUIDs reported in the advertisement.
-  vector<string>? service_uuids;
-
-  // Service data included in the advertisement.
-  vector<ServiceDataEntry>? service_data;
-
-  // Manufacturer specific data entries.
-  vector<ManufacturerSpecificDataEntry>? manufacturer_specific_data;
-
-  // Service UUIDs that were solicited in the advertisement. Peripherals can invite centrals that
-  // expose certain services to connect to them using service solicitation.
-  vector<string>? solicited_service_uuids;
-
-  // URIs included in the advertising packet.
-  // These are full URIs (they are encoded/decoded automatically)
-  vector<string>? uris;
-};
-
-// Represents a remote Bluetooth Low Energy device. A RemoteDevice can represent a central,
-// broadcaster, or peripheral based on the API from which it was received.
-struct RemoteDevice {
-  // Identifier that uniquely identifies this device on the current system.
-  string identifier;
-
-  // Whether or not this device is connectable. Non-connectable devices are typically acting in the
-  // LE broadcaster role.
-  bool connectable;
-
-  // The last known RSSI of this device, if known.
-  fuchsia.bluetooth.Int8? rssi;
-
-  // Advertising data broadcast by this device if this device is a broadcaster or peripheral.
-  AdvertisingData? advertising_data;
-};
-
-// Filter parameters for use during a scan. A discovered peripheral or broadcaster will be reported
-// to applications only if it satisfies all of the provided filter parameters. Null fields will be
-// ignored.
-struct ScanFilter {
-  // Filter based on advertised service UUIDs. A peripheral that advertises at least one of the
-  // entries in |service_uuids| will satisfy this filter.
-  vector<string>? service_uuids;
-
-  // Filter based on service data containing one of the given UUIDs.
-  vector<string>? service_data_uuids;
-
-  // Filter based on a company identifier present in the manufacturer data. If this filter parameter
-  // is set, then the advertising payload must contain manufacturer specific data with the provided
-  // company identifier to satisfy this filter.
-  fuchsia.bluetooth.UInt16? manufacturer_identifier;
-
-  // Filter based on whether or not a device is connectable. For example, a client that is only
-  // interested in peripherals that it can connect to can set this to true. Similarly a client can
-  // scan only for braodcasters by setting this to false.
-  fuchsia.bluetooth.Bool? connectable;
-
-  // Filter results based on a portion of the advertised device name.
-  string? name_substring;
-
-  // Filter results based on the path loss of the radio wave. A device that matches this filter must
-  // satisfy the following:
-  //   1. Radio transmission power level and received signal strength must be available for the path
-  //      loss calculation;
-  //   2. The calculated path loss value must be less than, or equal to, |max_path_loss|.
-  fuchsia.bluetooth.Int8? max_path_loss;
-};
diff --git a/fidl/fuchsia.bluetooth/meta.json b/fidl/fuchsia.bluetooth/meta.json
deleted file mode 100644
index 359eef6..0000000
--- a/fidl/fuchsia.bluetooth/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.bluetooth/status.fidl", 
-    "fidl/fuchsia.bluetooth/nullables.fidl"
-  ], 
-  "name": "fuchsia.bluetooth", 
-  "root": "fidl/fuchsia.bluetooth", 
-  "sources": [
-    "fidl/fuchsia.bluetooth/status.fidl", 
-    "fidl/fuchsia.bluetooth/nullables.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.bluetooth/nullables.fidl b/fidl/fuchsia.bluetooth/nullables.fidl
deleted file mode 100644
index f5bcb42..0000000
--- a/fidl/fuchsia.bluetooth/nullables.fidl
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.
-
-library fuchsia.bluetooth;
-
-// Nullable primitive types:
-
-struct Bool {
-  bool value;
-};
-
-struct Int8 {
-  int8 value;
-};
-
-struct UInt16 {
-  uint16 value;
-};
diff --git a/fidl/fuchsia.bluetooth/status.fidl b/fidl/fuchsia.bluetooth/status.fidl
deleted file mode 100644
index 8a49c31..0000000
--- a/fidl/fuchsia.bluetooth/status.fidl
+++ /dev/null
@@ -1,42 +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.
-
-library fuchsia.bluetooth;
-
-enum ErrorCode {
-  UNKNOWN = 0;
-  FAILED = 1;
-  CANCELED = 2;
-  IN_PROGRESS = 3;
-  TIMED_OUT = 4;
-  NOT_FOUND = 5;
-  NOT_SUPPORTED = 6;
-  BLUETOOTH_NOT_AVAILABLE = 7;
-  BAD_STATE = 8;
-  INVALID_ARGUMENTS = 9;
-  ALREADY = 10;
-  PROTOCOL_ERROR = 11;
-};
-
-// Represents an error result returned from an asynchronous operation.
-struct Error {
-  // Represents a high-level error code. If this is set to ErrorCode.PROTOCOL_ERROR, then
-  // |protocol_error_code| will represent a Bluetooth protocol error code. The specific
-  // protocol that caused the error will be context-specific, e.g. GATT interfaces will
-  // return ATT protocol error codes.
-  ErrorCode error_code;
-
-  // Protocol error code. The value of this field is relevant only if |error_code| is set to
-  // ErrorCode.PROTOCOL_ERROR.
-  uint32 protocol_error_code;
-
-  // Human-readable description of the error.
-  string? description;
-};
-
-// Represents the result of an asynchronous operation.
-struct Status {
-  // |error| will be null if this represents a "success" status, i.e. no error has occurred.
-  Error? error;
-};
diff --git a/fidl/fuchsia.developer.tiles/meta.json b/fidl/fuchsia.developer.tiles/meta.json
deleted file mode 100644
index fec0444..0000000
--- a/fidl/fuchsia.developer.tiles/meta.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "deps": [
-    "fuchsia.math", 
-    "fuchsia.ui.app"
-  ], 
-  "files": [
-    "fidl/fuchsia.developer.tiles/tiles.fidl"
-  ], 
-  "name": "fuchsia.developer.tiles", 
-  "root": "fidl/fuchsia.developer.tiles", 
-  "sources": [
-    "fidl/fuchsia.developer.tiles/tiles.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.developer.tiles/tiles.fidl b/fidl/fuchsia.developer.tiles/tiles.fidl
deleted file mode 100644
index f38b474..0000000
--- a/fidl/fuchsia.developer.tiles/tiles.fidl
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-library fuchsia.developer.tiles;
-
-using fuchsia.math;
-using fuchsia.ui.app;
-
-[Discoverable]
-interface Controller {
-    // Instantiates a component by its URL and adds a tile backed by that component's ViewProvider.
-    // Returns a key for the tile that can be used for resizing or removing the tile, or 0 on failure.
-    1: AddTileFromURL(string url, bool allow_focus, vector<string>? args) -> (uint32 key);
-
-    // Adds a tile backed by a view from the view provider.
-    // Returns a key for the tile that can be used for resizing or removing the tile, or 0 on failure.
-    2: AddTileFromViewProvider(string url, fuchsia.ui.app.ViewProvider provider) -> (uint32 key);
-
-    // Removes the tile with the given key.
-    3: RemoveTile(uint32 key);
-
-    // Returns a list of tiles.
-    5: ListTiles() -> (vector<uint32> keys, vector<string> urls, vector<fuchsia.math.SizeF> sizes, vector<bool> focusabilities);
-};
diff --git a/fidl/fuchsia.fonts/font_provider.fidl b/fidl/fuchsia.fonts/font_provider.fidl
deleted file mode 100644
index 4b08fca..0000000
--- a/fidl/fuchsia.fonts/font_provider.fidl
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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.
-
-library fuchsia.fonts;
-
-using fuchsia.mem;
-
-enum Slant {
-    UPRIGHT = 1;
-    ITALIC = 2;
-    OBLIQUE = 3;
-};
-
-enum FallbackGroup {
-    NONE = 0;
-    SERIF = 1;
-    SANS_SERIF = 2;
-    MONOSPACE = 3;
-    CURSIVE = 4;
-    FANTASY = 5;
-};
-
-// Disables font fallback. The service won't try to search fallback font set if
-// there is no requested font family or if it doesn't contain requested
-// character.
-const uint32 REQUEST_FLAG_NO_FALLBACK = 1;
-
-// Disables approximate style matching. The service will only return font that
-// matches the requested style exactly.
-const uint32 REQUEST_FLAG_EXACT_MATCH = 2;
-
-struct Request {
-    // Desired font family name, e.g. "Roboto". Font family search is
-    // case-insensitive. In case when there is no specified family or the
-    // specified family doesn't have glyph for the requested |character| then
-    // a font from another family may be returned. This behavior can be disabled
-    // using REQUEST_FLAG_NO_FALLBACK.
-    string:128? family;
-
-    // For example, 400 is normal, 700 is bold.
-    uint32 weight = 400;
-
-    // Numeric values matching OS/2 & Windows Metrics usWidthClass table.
-    // https://www.microsoft.com/typography/otspec/os2.htm
-    // For example, 5 is normal.
-    uint32 width = 5;
-
-    Slant slant = UPRIGHT;
-
-    // BCP47 language tags in order of preference. See
-    // https://tools.ietf.org/html/bcp47 .
-    vector<string:35>:8? language;
-
-    // Codepoint for the character that must be present in the returned font or 0.
-    // Caller that specify this field are expected to extract character set from
-    // the result and cache it in order to avoid calling the API more than
-    // necessary.
-    uint32 character = 0;
-
-    // Fallback group preference. Caller can leave this field set to NONE. In
-    // that case the font provider will use fallback group of the specified font
-    // family.
-    FallbackGroup fallback_group = NONE;
-
-    uint32 flags = 0;
-};
-
-struct Response {
-    fuchsia.mem.Buffer buffer;
-
-    // Buffer identifier for the buffer. Responses with the same buffer_id are
-    // guaranteed to contain the same data in the buffer. Clients may use this
-    // value to detect if they already have the font cached in parsed form.
-    uint32 buffer_id;
-
-    // Font index within `buffer`. Used for font formats that may contain more
-    // than one font per file, e.g. TTC (TrueType Collection).
-    uint32 font_index;
-};
-
-struct Style {
-    uint32 weight;
-    uint32 width;
-    Slant slant;
-};
-
-// Information about font family that can be requested using GetFamilyInfo().
-struct FamilyInfo {
-    // Canonical font family name. Note that this may be different from the
-    // value passed to GetFamilyInfo() because GetFamilyInfo() also resolves
-    // font aliases and ignores case. For example GetFamilyInfo("robotoslab")
-    // will FamilyInfo.name = "Robot Slab".
-    string:128 name;
-
-    // Unordered list of all available styles in the family.
-    vector<Style>:300 styles;
-};
-
-[Discoverable]
-interface Provider {
-    // Returns font that matches specified |request|.
-    1: GetFont(Request request) -> (Response? response);
-
-    // Returns information for the specified font family or null if there is
-    // no family with the specified name. This function respects family name
-    // aliases and ignores case, so request for "robotoSLAB" will return
-    // FamilyInfo for "Roboto Slab".
-    2: GetFamilyInfo(string:128 family) -> (FamilyInfo? family_info);
-};
diff --git a/fidl/fuchsia.fonts/meta.json b/fidl/fuchsia.fonts/meta.json
deleted file mode 100644
index f67297b..0000000
--- a/fidl/fuchsia.fonts/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.fonts/font_provider.fidl"
-  ], 
-  "name": "fuchsia.fonts", 
-  "root": "fidl/fuchsia.fonts", 
-  "sources": [
-    "fidl/fuchsia.fonts/font_provider.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.images/encoded_image.fidl b/fidl/fuchsia.images/encoded_image.fidl
deleted file mode 100644
index 18384a6..0000000
--- a/fidl/fuchsia.images/encoded_image.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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.
-
-library fuchsia.images;
-
-struct EncodedImage {
-  // The vmo.
-  handle<vmo> vmo;
-  // The size of the image in the vmo in bytes.
-  uint64 size;
-};
diff --git a/fidl/fuchsia.images/image_info.fidl b/fidl/fuchsia.images/image_info.fidl
deleted file mode 100644
index 865e43e..0000000
--- a/fidl/fuchsia.images/image_info.fidl
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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.
-
-library fuchsia.images;
-
-// Specifies how pixels are represented in the image buffer.
-enum PixelFormat {
-  // BGRA_8
-  //
-  // A 32-bit four-component unsigned integer format.
-  // Byte order: B, G, R, A (little-endian ARGB packed 32-bit word).
-  // Equivalent to Skia |kBGRA_8888_SkColorType| color type.
-  // Equivalent to Zircon |ARGB_8888| pixel format on little-endian arch.
-  BGRA_8 = 0;
-
-  // YUY2
-  //
-  // 4:2:2 (2x down-sampled UV horizontally; full res UV vertically)
-  //
-  // A 32-bit component that contains information for 2 pixels:
-  // Byte order: Y1, U, Y2, V
-  // Unpacks to 2 RGB pixels, where RGB1 = func(Y1, U, V)
-  // and RGB2 = func(Y2, U, V)
-  // Equivalent to YUV422
-  YUY2 = 1;
-
-  // NV12
-  //
-  // 4:2:0 (2x down-sampled UV in both directions)
-  //
-  // Offset 0:
-  // 8 bit per pixel Y plane with bytes YYY.
-  // Offset height * stride:
-  // 8 bit UV data interleaved bytes as UVUVUV.
-  //
-  // Y plane has line stride >= width.
-  //
-  // In this context, both width and height are required to be even.
-  //
-  // The UV data is separated into "lines", with each "line" having same byte
-  // width as a line of Y data, and same "line" stride as Y data's line stride.
-  // The UV data has height / 2 "lines".
-  //
-  // In converting to RGB, the UV data gets up-scaled by 2x in both directions
-  // overall.  This comment is intentionally silent on exactly how UV up-scaling
-  // phase/filtering/signal processing works, as it's a complicated topic that
-  // can vary by implementation, typically trading off speed and quality of the
-  // up-scaling.  See comments in relevant conversion code for approach taken
-  // by any given convert path.  The precise relative phase of the UV data is
-  // not presently conveyed.
-  NV12 = 2;
-
-  // YV12
-  //
-  // Like I420, except with V and U swapped.
-  //
-  // 4:2:0 (2x down-sampled UV in both directions)
-  //
-  // Offset 0:
-  // 8 bit per pixel Y plane with bytes YYY.
-  // Offset height * stride:
-  // 8 bit V data with uv_stride = stride / 2
-  // Offset height * stride + uv_stride * height / 2:
-  // 8 bit U data with uv_stride = stride / 2
-  //
-  // Y plane has line stride >= width.
-  //
-  // Both width and height are required to be even.
-  YV12 = 3;
-};
-
-// Specifies how pixel color information should be interpreted.
-enum ColorSpace {
-  SRGB = 0;
-};
-
-// Specifies how pixels are arranged in memory.
-enum Tiling {
-  // Pixels are packed linearly.
-  // Equivalent to |VK_IMAGE_TILING_LINEAR|.
-  LINEAR = 0;
-
-  // Pixels are packed in a GPU-dependent optimal format.
-  // Equivalent to |VK_IMAGE_TILING_OPTIMAL|.
-  GPU_OPTIMAL = 1;
-};
-
-// Specifies how alpha information should be interpreted.
-enum AlphaFormat {
-  // Image is considered to be opaque.  Alpha channel is ignored.
-  // Blend function is: src.RGB
-  OPAQUE = 0;
-  // Color channels have been premultiplied by alpha.
-  // Blend function is: src.RGB + (dest.RGB * (1 - src.A))
-  PREMULTIPLIED = 1;
-  // Color channels have not been premultiplied by alpha.
-  // Blend function is: (src.RGB * src.A) + (dest.RGB * (1 - src.A))
-  NON_PREMULTIPLIED = 2;
-};
-
-enum Transform {
-  // Pixels are displayed normally.
-  NORMAL = 0;
-
-  // Pixels are mirrored left-right.
-  FLIP_HORIZONTAL = 1;
-
-  // Pixels are flipped vertically.
-  FLIP_VERTICAL = 2;
-
-  // Pixels are flipped vertically and mirrored left-right.
-  FLIP_VERTICAL_AND_HORIZONTAL = 3;
-};
-
-// Information about a graphical image (texture) including its format and size.
-struct ImageInfo {
-  // Specifies if the image should be mirrored before displaying.
-  Transform transform = NORMAL;
-
-  // The width and height of the image in pixels.
-  uint32 width;
-  uint32 height;
-
-  // The number of bytes per row in the image buffer.
-  uint32 stride;
-
-  // The pixel format of the image.
-  PixelFormat pixel_format = BGRA_8;
-
-  // The pixel color space.
-  ColorSpace color_space = SRGB;
-
-  // The pixel arrangement in memory.
-  Tiling tiling = LINEAR;
-
-  // Specifies the interpretion of the alpha channel, if one exists.
-  AlphaFormat alpha_format = OPAQUE;
-};
diff --git a/fidl/fuchsia.images/image_pipe.fidl b/fidl/fuchsia.images/image_pipe.fidl
deleted file mode 100644
index 440be61..0000000
--- a/fidl/fuchsia.images/image_pipe.fidl
+++ /dev/null
@@ -1,121 +0,0 @@
-// 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.
-
-library fuchsia.images;
-
-// ImagePipe is a mechanism for streaming shared images between a producer
-// and a consumer which may be running in different processes.
-//
-// Conceptually, the image pipe maintains a table of image resources supplied
-// by the producer into which graphical content may be stored as well as a
-// presentation queue containing a sequence of images which the producer has
-// asked the consumer to present.
-//
-// The presentation queue is initially empty.
-//
-// Each entry in the presentation queue consists of an image together with a
-// pair of optional synchronization fences:
-// - Acquire fence: signaled by the producer when the image is ready to be consumed
-// - Release fence: signaled by the consumer when the image is free to be freed or
-//   modified by the producer
-//
-// The producer performs the following sequence of steps to present content:
-// - Allocate and add some number of images (often 2 or 3) to the image pipe
-//   to establish a pool using |AddImage()|.
-// - Obtain the next available image from the pool.
-// - Ask the consumer to enqueue an image for presentation and provide fences
-//   using |PresentImage()|.
-// - Start rendering the image.
-// - Signal the image's acquire fence when rendering is complete.
-// - Loop to present more image, listen for signals on release fences to recycle
-//   images back into the pool.
-//
-// The consumer performs the following sequence of steps for each image which
-// is enqueued in the presentation queue:
-// - Await signals on the image's acquire fence.
-// - If the fence wait cannot be satisfied or if some other error is detected,
-//   close the image pipe.
-//   Otherwise, begin presenting the image's content.
-// - Retire the previously presented image (if any) from the presentation queue
-//   and signal its release fence when no longer needed.
-// - Continue presenting the same image until the next one is ready.  Loop.
-//
-// If the producer wants to close the image pipe, it should:
-// - Close its side of the connection.
-// - Wait on all release fences for buffers that it has submitted with
-//   |PresentImage()|.
-// - Proceed with resource cleanup.
-//
-// When the consumer detects the image pipe has closed, it should:
-// - Stop using/presenting any images from the pipe.
-// - Unmap all VMOs associated with the images in the pipe.
-// - Close all handles to the VMOs.
-// - Signal all release fences for presented and queued buffers.
-// - Close all handles to fences.
-// - Close its side of the connection.
-//
-// When either party detects that a fence has been abandoned (remotely closed
-// without being signaled) it should assume that the associated image is in
-// an indeterminate state.  This will typically happen when the other party
-// (or one of its delegates) has crashed.  The safest course of action is to
-// close the image pipe, release all resources which were shared with the
-// other party, and re-establish the connection to recover.
-interface ImagePipe {
-    // Adds an image resource to image pipe.
-    //
-    // The |memory| is the handle of a memory object which contains the image
-    // data.  It is valid to create multiple images backed by the same memory
-    // object; they may even overlap.  Consumers must detect this and handle
-    // it accordingly.  The |offset_bytes| indicates the offset within the
-    // memory object at which the image data begins.  The |size_bytes|
-    // indicates the amount of memory from |memory| that should be utilized.
-    // The type of memory stored in the VMO is |memory_type| (e.g. GPU memory,
-    // host memory).
-    //
-    // The following errors will cause the connection to be closed:
-    // - |image_id| is already registered
-    // - |image_info| represents a format not supported by the consumer
-    // - |memory| is not a handle for a readable VMO
-    // - the image data expected at |offset_bytes| according to the |image_info|
-    //   exceeds the memory object's bounds
-    1: AddImage(uint32 image_id, ImageInfo image_info,
-                handle<vmo> memory, uint64 offset_bytes, uint64 size_bytes, MemoryType memory_type);
-
-    // Removes an image resource from the pipe.
-    //
-    // The |image_id| is detached from the image resource and is free to be
-    // reused to add a new image resource.
-    //
-    // Removing an image from the image pipe does not affect the presentation
-    // queue or the currently presented image.
-    //
-    // The producer must wait for all release fences associated with the image to
-    // be signaled before freeing or modifying the underlying memory object since
-    // the image may still be in use in the presentation queue.
-    //
-    // The following errors will cause the connection to be closed:
-    // - |image_id| does not reference a currently registered image resource
-    2: RemoveImage(uint32 image_id);
-
-    // Enqueues the specified image for presentation by the consumer.
-    //
-    // The |acquire_fences| are a set of fences which must all be signaled by the
-    // producer before the consumer presents the image.
-    // The |release_fences| are set of fences which must all be signaled by the
-    // consumer before it is safe for the producer to free or modify the image.
-    // |presentation_time| specifies the time on or after which the
-    // client would like the enqueued operations should take visible effect
-    // (light up pixels on the screen), expressed in nanoseconds in the
-    // |CLOCK_MONOTONIC| timebase.  Desired presentation times must be
-    // monotonically non-decreasing.
-    //
-    // |presentation_info| returns timing information about the submitted frame
-    // and future frames (see presentation_info.fidl).
-    //
-    // The following errors will cause the connection to be closed:
-    // - |image_id| does not reference a currently registered image resource
-    3: PresentImage(uint32 image_id, uint64 presentation_time,
-                    vector<handle<event>> acquire_fences, vector<handle<event>> release_fences)
-           -> (PresentationInfo presentation_info);
-};
diff --git a/fidl/fuchsia.images/memory_type.fidl b/fidl/fuchsia.images/memory_type.fidl
deleted file mode 100644
index 889271c..0000000
--- a/fidl/fuchsia.images/memory_type.fidl
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-library fuchsia.images;
-
-// Specifies the type of VMO's memory.
-enum MemoryType {
-  // VMO is regular host CPU memory.
-  HOST_MEMORY = 0;
-
-  // VMO can be imported as a VkDeviceMemory by calling VkAllocateMemory with a
-  // VkImportMemoryFuchsiaHandleInfoKHR wrapped in a VkMemoryAllocateInfo.
-  VK_DEVICE_MEMORY = 1;
-};
diff --git a/fidl/fuchsia.images/meta.json b/fidl/fuchsia.images/meta.json
deleted file mode 100644
index 2f3af13..0000000
--- a/fidl/fuchsia.images/meta.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.images/encoded_image.fidl", 
-    "fidl/fuchsia.images/image_info.fidl", 
-    "fidl/fuchsia.images/image_pipe.fidl", 
-    "fidl/fuchsia.images/memory_type.fidl", 
-    "fidl/fuchsia.images/presentation_info.fidl"
-  ], 
-  "name": "fuchsia.images", 
-  "root": "fidl/fuchsia.images", 
-  "sources": [
-    "fidl/fuchsia.images/encoded_image.fidl", 
-    "fidl/fuchsia.images/image_info.fidl", 
-    "fidl/fuchsia.images/image_pipe.fidl", 
-    "fidl/fuchsia.images/memory_type.fidl", 
-    "fidl/fuchsia.images/presentation_info.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.images/presentation_info.fidl b/fidl/fuchsia.images/presentation_info.fidl
deleted file mode 100644
index 8b2f464..0000000
--- a/fidl/fuchsia.images/presentation_info.fidl
+++ /dev/null
@@ -1,27 +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.
-
-library fuchsia.images;
-
-// Information returned by methods such as |ImagePipe.PresentImage()| and
-// |Session.Present()|, when the consumer begins preparing the first frame
-// which includes the presented content.
-struct PresentationInfo {
-  // The actual time at which the enqueued operations are anticipated to take
-  // visible effect, expressed in nanoseconds in the |CLOCK_MONOTONIC|
-  // timebase.
-  //
-  // This value increases monotonically with each new frame, typically in
-  // increments of the |presentation_interval|.
-  uint64 presentation_time;
-
-  // The nominal amount of time which is anticipated to elapse between
-  // successively presented frames, expressed in nanoseconds.  When rendering
-  // to a display, the interval will typically be derived from the display
-  // refresh rate.
-  //
-  // This value is non-zero.  It may vary from time to time, such as when
-  // changing display modes.
-  uint64 presentation_interval;
-};
diff --git a/fidl/fuchsia.io/io.fidl b/fidl/fuchsia.io/io.fidl
deleted file mode 100644
index 7b3b5ba..0000000
--- a/fidl/fuchsia.io/io.fidl
+++ /dev/null
@@ -1,401 +0,0 @@
-// 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.
-
-library fuchsia.io;
-
-using zx;
-
-// Interfaces which may be returned by NodeInfo, an object
-// returned when calling Open or Describe:
-
-// The default protocol, interface information must be acquired some
-// other way.
-struct Service {
-    uint8 reserved;
-};
-
-// The object may be cast to interface 'File'.
-struct FileObject {
-    handle<event>? event;
-};
-
-// The object may be cast to interface 'Directory'.
-struct DirectoryObject {
-    uint8 reserved;
-};
-
-// The object is accompanied by a pipe.
-struct Pipe {
-    handle<socket> socket;
-};
-
-// The object is accompanied by a VMO.
-struct Vmofile {
-    handle<vmo> vmo;
-    uint64 offset;
-    uint64 length;
-};
-
-// The object may be cast to interface 'Device'.
-struct Device {
-    handle<event>? event;
-};
-
-// Describes how the connection to the Object should be handled, as well as
-// how to interpret the optional handle.
-union NodeInfo {
-    Service service;
-    FileObject file;
-    DirectoryObject directory;
-    Pipe pipe;
-    Vmofile vmofile;
-    Device device;
-};
-
-// Can read from target object.
-const uint32 OPEN_RIGHT_READABLE = 0x00000001;
-// Can write to target object.
-const uint32 OPEN_RIGHT_WRITABLE = 0x00000002;
-// Connection can mount/umount filesystem.
-const uint32 OPEN_RIGHT_ADMIN = 0x00000004;
-
-// Create the object if it doesn't exist.
-const uint32 OPEN_FLAG_CREATE = 0x00010000;
-// (with Create) Fail if the object already exists.
-const uint32 OPEN_FLAG_CREATE_IF_ABSENT = 0x00020000;
-// Truncate the object before usage.
-const uint32 OPEN_FLAG_TRUNCATE = 0x00040000;
-// Return an error if the target object is not a directory.
-const uint32 OPEN_FLAG_DIRECTORY = 0x00080000;
-// Seek to the end of the object before all writes.
-const uint32 OPEN_FLAG_APPEND = 0x00100000;
-// If the object is a mount point, open the local directory.
-const uint32 OPEN_FLAG_NO_REMOTE = 0x00200000;
-// Open a reference to the object, not the object itself.
-const uint32 OPEN_FLAG_NODE_REFERENCE = 0x00400000;
-// Requests that an "OnOpen" event is sent, with
-// a non-null NodeInfo (if the open is successful).
-// Implies "OPEN_FLAG_STATUS".
-const uint32 OPEN_FLAG_DESCRIBE = 0x00800000;
-// Requests that an "OnOpen" event is sent.
-const uint32 OPEN_FLAG_STATUS = 0x01000000;
-
-// Node defines the minimal interface for entities which can be accessed in a filesystem.
-[Layout="Simple", FragileBase]
-interface Node {
-    // Create another connection to the same remote object.
-    Clone(uint32 flags, request<Node> object);
-
-    // Terminates connection with object.
-    Close() -> (zx.status s);
-
-    // Returns extra information about the type of the object.
-    // If the |Describe| operation fails, the connection is closed.
-    Describe() -> (NodeInfo info);
-
-    // An event produced eagerly by a fidl server if requested
-    // by open flags.
-    // Indicates the success or failure of the open operation,
-    // and optionally describes the object.
-    // If the status is |ZX_OK| and |OPEN_FLAG_DESCRIBE| was passed
-    // to open, |info| contains descriptive information about
-    // the object (the same as would be returned by |Describe|),
-    // otherwise it is null.
-    -> OnOpen(zx.status s, NodeInfo? info);
-
-    // Synchronizes updates to the node to the underlying media, if it exists.
-    Sync() -> (zx.status s);
-
-    // Acquire information about the node.
-    GetAttr() -> (zx.status s, NodeAttributes attributes);
-
-    // Update information about the node.
-    SetAttr(uint32 flags, NodeAttributes attributes) -> (zx.status s);
-
-    // Deprecated. Only for use with compatibility with devhost.
-    Ioctl(uint32 opcode, uint64 max_out, vector<handle>:MAX_IOCTL_HANDLES handles, vector<uint8>:MAX_BUF in)
-        -> (zx.status s, vector<handle>:MAX_IOCTL_HANDLES handles, vector<uint8>:MAX_BUF out);
-};
-
-// Bits reserved for posix protections. Native fuchsia filesystems
-// are not required to set bits contained within MODE_PROTECTION_MASK,
-// but filesystems that wish to do so may refer to sys/stat.h for their
-// definitions.
-const uint32 MODE_PROTECTION_MASK = 0x00FFF;
-// Bits indicating node type. The canonical mechanism to check
-// for a node type is to take 'mode', bitwise and it with the
-// MODE_TYPE_MASK, and check exact equality against a mode type.
-const uint32 MODE_TYPE_MASK = 0xFF000;
-const uint32 MODE_TYPE_DIRECTORY = 0x04000;
-const uint32 MODE_TYPE_BLOCK_DEVICE = 0x06000;
-const uint32 MODE_TYPE_FILE = 0x08000;
-const uint32 MODE_TYPE_SOCKET = 0x0C000;
-const uint32 MODE_TYPE_SERVICE = 0x10000;
-
-// NodeAttributes defines generic information about a filesystem node.
-struct NodeAttributes {
-    // Protection bits and node type information describe in 'mode'.
-    uint32 mode;
-    // A filesystem-unique ID.
-    uint64 id;
-    // Node size, in bytes.
-    uint64 content_size;
-    // Space needed to store node (possibly larger than size), in bytes.
-    uint64 storage_size;
-    // Hard link count.
-    uint64 link_count;
-    // Time of creation (may be updated manually after creation) in ns since Unix epoch, UTC.
-    uint64 creation_time;
-    // Time of last modification in ns since Unix epoch, UTC.
-    uint64 modification_time;
-};
-
-const uint64 MAX_IOCTL_HANDLES = 2;
-const uint64 MAX_BUF = 8192;
-const uint64 MAX_PATH = 4096;
-const uint64 MAX_FILENAME = 255;
-
-// The fields of 'attributes' which are used to update the Node are indicated
-// by the 'flags' argument.
-const uint32 NODE_ATTRIBUTE_FLAG_CREATION_TIME = 0x00000001;
-const uint32 NODE_ATTRIBUTE_FLAG_MODIFICATION_TIME = 0x00000002;
-
-// Update the Seek offset.
-enum SeekOrigin : uint32 {
-    // Seek from the start of the file.
-    START = 0;
-    // Seek from the current position in the file.
-    CURRENT = 1;
-    // Seek from the end of the file.
-    END = 2;
-};
-
-// VMO access rights.
-const uint32 VMO_FLAG_READ = 0x00000001;
-const uint32 VMO_FLAG_WRITE = 0x00000002;
-const uint32 VMO_FLAG_EXEC = 0x00000004;
-
-// Require a copy-on-write clone of the underlying VMO.
-// The request should fail if the VMO is not cloned.
-// May not be supplied with fuchsia_io_VMO_FLAG_EXACT.
-const uint32 VMO_FLAG_PRIVATE = 0x00010000;
-
-// Require an exact (non-cloned) handle to the underlying VMO.
-// The request should fail if a handle to the exact VMO
-// is not returned.
-// May not be supplied with VMO_FLAG_PRIVATE.
-const uint32 VMO_FLAG_EXACT = 0x00020000;
-
-// File defines the interface of a node which contains a flat layout of data.
-[Layout = "Simple"]
-interface File : Node {
-    // Read 'count' bytes at the seek offset.
-    // The seek offset is moved forward by the number of bytes read.
-    Read(uint64 count) -> (zx.status s, vector<uint8>:MAX_BUF data);
-
-    // Read 'count' bytes at the provided offset.
-    // Does not affect the seek offset.
-    ReadAt(uint64 count, uint64 offset) -> (zx.status s, vector<uint8>:MAX_BUF data);
-
-    // Write data at the seek offset.
-    // The seek offset is moved forward by the number of bytes written.
-    Write(vector<uint8>:MAX_BUF data) -> (zx.status s, uint64 actual);
-
-    // Write data to the provided offset.
-    // Does not affect the seek offset.
-    WriteAt(vector<uint8>:MAX_BUF data, uint64 offset) -> (zx.status s, uint64 actual);
-
-    Seek(int64 offset, SeekOrigin start) -> (zx.status s, uint64 offset);
-
-    // Shrink the file size to 'length' bytes.
-    Truncate(uint64 length) -> (zx.status s);
-
-    // Acquire the Directory::Open rights and flags used to access this file.
-    GetFlags() -> (zx.status s, uint32 flags);
-
-    // Change the Directory::Open flags used to access the file.
-    // Supported flags which can be turned on / off:
-    // - OPEN_FLAG_APPEND
-    SetFlags(uint32 flags) -> (zx.status s);
-
-    // Acquire a VMO representing this file, if there is one, with the
-    // requested access rights.
-    GetVmo(uint32 flags) -> (zx.status s, handle<vmo>? vmo);
-};
-
-// Dirent type information associated with the results of ReadDirents.
-const uint8 DIRENT_TYPE_UNKNOWN = 0;
-const uint8 DIRENT_TYPE_DIRECTORY = 4;
-const uint8 DIRENT_TYPE_BLOCK_DEVICE = 6;
-const uint8 DIRENT_TYPE_FILE = 8;
-const uint8 DIRENT_TYPE_SOCKET = 12;
-const uint8 DIRENT_TYPE_SERVICE = 16;
-
-// Nodes which do not have ino values should return this value
-// from Readdir and GetAttr.
-const uint64 INO_UNKNOWN = 0xFFFFFFFFFFFFFFFF;
-
-// Indicates the directory being watched has been deleted.
-const uint8 WATCH_EVENT_DELETED = 0;
-// Indicates a node has been created (either new or moved) into a directory.
-const uint8 WATCH_EVENT_ADDED = 1;
-// Identifies a node has been removed (either deleted or moved) from the directory.
-const uint8 WATCH_EVENT_REMOVED = 2;
-// Identifies a node already existed in the directory when watching started.
-const uint8 WATCH_EVENT_EXISTING = 3;
-// Identifies that no more WATCH_EVENT_EXISTING events will be sent.
-const uint8 WATCH_EVENT_IDLE = 4;
-
-// The following are bitmasks corresponding to the "watch events".
-// They may be used as arguments to the Directory Watch method, to
-// specify which events should receive notifications.
-const uint32 WATCH_MASK_DELETED = 0x00000001;
-const uint32 WATCH_MASK_ADDED = 0x00000002;
-const uint32 WATCH_MASK_REMOVED = 0x00000004;
-const uint32 WATCH_MASK_EXISTING = 0x00000008;
-const uint32 WATCH_MASK_IDLE = 0x00000010;
-const uint32 WATCH_MASK_ALL = 0x0000001F;
-
-// WARNING(ZX-2645): Unused.
-//
-// WatchedEvent describes events returned from a DirectoryWatcher.
-struct WatchedEvent {
-    uint8 event;
-    uint8 len;
-    vector<uint8>:MAX_FILENAME name;
-};
-
-// WARNING(ZX-2645): Unused.
-//
-// DirectoryWatcher transmits messages from a filesystem server
-// about events happening in the filesystem. Clients can register
-// new watchers using the Directory "Watch" method, where they can
-// filter which events they want to receive notifications for.
-[Layout = "Simple"]
-interface DirectoryWatcher {
-    // TODO(smklein): Convert this to a vector of WatchedEvents, when possible.
-    OnEvent(vector<uint8>:MAX_BUF events);
-};
-
-// Directory defines a node which is capable of containing other Objects.
-[Layout = "Simple", FragileBase]
-interface Directory : Node {
-    // Open a new object relative to this directory object.
-    Open(uint32 flags, uint32 mode, string:MAX_PATH path, request<Node> object);
-
-    // Remove an object relative to this directory object.
-    Unlink(string:MAX_PATH path) -> (zx.status s);
-
-    // Reads a collection of variably sized dirents into a buffer.
-    // The number of dirents in a directory may be very large: akin to
-    // calling read multiple times on a file, directories have a seek
-    // offset which is updated on subsequent calls to ReadDirents.
-    //
-    // These dirents are of the form:
-    // struct dirent {
-    //   // Describes the inode of the entry.
-    //   uint64 ino;
-    //   // Describes the length of the dirent name.
-    //   uint8 size;
-    //   // Describes the type of the entry. Aligned with the
-    //   // POSIX d_type values. Use DIRENT_TYPE_* constants.
-    //   uint8 type;
-    //   // Unterminated name of entry.
-    //   char name[0];
-    // }
-    ReadDirents(uint64 max_bytes) -> (zx.status s, vector<uint8>:MAX_BUF dirents);
-
-    // Reset the directory seek offset.
-    Rewind() -> (zx.status s);
-
-    // Acquire a token to a Directory which can be used to identify
-    // access to it at a later point in time.
-    GetToken() -> (zx.status s, handle? token);
-
-    // Within the directory, rename an object named src to the name dst, in
-    // a directory represented by token.
-    Rename(string:MAX_PATH src, handle dst_parent_token, string:MAX_PATH dst) -> (zx.status s);
-
-    // Within the directory, create a link to an object named src by the name
-    // dst, within a directory represented by token.
-    Link(string:MAX_PATH src, handle dst_parent_token, string:MAX_PATH dst) -> (zx.status s);
-
-    // Watches a directory, receiving events of added messages on the
-    // watcher request channel.
-    //
-    // The "watcher" handle will send messages of the form:
-    // struct {
-    //   uint8 event;
-    //   uint8 len;
-    //   char name[];
-    // };
-    // Where names are NOT null-terminated.
-    //
-    // This API is unstable; in the future, watcher will be a "DirectoryWatcher" client.
-    //
-    // Mask specifies a bitmask of events to observe.
-    // Options must be zero; it is reserved.
-    Watch(uint32 mask, uint32 options, handle<channel> watcher) -> (zx.status s);
-};
-
-const uint32 MOUNT_CREATE_FLAG_REPLACE = 0x00000001;
-
-const uint64 MAX_FS_NAME_BUFFER = 32;
-
-struct FilesystemInfo {
-    // The number of data bytes which may be stored in a filesystem.
-    uint64 total_bytes;
-    // The number of data bytes which are in use by the filesystem.
-    uint64 used_bytes;
-    // The number of nodes which may be stored in the filesystem.
-    uint64 total_nodes;
-    // The number of nodes used by the filesystem.
-    uint64 used_nodes;
-    // The amount of space which may be allocated from the underlying
-    // volume manager. If unsupported, this will be zero.
-    uint64 free_shared_pool_bytes;
-    // A unique identifier for this filesystem instance. Will not be preserved
-    // across reboots.
-    uint64 fs_id;
-    // The size of a single filesystem block.
-    uint32 block_size;
-    // The maximum length of a filesystem name.
-    uint32 max_filename_size;
-    // A unique identifier for the type of the underlying filesystem.
-    uint32 fs_type;
-    uint32 padding;
-    // TODO(smklein): Replace this field with a string when supported
-    // by the "Simple" interface. At the moment, name is a fixed-size,
-    // null-terminated buffer.
-    array<int8>:MAX_FS_NAME_BUFFER name;
-};
-
-// DirectoryAdmin defines a directory which is capable of handling
-// administrator tasks within the filesystem.
-[Layout = "Simple"]
-interface DirectoryAdmin : Directory {
-    // Mount a channel representing a remote filesystem onto this directory.
-    // All future requests to this node will be forwarded to the remote filesytem.
-    // To re-open a node without forwarding to the remote target, the node
-    // should be opened with OPEN_FLAG_NO_RMOTE.
-    Mount(Directory remote) -> (zx.status s);
-
-    // Atomically create a directory with a provided path, and mount the
-    // remote handle to the newly created directory.
-    MountAndCreate(Directory remote, string:MAX_FILENAME name, uint32 flags) -> (zx.status s);
-
-    // Unmount this filesystem. After this function returns successfully,
-    // all connections to the filesystem will be terminated.
-    Unmount() -> (zx.status s);
-
-    // Detach a node which was previously attached to this directory
-    // with Mount.
-    UnmountNode() -> (zx.status s, Directory? remote);
-
-    // Query the filesystem for filesystem-specific information.
-    QueryFilesystem() -> (zx.status s, FilesystemInfo? info);
-
-    // Acquire the path to the device backing this filesystem, if there is one.
-    GetDevicePath() -> (zx.status s, string:MAX_PATH? path);
-};
diff --git a/fidl/fuchsia.io/meta.json b/fidl/fuchsia.io/meta.json
deleted file mode 100644
index d1eddc4..0000000
--- a/fidl/fuchsia.io/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.io/io.fidl"
-  ], 
-  "name": "fuchsia.io", 
-  "root": "fidl/fuchsia.io", 
-  "sources": [
-    "fidl/fuchsia.io/io.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ldsvc/ldsvc.fidl b/fidl/fuchsia.ldsvc/ldsvc.fidl
deleted file mode 100644
index d0dbc34..0000000
--- a/fidl/fuchsia.ldsvc/ldsvc.fidl
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-library fuchsia.ldsvc;
-
-using zx;
-
-// See //zircon/docs/program_loading.md for a more complete
-// description of this and related process bootstrapping protocols, and
-// for specifics about the default global loader service's
-// interpretation of names, paths, and configurations.
-
-// WARNING: This interface is manually implemented in libldmsg.a. Please
-// update that implementation if you change this protocol.
-
-[Layout = "Simple"]
-interface Loader {
-    // Cleanly shutdown the connection to the Loader service.
-    1: Done();
-
-    // The dynamic linker sends |object_name| and gets back a VMO
-    // handle containing the file.
-    2: LoadObject(string:1024 object_name) -> (zx.status rv, handle<vmo>? object);
-
-    // The program loader sends the script |interpreter_name| from
-    // hashbang and gets back a VMO to execute in place of the script.
-    3: LoadScriptInterpreter(string:1024 interpreter_name) -> (zx.status rv, handle<vmo>? object);
-
-    // The dynamic linker sends a |config| identifying its load
-    // configuration.  This is intended to affect how later
-    // |LoadObject| requests decide what particular implementation
-    // file to supply for a given name.
-    4: Config(string:1024 config) -> (zx.status rv);
-
-    // Obtain a new loader service connection.
-    5: Clone(request<Loader> loader) -> (zx.status rv);
-
-    // The program runtime sends a string naming a |data_sink| and
-    // transfers the sole handle to a VMO containing the |data| it
-    // wants published there.  The |data_sink| string identifies a
-    // type of data, and the VMO's object name can specifically
-    // identify the data set in this VMO.  The client must transfer
-    // the only handle to the VMO (which prevents the VMO being
-    // resized without the receiver's knowledge), but it might still
-    // have the VMO mapped in and continue to write data to it.  Code
-    // instrumentation runtimes use this to deliver large binary trace
-    // results.
-    //
-    // This is intended to be a developer-oriented feature and might
-    // not ordinarily be available in production runs.
-    7: DebugPublishDataSink(string:1024 data_sink, handle<vmo> data) -> (zx.status rv);
-
-    // The program runtime names a |config_name| referring to a debug
-    // configuration of some kind and gets back a VMO to read
-    // configuration data from.  The sanitizer runtimes use this to
-    // allow large options text to be stored in a file rather than
-    // passed directly in environment strings.
-    //
-    // This is intended to be a developer-oriented feature and might
-    // not ordinarily be available in production runs.
-    8: DebugLoadConfig(string:1024 config_name) -> (zx.status rv, handle<vmo>? config);
-};
diff --git a/fidl/fuchsia.ldsvc/meta.json b/fidl/fuchsia.ldsvc/meta.json
deleted file mode 100644
index 5d0a840..0000000
--- a/fidl/fuchsia.ldsvc/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.ldsvc/ldsvc.fidl"
-  ], 
-  "name": "fuchsia.ldsvc", 
-  "root": "fidl/fuchsia.ldsvc", 
-  "sources": [
-    "fidl/fuchsia.ldsvc/ldsvc.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.logger/logger.fidl b/fidl/fuchsia.logger/logger.fidl
deleted file mode 100644
index 28744c9..0000000
--- a/fidl/fuchsia.logger/logger.fidl
+++ /dev/null
@@ -1,96 +0,0 @@
-// 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.
-
-library fuchsia.logger;
-
-using zx;
-
-enum LogLevelFilter : int8 {
-    NONE = -1;
-    INFO = 0;
-    WARN = 1;
-    ERROR = 2;
-    FATAL = 3;
-};
-
-// Max tags that can be passed to filter by listener.
-const uint8 MAX_TAGS = 5;
-
-// Max tag length that can be passed to filter by listener.
-const uint8 MAX_TAG_LEN_BYTES = 63;
-
-struct LogFilterOptions {
-    bool filter_by_pid;
-    uint64 pid;
-
-    bool filter_by_tid;
-    uint64 tid;
-
-    // If more than zero, logs would be filtered based on verbosity and
-    // |min_severity| would be ignored.
-    uint8 verbosity;
-
-    LogLevelFilter min_severity;
-
-    // If non-empty, return all messages which contain at least one specified
-    // tag.  If empty, messages will not be filtered by tag.
-    // Passed tags should not be more than |MAX_TAG_LEN_BYTES| bytes in length
-    // and max tags can be |MAX_TAGS|.
-    // Listener would be discarded if the limit is not followed.
-    vector<string>:MAX_TAGS tags;
-};
-
-// Max tags that will be attached to a LogMessage.
-const uint8 MAX_TAGS_PER_LOG_MESSAGE = 5;
-
-struct LogMessage {
-    uint64 pid;
-    uint64 tid;
-    // Nanoseconds since the system was powered on, aka ZX_CLOCK_MONOTONIC.
-    // https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/clock_get.md#supported-clock-ids
-    zx.time time;
-    int32 severity;
-
-    // See //zircon/system/ulib/syslog/include/syslog/wire_format.h. As messages
-    // can be served out of order, this should only be logged if more than last
-    // count.
-    uint32 dropped_logs;
-    vector<string>:MAX_TAGS_PER_LOG_MESSAGE tags;
-    string msg;
-};
-
-// Interface for LogListener to register to listen to logs.
-[Discoverable]
-interface Log {
-    // Listens to new log entries by calling Log() on |log_listener|.
-    // A null |options| indicates no filtering is requested.
-    1: Listen(LogListener log_listener, LogFilterOptions? options);
-
-    // Dumps all cached logs by calling LogMany() followed by Done() on
-    // |log_listener|.
-    // A null |options| indicates no filtering is requested.
-    2: DumpLogs(LogListener log_listener, LogFilterOptions? options);
-};
-
-// Interface to get and listen to socket from syslogger
-[Discoverable]
-interface LogSink {
-    // Client connects to send logs over socket
-    1: Connect(handle<socket> socket);
-};
-
-const uint64 MAX_LOG_MANY_SIZE_BYTES = 16384;
-
-interface LogListener {
-    // Called for single messages.
-    1: Log(LogMessage log);
-
-    // Called when |Log| service is serving cached logs.
-    // Max logs size per call is |MAX_LOG_MANY_SIZE_BYTES| bytes.
-    2: LogMany(vector<LogMessage> log);
-
-    // Called in the case |DumpLogs()| function of |Log| service was called and
-    // all cached logs have been dispatched to this listener.
-    3: Done();
-};
diff --git a/fidl/fuchsia.logger/meta.json b/fidl/fuchsia.logger/meta.json
deleted file mode 100644
index 3f4a950..0000000
--- a/fidl/fuchsia.logger/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.logger/logger.fidl"
-  ], 
-  "name": "fuchsia.logger", 
-  "root": "fidl/fuchsia.logger", 
-  "sources": [
-    "fidl/fuchsia.logger/logger.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.math/math.fidl b/fidl/fuchsia.math/math.fidl
deleted file mode 100644
index b0e7838..0000000
--- a/fidl/fuchsia.math/math.fidl
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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.
-
-library fuchsia.math;
-
-struct Point {
-    int32 x;
-    int32 y;
-};
-
-struct PointF {
-    float32 x;
-    float32 y;
-};
-
-struct Point3F {
-    float32 x;
-    float32 y;
-    float32 z;
-};
-
-struct Size {
-    int32 width;
-    int32 height;
-};
-
-struct SizeF {
-    float32 width;
-    float32 height;
-};
-
-struct Rect {
-    int32 x;
-    int32 y;
-    int32 width;
-    int32 height;
-};
-
-struct RectF {
-    float32 x;
-    float32 y;
-    float32 width;
-    float32 height;
-};
-
-struct RRectF {
-    float32 x;
-    float32 y;
-    float32 width;
-    float32 height;
-    float32 top_left_radius_x;
-    float32 top_left_radius_y;
-    float32 top_right_radius_x;
-    float32 top_right_radius_y;
-    float32 bottom_left_radius_x;
-    float32 bottom_left_radius_y;
-    float32 bottom_right_radius_x;
-    float32 bottom_right_radius_y;
-};
-
-struct Transform {
-    // Row major order.
-    array<float32>:16 matrix;
-};
-
-struct Inset {
-    int32 top;
-    int32 right;
-    int32 bottom;
-    int32 left;
-};
-
-struct InsetF {
-    float32 top;
-    float32 right;
-    float32 bottom;
-    float32 left;
-};
diff --git a/fidl/fuchsia.math/meta.json b/fidl/fuchsia.math/meta.json
deleted file mode 100644
index 277f3a2..0000000
--- a/fidl/fuchsia.math/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.math/math.fidl"
-  ], 
-  "name": "fuchsia.math", 
-  "root": "fidl/fuchsia.math", 
-  "sources": [
-    "fidl/fuchsia.math/math.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.media/audio.fidl b/fidl/fuchsia.media/audio.fidl
deleted file mode 100644
index 46386f9..0000000
--- a/fidl/fuchsia.media/audio.fidl
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-// Ordinal range: 0x0700-0x7ff
-[Discoverable]
-interface Audio {
-    0x0701: CreateAudioRenderer(request<AudioRenderer> audio_renderer_request);
-
-    // Create an AudioCapturer which either captures from the current default
-    // audio input device, or loops-back from the current default audio output
-    // device based on value passed for the the loopback flag.
-    //
-    // TODO(mpuryear): Get rid of the loopback flag ASAP. Routing decisions (and
-    // security surrounding routing decisions) should be much more sophisticated
-    // than this. This is just a placeholder until we have a design in place.
-    // Eventually, I suspect that all of this will move up into the audio policy
-    // manager and application clients will obtain AudioCapturers from and control
-    // through the policy manager.
-    0x0702: CreateAudioCapturer(request<AudioCapturer> audio_capturer_request,
-                                bool loopback);
-
-    // System Gain and Mute
-    // TODO(mpuryear): remove this systemwide setting once device-centric settings
-    // are plumbed into the system UI. Also, device-centric (and certainly
-    // systemwide settings) should be moved out of the accessible-to-all public
-    // audio interface and relocated to a more restrictive interface that is only
-    // accessible by clients with the appropriate privileges (such as system
-    // configuration API, or the governor of audio policy).
-    //
-    // Mirroring device-centric gain and mute stages, Fuchsia's systemwide Gain
-    // and Mute settings are fully independent. Changing the value of one does not
-    // change the value of the other. Both have the ability to silence a system
-    // (or a device, in the case of device Gain/Mute). If Mute is true, or if Gain
-    // is kMutedGain, the system is silenced regardless of the other. Similarly,
-    // one's value does not restrict the other's possible values in any way.
-    //
-    // Sets the system-wide gain in decibels. |db| values are clamped to the range
-    // -160db to 0db, inclusive. This setting is applied to all audio output
-    // devices. Audio input devices are unaffected. System Gain changes do not
-    // affect the System Mute state.
-    0x0703: SetSystemGain(float32 gain_db);
-
-    // Sets/clears the systemwide 'Mute' state for audio output devices. Audio
-    // input devices are unaffected. Changes to the System Mute state do not
-    // affect the value of System Gain.
-    0x0704: SetSystemMute(bool muted);
-
-    // Provides current values for the systemwide Gain and Mute.
-    // When a client connects to Audio, the system enqueues an action (to be
-    // executed once the system regains control) to send this newly-connected
-    // client a callback with the current systemwide Gain|Mute settings. Further,
-    // upon any change to the systemwide Gain|Mute values, the system will trigger
-    // all registered callbacks, notifying clients of the new values.
-    //
-    // Calls to SetSystemMute or SetSystemGain that do NOT result in a change to
-    // these values (e.g. calling SetSystemMute(false) when Mute is already false)
-    // will not cause the callbacks to be triggered.
-    //
-    // During and immediately following connecting to Audio, it is essential that
-    // clients keep in mind the fundamental single-threaded nature of FIDL.
-    // Specifically, if a newly-connected client registers a SystemGainMuteChanged
-    // callback before returning, that client will (once the system has subsequent
-    // opportunity) be notified via callback of the Gain|Mute settings at the time
-    // the connection was established. If however a newly-connected client returns
-    // from a FIDL message dispatch (returning control to the FIDL dispatcher),
-    // then that client subsequently registers this callback, the client has no
-    // way to learn the current Gain|Mute settings until they actually change.
-    0x0705: -> SystemGainMuteChanged(float32 gain_db, bool muted);
-
-    0x0706: SetRoutingPolicy(AudioOutputRoutingPolicy policy);
-};
-
-// A placeholder for various types of simple routing policies. This should be
-// replaced when routing policy moves to a more centralized policy manager.
-enum AudioOutputRoutingPolicy {
-    // AudioRenderers are always connected to all audio outputs which currently
-    // in the plugged state (eg; have a connector attached to them)
-    ALL_PLUGGED_OUTPUTS = 0;
-
-    // AudioRenderers are only connected to the output stream which most
-    // recently entered the plugged state. AudioRenderers move around from output to
-    // output as streams are published/unpublished and become plugged/unplugged.
-    //
-    // This is the initial setting for audio output routing.
-    LAST_PLUGGED_OUTPUT = 1;
-};
-
-// Permitted ranges for AudioRenderer and AudioCapturer
-const uint32 MIN_PCM_CHANNEL_COUNT = 1;
-const uint32 MAX_PCM_CHANNEL_COUNT = 8;
-const uint32 MIN_PCM_FRAMES_PER_SECOND = 1000;
-const uint32 MAX_PCM_FRAMES_PER_SECOND = 192000;
diff --git a/fidl/fuchsia.media/audio_capturer.fidl b/fidl/fuchsia.media/audio_capturer.fidl
deleted file mode 100644
index 84890e2..0000000
--- a/fidl/fuchsia.media/audio_capturer.fidl
+++ /dev/null
@@ -1,307 +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.
-
-library fuchsia.media;
-
-// AudioCapturer
-//
-// An AudioCapturer is an interface returned from an fuchsia.media.Audio's
-// CreateAudioCapturer method, which may be used by clients to capture audio from
-// either the current default audio input device, or the current default audio
-// output device depending on the flags passed during creation.
-//
-// TODO(mpuryear): Routing policy needs to become more capable than this.
-// Clients will need to be able to request sets of inputs/outputs/renderers,
-// make changes to theses sets, have their requests vetted by policy (do they
-// have the permission to capture this private stream, do they have the
-// permission to capture at this frame rate, etc...).  Eventually, this
-// functionality will need to be expressed at the AudioPolicy level, not here.
-//
-// ** Format support **
-//
-// See (Get|Set)StreamType below.  By default, the captured stream type will be
-// initially determined by the currently configured stream type of the source
-// that the AudioCapturer was bound to at creation time.  Users may either fetch this
-// type using GetStreamType, or they may choose to have the media
-// resampled/converted to a type of their choosing by calling SetStreamType.
-// Note: the stream type may only be set while the system is not running,
-// meaning that there are no pending capture regions (specified using CaptureAt)
-// and that the system is not currently running in 'async' capture mode.
-//
-// ** Buffers and memory management **
-//
-// Audio data is captured into a shared memory buffer (a VMO) supplied by the
-// user to the AudioCapturer during the AddPayloadBuffer call.  Please note the
-// following requirements related to the management of the payload buffer.
-//
-// ++ The payload buffer must be supplied before any capture operation may
-//    start.  Any attempt to start capture (via either CaptureAt or
-//    StartAsyncCapture) before a payload buffer has been established is an
-//    error.
-// ++ The payload buffer may not be changed while there are any capture
-//    operations pending.
-// ++ The stream type may not be changed after the payload buffer has been set.
-// ++ The payload buffer must be an integral number of audio frame sizes (in
-//    bytes)
-// ++ When running in 'async' mode (see below), the payload buffer must be at
-//    least as large as twice the frames_per_packet size specified during
-//    StartAsyncCapture.
-// ++ The handle to the payload buffer supplied by the user must be readable,
-//    writable, and mappable.
-// ++ Users should always treat the payload buffer as read-only.
-//
-// ** Synchronous vs. Asynchronous capture mode **
-//
-// The AudioCapturer interface can be used in one of two mutually exclusive
-// modes: Synchronous and Asynchronous.  A description of each mode and their
-// tradeoffs is given below.
-//
-// (TODO(mpuryear): can we come up with better names than these?  Both are
-// really async modes under the hood).
-//
-// ** Synchronous mode **
-//
-// By default, AudioCapturer instances are running in 'sync' mode.  They will
-// only capture data when a user supplies at least one region to capture into
-// using the CaptureAt method.  Regions supplied in this way will be filled in
-// the order that they are received and returned to the client as StreamPackets
-// via the return value of the CaptureAt method.  If an AudioCapturer instance
-// has data to capture, but no place to put it (because there are no more
-// pending regions to fill), the next payload generated will indicate that their
-// has been an overflow by setting the Discontinuity flag on the next produced
-// StreamPacket.  Synchronous mode may not be used in conjunction with
-// Asynchronous mode.  It is an error to attempt to call StartAsyncCapture while
-// the system still regions supplied by CaptureAt waiting to be filled.
-//
-// If a user has supplied regions to be filled by the AudioCapturer instance in
-// the past, but wishes to reclaim those regions, they may do so using the
-// DiscardAllPackets method.  Calling the DiscardAllPackets method will cause
-// all pending regions to be returned, but with NO_TIMESTAMP as their
-// StreamPacket's PTS.  See "Timing and Overflows", below, for a discussion of
-// timestamps and discontinuity flags. After a DiscardAllPackets operation,
-// an OnEndOfStream event will be produced.  While an AudioCapturer will never
-// overwrite any region of the payload buffer after a completed region is
-// returned, it may overwrite the unfilled portions of a partially filled
-// buffer which has been returned as a result of a flDiscardAllPacketsush
-// operation.
-//
-// ** Asynchronous mode **
-//
-// While running in 'async' mode, clients do not need to explicitly supply
-// regions of the shared buffer to be filled by the AudioCapturer instance.
-// Instead, a client enters into 'async' mode by calling StartAsyncCapture and
-// supplying a callback interface, and a number of frames to capture
-// per-callback.  Once running in async mode, the AudioCapturer instance will
-// choose regions of the payload buffer to capture into, capture the specified
-// number of frames, then deliver those frames as StreamPackets using the
-// OnPacketCapture FIDL event.  Users may stop capturing are return the
-// AudioCapturer instance to 'sync' mode using the StopAsyncCapture method.
-//
-// It is considered an error to attempt any of the following operations.
-//
-// ++ To attempt to enter 'async' capture mode when no payload buffer has been
-//    established.
-// ++ To specify a number of frames to capture per payload which does not permit
-//    at least two contiguous capture payloads to exist in the established
-//    shared payload buffer simultaneously.
-// ++ To send a region to capture into using the CaptureAt method while the
-//    AudioCapturer instance is running in 'async' mode.
-// ++ To attempt to call DiscardAllPackets while the AudioCapturer instance is running
-//    in 'async' mode.
-// ++ To attempt to re-start 'async' mode capturing without having first
-//    stopped.
-// ++ To attempt any operation except for SetGain while in the process of
-//    stopping.
-//
-// ** Synchronizing with a StopAsyncCapture operation **
-//
-// Stopping asynchronous capture mode and returning to synchronous capture mode
-// is an operation which takes time.  Aside from SetGain, users may not call any
-// other methods on the AudioCapturer interface after calling StopAsyncCapture
-// (including calling StopAsyncCapture again) until after the stop operation has
-// completed.  Because of this, it is important for users to be able to
-// synchronize with the stop operation.  Two mechanisms are provided for doing
-// so.
-//
-// The first is to use the StopAsyncCaptureWithCallback method.  When the user's
-// callback has been called, they can be certain that stop operation is complete
-// and that the AudioCapturer instance has returned to synchronous operation
-// mode.
-//
-// TODO(mpuryear): Fix obsolete docs.
-// The second way to determine that a stop operation has completed is to use the
-// flags on the packets which get delivered via the user-supplied
-// AudioCapturerCallback interface after calling StopAsyncCapture.  When
-// asked to stop, any partially filled packet will be returned to the user, and
-// the final packet returned will always have the end-of-stream flag (kFlagsEos)
-// set on it to indicate that this is the final frame in the sequence.  If
-// there is no partially filled packet to return, the AudioCapturer will
-// synthesize an empty packet with no timestamp, and offset/length set to zero,
-// in order to deliver a packet with the end-of-stream flag set on it.  Once
-// users have seen the end-of-stream flag after calling stop, the AudioCapturer
-// has finished the stop operation and returned to synchronous operating mode.
-//
-// ** Timing and Overflows **
-//
-// All media packets produced by an AudioCapturer instance will have their PTS
-// field filled out with the capture time of the audio expressed as a timestamp
-// given by the CLOCK_MONOTONIC timeline.  Note: this timestamp is actually a
-// capture timestamp, not a presentation timestamp (it is more of a CTS than a
-// PTS) and is meant to represent the underlying system's best estimate of the
-// capture time of the first frame of audio, including all outboard and hardware
-// introduced buffering delay.  As a result, all timestamps produced by an
-// AudioCapturer should be expected to be in the past relative to 'now' on the
-// CLOCK_MONOTONIC timeline.
-//
-// TODO(mpuryear): Specify the way in which timestamps relative to a different
-// clock (such as an audio domain clock) may be delivered to a client.
-//
-// The one exception to the "everything has an explicit timestamp" rule is when
-// discarding submitted regions while operating in synchronous mode. Discarded
-// packets have no data in them, but FIDL demands that all pending
-// method-return-value callbacks be executed.  Because of this, the regions will
-// be returned to the user, but their timestamps will be set to
-// kNoTimestamp, and their payload sizes will be set to zero.  Any
-// partially filled payload will have a valid timestamp, but a payload size
-// smaller than originally requested.  The final discarded payload (if there
-// were any to discard) will be followed by an OnEndOfStream event.
-//
-// Two StreamPackets delivered by an AudioCapturer instance are 'continuous' if
-// the first frame of audio contained in the second packet was capture exactly
-// one nominal frame time after the final frame of audio in the first packet.
-// If this relationship does not hold, the second StreamPacket will have the
-// 'kFlagDiscontinuous' flag set in it's flags field.
-//
-// Even though explicit timestamps are provided on every StreamPacket produced,
-// users who have very precise timing requirements are encouraged to always
-// reason about time by counting frames delivered since the last discontinuity
-// instead of simply using the raw capture timestamps.  This is because the
-// explicit timestamps written on continuous packets may have a small amount of
-// rounding error based on whether or not the units of the capture timeline
-// (CLOCK_MONOTONIC) are divisible by the chosen audio frame rate.
-//
-// Users should always expect the first StreamPacket produced by an AudioCapturer
-// to have the discontinuous flag set on it (as there is no previous packet to
-// be continuous with).  Similarly, the first StreamPacket after a
-// DiscardAllPackets or a Stop/Start cycle will always be discontinuous.  After
-// that, there are only two reasons that a StreamPacket will ever be
-// discontinuous.
-//
-// 1) The user is operating an synchronous mode and does not supply regions to
-//    be filled quickly enough.  If the next continuous frame of data has not
-//    been captured by the time it needs to be purged from the source buffers,
-//    an overflow has occurred and the AudioCapturer will flag the next captured
-//    region as discontinuous.
-// 2) The user is operating in asynchronous mode and some internal error
-//    prevents the AudioCapturer instance from capturing the next frame of audio
-//    in a continuous fashion.  This might be high system load or a hardware
-//    error, but in general it is something which should never normally happen.
-//    In practice, however, if it does, the next produced packet will be flagged
-//    as being discontinuous.
-//
-// ** Synchronous vs. Asynchronous Trade-offs **
-//
-// The choice of operating in synchronous vs. asynchronous mode is up to the
-// user, and depending on the user's requirements, there are some advantages and
-// disadvantages to each choice.
-//
-// Synchronous mode requires only a single Zircon channel under the hood and can
-// achieve some small savings because of this.  In addition, the user has
-// complete control over the buffer management.  Users specify exactly where
-// audio will be captured to and in what order.  Because of this, if users do
-// not need to always be capturing, it is simple to stop and restart the capture
-// later (just by ceasing to supply packets, then resuming later on).  Payloads
-// do not need to be uniform in size either, clients may specify payloads of
-// whatever granularity is appropriate.
-//
-// The primary downside of operating in synchronous mode is that two messages
-// will need to be sent for every packet to be captured.  One to inform the
-// AudioCapturer of the instance to capture into, and one to inform the user
-// that the packet has been captured.  This may end up increasing overhead and
-// potentially complicating client designs.
-//
-// Asynchronous mode has the advantage requiring only 1/2 of the messages,
-// however, when operating in 'async' mode, AudioCapturer instances have no way
-// of knowing if a user is processing the StreamPackets being sent in a timely
-// fashion, and no way of automatically detecting an overflow condition.  Users
-// of 'async' mode should be careful to use a buffer large enough to ensure that
-// they will be able to process their data before an AudioCapturer will be
-// forced to overwrite it.
-//
-// ** Future Directions (aka TODOs) **
-//
-// ++ Consider adding a 'zero message' capture mode where the AudioCapturer
-//    simply supplies a linear transformation and some buffer parameters (max
-//    audio hold time) each time that it is started in 'async' mode, or each
-//    time an internal overflow occurs in 'async' mode.  Based on this
-//    information, client should know where the capture write pointer is at all
-//    times as a function of the transformation removing the need to send any
-//    buffer position messages.  This would reduce the operational overhead just
-//    about as low as it could go, and could allow for the lowest possible
-//    latency for capture clients.  OTOH - it might be better to achieve this
-//    simply by allowing clients to be granted direct, exclusive access to the
-//    driver level of capture if no resampling, reformatting, or sharing is
-//    needed.
-// ++ Consider providing some mechanism by which users may specify the exact
-//    time at which they want to capture data.
-// ++ Allow for more complex routing/mixing/AEC scenarios and place this under
-//    the control of the policy manager.
-// ++ Define and enforce access permissions and downsampling requirements for
-//    sensitive content.  Enforce using the policy manager.
-// ++ Consider allowing the mixer to produce compressed audio.
-//
-// Ordinal range: 0x0500-0x5ff
-[FragileBase]
-interface AudioCapturer : StreamBufferSet, StreamSource {
-    // Sets the stream type of the stream to be delivered.  Causes the source
-    // material to be reformatted/resampled if needed in order to produce the
-    // requested stream type.  Note that the stream type may not be changed after
-    // the payload buffer has been established.
-    0x0501: SetPcmStreamType(AudioStreamType stream_type);
-
-    // Explicitly specify a region of the shared payload buffer for the audio
-    // input to capture into.
-    0x0502: CaptureAt(uint32 payload_buffer_id, uint32 payload_offset,
-                      uint32 frames) -> (StreamPacket captured_packet);
-
-    // Place the AudioCapturer into 'async' capture mode and begin to produce packets
-    // of exactly 'frames_per_packet' number of frames each. The
-    // OnPacketProduced event (of StreamSink) will be used to inform the client of
-    // produced packets.
-    0x0503: StartAsyncCapture(uint32 frames_per_packet);
-
-    // Stop capturing in 'async' capture mode and (optionally) deliver a
-    // callback that may be used by the client if explicit synchronization
-    // is needed.
-    0x0504: StopAsyncCapture() -> ();
-    0x0505: StopAsyncCaptureNoReply();
-
-    // Binds to the gain control for this AudioCapturer.
-    0x0506: BindGainControl(request<GainControl> gain_control_request);
-
-    /////////////////////////////////////////////////////////////////////////////
-    // StreamBufferSet methods
-    // See stream.fidl.
-
-    /////////////////////////////////////////////////////////////////////////////
-    // StreamSource methods
-    // See stream.fidl.
-
-    /////////////////////////////////////////////////////////////////////////////
-    // Methods to be deprecated
-    // These methods will go away.
-
-    // Gets the currently configured stream type. Note: for an AudioCapturer which was
-    // just created and has not yet had its stream type explicitly set, this will
-    // retrieve the stream type -- at the time the AudioCapturer was created -- of the
-    // source (input or looped-back output) to which the AudioCapturer is bound.
-    //
-    // TODO(mpuryear): Get rid of this. Eventually, AudioCapturers will be bindable to
-    // a set of inputs/outputs/renderers, so the concept of a "native" stream type
-    // will go away. Mechanisms will need to be put in place to allow users to
-    // enumerate the configuration of these bind-able endpoints (and perhaps to
-    // exercise control over them), but it will be the user of the AudioCapturer's job
-    // to specify the format they want.
-    0xffff: GetStreamType() -> (StreamType stream_type);
-};
diff --git a/fidl/fuchsia.media/audio_device_enumerator.fidl b/fidl/fuchsia.media/audio_device_enumerator.fidl
deleted file mode 100644
index 807b5c6..0000000
--- a/fidl/fuchsia.media/audio_device_enumerator.fidl
+++ /dev/null
@@ -1,103 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-const uint32 AudioGainInfoFlag_Mute = 0x01;
-const uint32 AudioGainInfoFlag_AgcSupported = 0x02;
-const uint32 AudioGainInfoFlag_AgcEnabled = 0x04;
-
-struct AudioGainInfo {
-    float32 gain_db;
-    uint32 flags;
-};
-
-struct AudioDeviceInfo {
-    string name;
-    string unique_id;
-    uint64 token_id;
-    bool is_input;
-
-    // TODO(mpuryear): Verify whether or not we want to leave this stuff in place
-    // or not. Technically it is not needed (all of these things could be
-    // queried), but it seems like useful information to send during device
-    // enumeration as it saves a user a round trip to the server and eliminates
-    // any need to have extra states in a user's state machine when trying to
-    // figure out the current state of a device during initial enumeration.
-    AudioGainInfo gain_info;
-    bool is_default;
-};
-
-const uint32 SetAudioGainFlag_GainValid = 0x01;
-const uint32 SetAudioGainFlag_MuteValid = 0x02;
-const uint32 SetAudioGainFlag_AgcValid = 0x04;
-
-[Discoverable]
-interface AudioDeviceEnumerator {
-    // Obtain the list of currently active audio devices.
-    100: GetDevices() -> (vector<AudioDeviceInfo> devices);
-
-    // Events sent when devices are added or removed, or when properties of a
-    // device change.
-    //
-    // TODO(mpuryear): Should we have a set of filters which control which of these
-    // events a user receives?
-    //
-    // Pro: Having filters like this removes the need for the server to send
-    // messages to clients who don't care. In particular, it seems likely that a
-    // client who just called SetDeviceGain will not care about the
-    // OnDeviceGainChanged event being fired.
-    //
-    // Con: Having filters like this means that the server needs to maintain a bit
-    // more per-client state.
-    110: -> OnDeviceAdded(AudioDeviceInfo device);
-    111: -> OnDeviceRemoved(uint64 device_token);
-    112: -> OnDeviceGainChanged(uint64 device_token, AudioGainInfo gain_info);
-    113: -> OnDefaultDeviceChanged(uint64 old_default_token,
-                                   uint64 new_default_token);
-
-    // Gain/Mute/AGC control
-    //
-    // Note that each of these operations requires a device_token in order to
-    // target the proper input/output.
-    //
-    // The Get command returns the device_token
-    // of the device whose gain is being reported, or ZX_KOID_INVALID in the case
-    // that the requested device_token was invalid or the device had been removed
-    // from the system before the Get command could be processed.
-    //
-    // Set commands which are given an invalid device token are ignored and have
-    // no effect on the system. In addition, users do not need to control all of
-    // the gain settings for an audio device with each call. Only the settings
-    // with a corresponding flag set in the set_flags parameter will be affected.
-    // For example, passing SetAudioGainFlag_MuteValid will cause a SetDeviceGain
-    // call to care only about the mute setting in the gain_info structure, while
-    // passing (SetAudioGainFlag_GainValid | SetAudioGainFlag_MuteValid) will
-    // cause both the mute and the gain status to be changed simultaneously.
-    200: GetDeviceGain(uint64 device_token)
-             -> (uint64 device_token, AudioGainInfo gain_info);
-    201: SetDeviceGain(uint64 device_token,
-                       AudioGainInfo gain_info,
-                       uint32 set_flags);
-
-    // Default Device
-    //
-    // Fetch the device ID of the current default input or output device, or
-    // ZX_KOID_INVALID if no such device exists.
-    //
-    // TODO(mpuryear): solidify the concept of "default" device. Right now, it
-    // basically means the device which would be chosen as the destination of an
-    // AudioRenderer stream (or the source for an AudioCapturer stream), in the
-    // absence of...
-    //
-    // 1) Any manual routing configuration imposed by the user.
-    // 2) Any property based routing decision made by the audio service.
-    //
-    // Currently, this translates to "the default inputs/output will be the last
-    // plugged input/output". As the human level logic which drives the audio
-    // routing policy evolves and becomes more complicated, this will probably
-    // change.
-    300: GetDefaultInputDevice() -> (uint64 device_token);
-    301: GetDefaultOutputDevice() -> (uint64 device_token);
-};
diff --git a/fidl/fuchsia.media/audio_renderer.fidl b/fidl/fuchsia.media/audio_renderer.fidl
deleted file mode 100644
index 525eee1..0000000
--- a/fidl/fuchsia.media/audio_renderer.fidl
+++ /dev/null
@@ -1,287 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-//
-// AudioRenderers can be in one of two states at any point in time, either
-// the configurable state or the operational state. A renderer is considered
-// to be operational any time it has packets queued and waiting to be
-// rendered; otherwise it is considered to be in the configurable state. When an
-// AudioRenderer has entered the operational state of its life, any attempt to
-// call a config method in the interface is considered to be illegal and will
-// result in termination of the interface's connection to the audio service.
-//
-// If an AudioRenderer must be reconfigured, it is best practice to always call
-// `DiscardAllPackets` on the AudioRenderer, before starting to reconfigure it.
-//
-
-// Ordinal range: 0x0600-0x6ff
-[FragileBase]
-interface AudioRenderer : StreamBufferSet, StreamSink {
-    // Sets the type of the stream to be delivered by the client. Using this
-    // method implies that the stream encoding is AUDIO_ENCODING_LPCM.
-    0x0601: SetPcmStreamType(AudioStreamType type);
-
-    // Sets the stream type to be delivered by the client. This method is used for
-    // compressed pass-through. The media_specific field must be of type audio.
-    // NOTE: Not currently implemented.
-    0x0602: SetStreamType(StreamType type);
-
-    // Sets the units used by the presentation (media) timeline. By default, PTS
-    // units are nanoseconds (as if this were called with values of 1e9 and 1).
-    0x0603: SetPtsUnits(uint32 tick_per_second_numerator,
-                        uint32 tick_per_second_denominator);
-
-    // Sets the maximum threshold (in frames) between an explicit PTS (user-
-    // provided) and an expected PTS (determined using interpolation). Beyond this
-    // threshold, a stream is no longer considered 'continuous' by the renderer.
-    //
-    // Defaults to RoundUp((AudioFPS/PTSTicksPerSec) / 2.0) / AudioFPS
-    // Most users should not need to change this value from its default.
-    //
-    // Example:
-    // A user is playing back 48KHz audio from a container, which also contains
-    // video and needs to be synchronized with the audio. The timestamps are
-    // provided explicitly per packet by the container, and expressed in mSec
-    // units. This means that a single tick of the media timeline (1 mSec)
-    // represents exactly 48 frames of audio. The application in this scenario
-    // delivers packets of audio to the AudioRenderer, each with exactly 470
-    // frames of audio, and each with an explicit timestamp set to the best
-    // possible representation of the presentation time (given this media clock's
-    // resolution). So, starting from zero, the timestamps would be..
-    //
-    // [ 0, 10, 20, 29, 39, 49, 59, 69, 78, 88, ... ]
-    //
-    // In this example, attempting to use the presentation time to compute the
-    // starting frame number of the audio in the packet would be wrong the
-    // majority of the time. The first timestamp is correct (by definition), but
-    // it will be 24 packets before the timestamps and frame numbers come back
-    // into alignment (the 24th packet would start with the 11280th audio frame
-    // and have a PTS of exactly 235).
-    //
-    // One way to fix this situation is to set the PTS continuity threshold
-    // (henceforth, CT) for the stream to be equal to 1/2 of the time taken by the
-    // number of frames contained within a single tick of the media clock, rounded
-    // up. In this scenario, that would be 24.0 frames of audio, or 500 uSec.
-    // Any packets whose expected PTS was within +/-CT frames of the explicitly
-    // provided PTS would be considered to be a continuation of the previous frame
-    // of audio.
-    //
-    // Other possible uses:
-    // Users who are scheduling audio explicitly, relative to a clock which has
-    // not been configured as the reference clock, can use this value to control
-    // the maximum acceptable synchronization error before a discontinuity is
-    // introduced. E.g., if a user is scheduling audio based on a recovered common
-    // media clock, and has not published that clock as the reference clock, and
-    // they set the CT to 20mSec, then up to 20mSec of drift error can accumulate
-    // before the AudioRenderer deliberately inserts a presentation discontinuity
-    // to account for the error.
-    //
-    // Users whose need to deal with a container where their timestamps may be
-    // even less correct than +/- 1/2 of a PTS tick may set this value to
-    // something larger. This should be the maximum level of inaccuracy present
-    // in the container timestamps, if known. Failing that, it could be set to
-    // the maximum tolerable level of drift error before absolute timestamps are
-    // explicitly obeyed. Finally, a user could set this number to a very large
-    // value (86400.0 seconds, for example) to effectively cause *all* timestamps
-    // to be ignored after the first, thus treating all audio as continuous with
-    // previously delivered packets. Conversely, users who wish to *always*
-    // explicitly schedule their audio packets exactly may specify a CT of 0.
-    //
-    0x0604: SetPtsContinuityThreshold(float32 threshold_seconds);
-
-    // Set the reference clock used to control playback rate.
-    //
-    // TODO(mpuryear): refine this type when we solidly define what a clock handle
-    // is/looks like. Also should we allow users to lock their rates to CLOCK_MONO
-    // instead of following the default (perhaps dynamic) system rate?
-    0x0605: SetReferenceClock(handle reference_clock);
-
-    // Immediately put the AudioRenderer into a playing state. Start the advance
-    // of the media timeline, using specific values provided by the caller (or
-    // default values if not specified). In an optional callback, return the
-    // timestamp values ultimately used -- these set the ongoing relationship
-    // between the media and reference timelines (i.e., how to translate between
-    // the domain of presentation timestamps, and the realm of local system time).
-    //
-    // Local system time is specified in units of nanoseconds; media_time is
-    // specified in the units defined by the user in the `SetPtsUnits` function,
-    // or nanoseconds if `SetPtsUnits` is not called.
-    //
-    // The act of placing an AudioRenderer into the playback state establishes a
-    // relationship between 1) the user-defined media (or presentation) timeline
-    // for this particular AudioRenderer, and 2) the real-world system reference
-    // timeline. To communicate how to translate between timelines, the Play()
-    // callback provides an equivalent timestamp in each time domain. The first
-    // value ('reference_time') is given in terms of the local system clock; the
-    // second value ('media_time') is what media instant exactly corresponds to
-    // that local time. Restated, the frame at 'media_time' in the audio stream
-    // should be presented at system local time 'reference_time'.
-    //
-    // Note: on calling this API, media_time immediately starts advancing. It is
-    // possible, although uncommon, for a caller to specify a system time that is
-    // far in the past, or far into the future. This, along with the specified
-    // media time, is simply used to determine what media time corresponds to
-    // 'now', and THAT media time is then intersected with presentation
-    // timestamps of packets already submitted, to determine which media frames
-    // should be presented next.
-    //
-    // With the corresponding reference_time and media_time values, a user can
-    // translate arbitrary time values from one timeline into the other. After
-    // calling `SetPtsUnits(pts_per_sec_numerator, pts_per_sec_denominator)` and
-    // given the 'ref_start' and 'media_start' values from `Play()`, then for any
-    // 'ref_time':
-    //
-    // media_time = ( (ref_time - ref_start) / 1e9
-    //                * (pts_per_sec_numerator / pts_per_sec_denominator) )
-    //              + media_start
-    //
-    // Conversely, for any presentation timestamp 'media_time':
-    //
-    // ref_time = ( (media_time - media_start)
-    //              * (pts_per_sec_denominator / pts_per_sec_numerator)
-    //              * 1e9 )
-    //            + ref_start
-    //
-    // Users, depending on their use case, may optionally choose not to specify
-    // one or both of these timestamps. A timestamp may be omitted by supplying
-    // the special value 'kNoTimestamp'. The AudioRenderer automatically deduces
-    // any omitted timestamp value using the following rules:
-    //
-    // Reference Time
-    // If 'reference_time' is omitted, the AudioRenderer will select a "safe"
-    // reference time to begin presentation, based on the minimum lead times for
-    // the output devices that are currently bound to this AudioRenderer. For
-    // example, if an AudioRenderer is bound to an internal audio output
-    // requiring at least 3 mSec of lead time, and an HDMI output requiring at
-    // least 75 mSec of lead time, the AudioRenderer might (if 'reference_time'
-    // is omitted) select a reference time 80 mSec from now.
-    //
-    // Media Time
-    // If media_time is omitted, the AudioRenderer will select one of two values.
-    // - If the AudioRenderer is resuming from the paused state, and packets have
-    // not been discarded since being paused, then the AudioRenderer will use a
-    // media_time corresponding to the instant at which the presentation became
-    // paused.
-    // - If the AudioRenderer is being placed into a playing state for the first
-    // time following startup or a 'discard packets' operation, the initial
-    // media_time will be set to the PTS of the first payload in the pending
-    // packet queue. If the pending queue is empty, initial media_time will be
-    // set to zero.
-    //
-    // Return Value
-    // When requested, the AudioRenderer will return the 'reference_time' and
-    // 'media_time' which were selected and used (whether they were explicitly
-    // specified or not) in the return value of the play call.
-    //
-    // Examples
-    // 1. A user has queued some audio using `SendPacket` and simply wishes them
-    // to start playing as soon as possible. The user may call Play without
-    // providing explicit timestamps -- `Play(kNoTimestamp, kNoTimestamp)`.
-    //
-    // 2. A user has queued some audio using `SendPacket`, and wishes to start
-    // playback at a specified 'reference_time', in sync with some other media
-    // stream, either initially or after discarding packets. The user would call
-    // `Play(reference_time, kNoTimestamp)`.
-    //
-    // 3. A user has queued some audio using `SendPacket`. The first of these
-    // packets has a PTS of zero, and the user wishes playback to begin as soon as
-    // possible, but wishes to skip all of the audio content between PTS 0 and PTS
-    // 'media_time'. The user would call `Play(kNoTimestamp, media_time)`.
-    //
-    // 4. A user has queued some audio using `SendPacket` and want to present this
-    // media in synch with another player in a different device. The coordinator
-    // of the group of distributed players sends an explicit message to each
-    // player telling them to begin presentation of audio at PTS 'media_time', at
-    // the time (based on the group's shared reference clock) 'reference_time'.
-    // Here the user would call `Play(reference_time, media_time)`.
-    //
-    // TODO(mpuryear): Define behavior in the case that a user calls `Play` while
-    // the system is already playing. We should probably do nothing but return a
-    // valid correspondence pair in response -- unless both reference and media
-    // times are provided (and do not equate to the current timeline
-    // relationship), in which case we should introduce a discontinuity.
-    //
-    // TODO(mpuryear): Collapse these if we ever have optional retvals in FIDL
-    0x0606: Play(int64 reference_time, int64 media_time)
-                -> (int64 reference_time, int64 media_time);
-    0x0607: PlayNoReply(int64 reference_time, int64 media_time);
-
-    // Immediately put the AudioRenderer into the paused state and then report the
-    // relationship between the media and reference timelines which was
-    // established (if requested).
-    //
-    // TODO(mpuryear): Define behavior in the case that a user calls `Pause` while
-    // the system is already in the paused state. We should probably do nothing
-    // but provide a valid correspondence pair in response.
-    //
-    // TODO(mpuryear): Collapse these if we ever have optional retvals in FIDL
-    0x0608: Pause() -> (int64 reference_time, int64 media_time);
-    0x0609: PauseNoReply();
-
-    // Enable or disable notifications about changes to the minimum clock lead
-    // time (in nanoseconds) for this AudioRenderer. Calling this method with
-    // 'enabled' set to true will trigger an immediate `OnMinLeadTimeChanged`
-    // event with the current minimum lead time for the AudioRenderer. If the
-    // value changes, an `OnMinLeadTimeChanged` event will be raised with the new
-    // value. This behavior will continue until the user calls
-    // `EnableMinLeadTimeEvents(false)`.
-    //
-    // The minimum clock lead time is the amount of time ahead of the reference
-    // clock's understanding of "now" that packets needs to arrive (relative to
-    // the playback clock transformation) in order for the mixer to be able to mix
-    // packet. For example...
-    //
-    // ++ Let the PTS of packet X be P(X)
-    // ++ Let the function which transforms PTS -> RefClock be R(p) (this function
-    //    is determined by the call to Play(...)
-    // ++ Let the minimum lead time be MLT
-    //
-    // If R(P(X)) < RefClock.Now() + MLT
-    // Then the packet is late, and some (or all) of the packet's payload will
-    // need to be skipped in order to present the packet at the scheduled time.
-    //
-    // TODO(mpuryear): What should the units be here?  Options include...
-    //
-    // 1) Normalized to nanoseconds (this is the current API)
-    // 2) Reference clock units (what happens if the reference clock changes?)
-    // 3) PTS units (what happens when the user changes the PTS units?)
-    //
-    // TODO(mpuryear): Should `EnableMinLeadTimeEvents` have an optional -> ()
-    // return value for synchronization purposes?  Probably not; users should be
-    // able to send a disable request and clear their event handler if they no
-    // longer want notifications. Their in-process dispatcher framework can handle
-    // draining and dropping any lead time changed events that were already in
-    // flight when the disable message was sent.
-    //
-    0x060a: EnableMinLeadTimeEvents(bool enabled);
-    0x060b: -> OnMinLeadTimeChanged(int64 min_lead_time_nsec);
-
-    // TODO(mpuryear): Eliminate this method when possible. Right now, it is used
-    // by code requiring synchronous FIDL interfaces to talk to AudioRenderers.
-    0x060c: GetMinLeadTime() -> (int64 min_lead_time_nsec);
-
-    // Binds to the gain control for this AudioRenderer.
-    0x060d: BindGainControl(request<GainControl> gain_control_request);
-
-    /////////////////////////////////////////////////////////////////////////////
-    // StreamBufferSet methods
-    // See stream.fidl.
-
-    /////////////////////////////////////////////////////////////////////////////
-    // StreamSink methods
-    // See stream.fidl.
-
-    // TODO(mpuryear): Spec methods/events which can be used for unintentional
-    // discontinuity/underflow detection.
-    //
-    // TODO(mpuryear): Spec methods/events which can be used to report routing
-    // changes. (Presuming that they belong at this level at all; they may belong
-    // on some sort of policy object).
-    //
-    // TODO(mpuryear): Spec methods/events which can be used to report policy
-    // induced gain/ducking changes. (Presuming that they belong at this level at
-    // all; they may belong on some sort of policy object).
-};
diff --git a/fidl/fuchsia.media/gain_control.fidl b/fidl/fuchsia.media/gain_control.fidl
deleted file mode 100644
index a9f2b6d..0000000
--- a/fidl/fuchsia.media/gain_control.fidl
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-enum AudioRamp : uint16 {
-    // Amplitude scale changes evenly ("straight-line") across the ramp duration.
-    SCALE_LINEAR = 1;
-
-    // Additional ramp shapes (easings) may be added in the future, perhaps
-    // including logarithmic (i.e. linear wrt dB), cubic (in/out/inout) or others.
-};
-
-// Ordinal range: 0x0100-0x1ff
-interface GainControl {
-    // Sets the gain in decibels.
-    0x0101: SetGain(float32 gain_db);
-
-    // Smoothly change gain from its current value to specified value, over the
-    // specified duration (in milliseconds). If 'duration_ns' is 0, gain changes
-    // immediately. Otherwise, the gain changes only while the stream is running.
-    //
-    // Any active or pending ramp is cancelled by subsequent call to SetGain.
-    //
-    // There can be at most 1 active ramp at any time. Any active or pending ramp
-    // is replaced by a later call to SetGainWithRamp (even if duration is 0). In
-    // this case gain would ramps directly from its most recent (mid-ramp) value
-    // to the newly-specified one, over the new duration, using the new easing.
-    //
-    // Usage example (using time in seconds):
-    //  Time 0
-    //      SetGainWithRamp(MUTED_GAIN_DB, 0, SCALE_LINEAR)         // Ramp 1
-    //      SetGainWithRamp(0.0f, ZX_SEC(4), SCALE_LINEAR)          // Ramp 2
-    //  Time 3
-    //      PlayNoReply(kNoTimestamp, any_media_time)
-    //  Time 4
-    //      PauseNoReply()
-    //  Time 7
-    //      PlayNoReply(kNoTimestamp, any_media_time)
-    //  Time 8
-    //      SetGainWithRamp(MUTED_GAIN_DB, ZX_SEC(1), SCALE_LINEAR) // Ramp 3
-    //
-    //
-    // Time 0: Ramp 1 completes immediately, changing the gain to MUTED_GAIN_DB.
-    //         Ramp 2 is pending, since we are not in playback.
-    // Time 3, Ramp 2 begins ramping from MUTED_GAIN_DB to 0 dB (scale 0.0=>1.0).
-    // Time 4: Ramp 2 pauses (3s remain). Per SCALE_LINEAR, scale is approx 0.25.
-    // Time 7: Ramp 2 resumes from most recent value toward the target.
-    // Time 8: Ramp 3 replaces Ramp 2 and starts from current scale (approx 0.5).
-    // Time 9: Ramp 3 completes; current scale value is now 0.0 (MUTED_GAIN_DB).
-    //
-    0x0102: SetGainWithRamp(float32 gain_db,
-                            int64 duration_ns,
-                            AudioRamp rampType);
-
-    // Sets the mute value. Ramping and Mute are fully independent, although of
-    // course they both affect the scalingthat is applied to the audio stream(s).
-    0x0103: SetMute(bool muted);
-
-    // Provides current gain/mute values to those who register for notification.
-    //
-    // TODO(mpuryear): provide ramp-related values in this event, as well.
-    //
-    // TODO(mpuryear): notify upon ramp milestones (not just SetGain/Mute) --
-    // upon the start/pause/restart/completion of an active ramp?
-    0x0104: -> OnGainMuteChanged(float32 gain_db, bool muted);
-};
-
-const float32 MUTED_GAIN_DB = -160.0;
-
-const float32 MAX_GAIN_DB = 24.0;
diff --git a/fidl/fuchsia.media/meta.json b/fidl/fuchsia.media/meta.json
deleted file mode 100644
index 6619b07..0000000
--- a/fidl/fuchsia.media/meta.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.media/audio.fidl", 
-    "fidl/fuchsia.media/audio_capturer.fidl", 
-    "fidl/fuchsia.media/audio_device_enumerator.fidl", 
-    "fidl/fuchsia.media/audio_renderer.fidl", 
-    "fidl/fuchsia.media/gain_control.fidl", 
-    "fidl/fuchsia.media/stream.fidl", 
-    "fidl/fuchsia.media/stream_type.fidl"
-  ], 
-  "name": "fuchsia.media", 
-  "root": "fidl/fuchsia.media", 
-  "sources": [
-    "fidl/fuchsia.media/audio.fidl", 
-    "fidl/fuchsia.media/audio_capturer.fidl", 
-    "fidl/fuchsia.media/audio_device_enumerator.fidl", 
-    "fidl/fuchsia.media/audio_renderer.fidl", 
-    "fidl/fuchsia.media/gain_control.fidl", 
-    "fidl/fuchsia.media/stream.fidl", 
-    "fidl/fuchsia.media/stream_type.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.media/stream.fidl b/fidl/fuchsia.media/stream.fidl
deleted file mode 100644
index a8b871b..0000000
--- a/fidl/fuchsia.media/stream.fidl
+++ /dev/null
@@ -1,105 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-// Manages a set of payload buffers for a stream.
-// Ordinal range: 0x0200-0x2ff
-[FragileBase]
-interface StreamBufferSet {
-    // Adds a payload buffer for stream packets. StreamPacket structs reference
-    // a payload buffer by ID using the StreamPacket.payload_buffer_id field.
-    0x0201: AddPayloadBuffer(uint32 id, handle<vmo> payload_buffer);
-
-    // Removes a payload buffer.
-    0x0202: RemovePayloadBuffer(uint32 id);
-};
-
-// Consumes a stream of packets.
-// Ordinal range: 0x0300-03ff
-[FragileBase]
-interface StreamSink {
-    // Sends a packet to this object. The response is sent when this object is
-    // done with the associated payload memory.
-    0x0301: SendPacket(StreamPacket packet) -> ();
-
-    // Sends a packet to this object. This interface doesn't define how the client
-    // knows when the sink is done with the associated payload memory. The
-    // inheriting interface must define that.
-    0x0302: SendPacketNoReply(StreamPacket packet);
-
-    // Indicates the stream has ended.
-    0x0303: EndOfStream();
-
-    // Discards packets previously sent via SendPacket or SendPacketNoReply.
-    0x0304: DiscardAllPackets() -> ();
-    0x0305: DiscardAllPacketsNoReply();
-};
-
-// Produces a stream of packets.
-// Ordinal range: 0x0400-04ff
-[FragileBase]
-interface StreamSource {
-    // Delivers a packet produced by this object. Each packet delivered via this
-    // event must be released with a call to ReleasePacket.
-    0x0401: -> OnPacketProduced(StreamPacket packet);
-
-    // Indicates that the stream has ended.
-    0x0402: -> OnEndOfStream();
-
-    // Releases a packet delivered via OnPacketProduced.
-    0x0403: ReleasePacket(StreamPacket packet);
-
-    // Discards queued packets.
-    0x0404: DiscardAllPackets() -> ();
-    0x0405: DiscardAllPacketsNoReply();
-};
-
-// A StreamSink that uses StreamBufferSet for buffer management.
-interface SimpleStreamSink : StreamSink, StreamBufferSet {
-    ////////////////////////////////////////////////////////////////////////////
-    // StreamBufferSet methods
-
-    ////////////////////////////////////////////////////////////////////////////
-    // StreamSink methods
-};
-
-// Describes a packet consumed by StreamSink or produced by StreamSource.
-struct StreamPacket {
-    // Time at which the packet is to be presented, according to the presentation
-    // clock.
-    int64 pts = NO_TIMESTAMP;
-
-    // ID of the payload buffer used for this packet. When this struct is used
-    // with StreamBufferSet, this field is the ID of a payload buffer provided
-    // via StreamBufferSet.AddPayloadBuffer. Other interfaces may define other
-    // semantics for this field.
-    uint32 payload_buffer_id;
-
-    // Offset of the packet payload in the payload buffer.
-    uint64 payload_offset;
-
-    // Size in bytes of the payload.
-    uint64 payload_size;
-
-    // A collection of flags (see constants below) describing properties of this
-    // packet.
-    uint32 flags = 0;
-
-    // The buffer configuration associated with this packet. The semantics of
-    // this field depend on the the interface with which this struct is used.
-    // In many contexts, this field is not used.
-    uint64 buffer_config = 0;
-
-    // The stream associated with this packet. The semantics of this field
-    // depend on the the interface with which this struct is used. In many
-    // contexts, this field is not used.
-    uint64 stream_id = 0;
-};
-
-const uint32 STREAM_PACKET_FLAG_KEY_FRAME = 0x01;
-const uint32 STREAM_PACKET_FLAG_DROPPABLE = 0x02;
-const uint32 STREAM_PACKET_FLAG_DISCONTINUITY = 0x04;
-
-const int64 NO_TIMESTAMP = 0x7fffffffffffffff;
diff --git a/fidl/fuchsia.media/stream_type.fidl b/fidl/fuchsia.media/stream_type.fidl
deleted file mode 100644
index e37e010..0000000
--- a/fidl/fuchsia.media/stream_type.fidl
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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.
-
-library fuchsia.media;
-
-// Describes the type of an elementary stream.
-struct StreamType {
-    // Medium-specific type information.
-    MediumSpecificStreamType medium_specific;
-
-    // Encoding (see constants below).
-    string encoding;
-
-    // Encoding-specific parameters.
-    vector<uint8>? encoding_parameters;
-};
-
-// A union of all medium-specific stream type structs.
-union MediumSpecificStreamType {
-    AudioStreamType audio;
-    VideoStreamType video;
-    TextStreamType text;
-    SubpictureStreamType subpicture;
-};
-
-const string MEDIA_ENCODING_UNSUPPORTED = "fuchsia.media.unsupported";
-
-const string AUDIO_ENCODING_AAC = "fuchsia.media.aac";
-const string AUDIO_ENCODING_AMRNB = "fuchsia.media.amrnb";
-const string AUDIO_ENCODING_AMRWB = "fuchsia.media.amrwb";
-const string AUDIO_ENCODING_APTX = "fuchsia.media.aptx";
-const string AUDIO_ENCODING_FLAC = "fuchsia.media.flac";
-const string AUDIO_ENCODING_GSMMS = "fuchsia.media.gsmms";
-const string AUDIO_ENCODING_LPCM = "fuchsia.media.lpcm";
-const string AUDIO_ENCODING_MP3 = "fuchsia.media.mp3";
-const string AUDIO_ENCODING_PCMALAW = "fuchsia.media.pcmalaw";
-const string AUDIO_ENCODING_PCMMULAW = "fuchsia.media.pcmmulaw";
-const string AUDIO_ENCODING_SBC = "fuchsia.media.sbc";
-const string AUDIO_ENCODING_VORBIS = "fuchsia.media.vorbis";
-
-const string VIDEO_ENCODING_H263 = "fuchsia.media.h263";
-const string VIDEO_ENCODING_H264 = "fuchsia.media.h264";
-const string VIDEO_ENCODING_MPEG4 = "fuchsia.media.mpeg4";
-const string VIDEO_ENCODING_THEORA = "fuchsia.media.theora";
-const string VIDEO_ENCODING_UNCOMPRESSED = "fuchsia.media.uncompressed_video";
-const string VIDEO_ENCODING_VP3 = "fuchsia.media.vp3";
-const string VIDEO_ENCODING_VP8 = "fuchsia.media.vp8";
-const string VIDEO_ENCODING_VP9 = "fuchsia.media.vp9";
-
-///////////////////////////////////////////////////////////////////////////////
-// Audio
-
-// Describes the type of an audio elementary stream.
-struct AudioStreamType {
-    AudioSampleFormat sample_format;
-    uint32 channels;
-    uint32 frames_per_second;
-    // TODO(mpuryear): Add channel config.
-};
-
-enum AudioSampleFormat {
-    // 8-bit unsigned samples, sample size 1 byte.
-    UNSIGNED_8 = 1;
-
-    // 16-bit signed samples, host-endian, sample size 2 bytes.
-    SIGNED_16 = 2;
-
-    // 24-bit signed samples in 32 bits, host-endian, sample size 4 bytes.
-    SIGNED_24_IN_32 = 3;
-
-    // 32-bit floating-point samples, sample size 4 bytes.
-    FLOAT = 4;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Video
-
-// Describes the type of a video elementary stream.
-struct VideoStreamType {
-    VideoProfile profile;
-    // TODO(dalesat): Use fuchsia.images.PixelFormat.
-    PixelFormat pixel_format;
-    // TODO(dalesat): Use fuchsia.images.ColorSpace.
-    ColorSpace color_space;
-    uint32 width;
-    uint32 height;
-    uint32 coded_width;
-    uint32 coded_height;
-    uint32 pixel_aspect_ratio_width;
-    uint32 pixel_aspect_ratio_height;
-    // TODO(dalesat): Change to single line_stride value for all planes.
-    vector<uint32> line_stride;
-    // TODO(dalesat): Remove.
-    vector<uint32> plane_offset;
-};
-
-// TODO(dalesat): Blindly copied from Chromium, revisit.
-enum VideoProfile {
-    UNKNOWN = 0;
-    NOT_APPLICABLE = 1;
-    H264_BASELINE = 2;
-    H264_MAIN = 3;
-    H264_EXTENDED = 4;
-    H264_HIGH = 5;
-    H264_HIGH10 = 6;
-    H264_HIGH422 = 7;
-    H264_HIGH444_PREDICTIVE = 8;
-    H264_SCALABLE_BASELINE = 9;
-    H264_SCALABLE_HIGH = 10;
-    H264_STEREO_HIGH = 11;
-    H264_MULTIVIEW_HIGH = 12;
-};
-
-// TODO(dalesat): Replace with fuchsia.images.PixelFormat.
-enum PixelFormat {
-    UNKNOWN = 0;
-    I420 = 1; // 12bpp YUV planar 1x1 Y, 2x2 UV samples, a.k.a. YU12.
-    YV12 = 2; // 12bpp YVU planar 1x1 Y, 2x2 VU samples.
-    YV16 = 3; // 16bpp YVU planar 1x1 Y, 2x1 VU samples.
-    YV12A = 4; // 20bpp YUVA planar 1x1 Y, 2x2 VU, 1x1 A samples.
-    YV24 = 5; // 24bpp YUV planar, no subsampling.
-    NV12 = 6; // 12bpp with Y plane followed by a 2x2 interleaved UV plane.
-    NV21 = 7; // 12bpp with Y plane followed by a 2x2 interleaved VU plane.
-    UYVY = 8; // 16bpp interleaved 2x1 U, 1x1 Y, 2x1 V, 1x1 Y samples.
-    YUY2 = 9; // 16bpp interleaved 1x1 Y, 2x1 U, 1x1 Y, 2x1 V samples.
-    ARGB = 10; // 32bpp ARGB, 1 plane.
-    XRGB = 11; // 24bpp XRGB, 1 plane.
-    RGB24 = 12; // 24bpp BGR, 1 plane.
-    RGB32 = 13; // 32bpp BGRA, 1 plane.
-    MJPEG = 14; // MJPEG compressed.
-    MT21 = 15;
-};
-
-// TODO(dalesat): Replace with fuchsia.images.ColorSpace.
-enum ColorSpace {
-    UNKNOWN = 0;
-    NOT_APPLICABLE = 1;
-    JPEG = 2;
-    HD_REC709 = 3;
-    SD_REC601 = 4;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Text
-
-struct TextStreamType {
-    // TODO(dalesat): Define.
-    uint8 dummy;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Subpicture
-
-struct SubpictureStreamType {
-    // TODO(dalesat): Define.
-    uint8 dummy;
-};
diff --git a/fidl/fuchsia.mediacodec/codec.fidl b/fidl/fuchsia.mediacodec/codec.fidl
deleted file mode 100644
index e5f2bcc..0000000
--- a/fidl/fuchsia.mediacodec/codec.fidl
+++ /dev/null
@@ -1,1315 +0,0 @@
-// 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.
-
-library fuchsia.mediacodec;
-
-// See codec.md for detailed interface documentation.  The comments here are a
-// summary only.  Client implementers should see codec.md for more detail on any
-// message that doesn't seem sufficiently-described here.  Codec server
-// implementers should probably read codec.md before implementing.
-
-// Overview of operation:
-//
-// 1. Create
-//   * create via CodecFactory - see CodecFactory
-// 2. Get input constraints
-//   * OnInputConstraints() - sent unsolicited by codec shortly after codec
-//     creation.
-// 3. Provide input buffers
-//   * SetInputBufferSettings() / AddInputBuffer()
-// 4. Deliver input data
-//   * QueueInputPacket() + OnFreeInputPacket(), for as long as it takes,
-//     possibly working through all input packets repeatedly before...
-// 5. Get output constraints and format
-//   * OnOutputConfig() - may be delivered as early as before
-//     OnInputConstraints() by some codecs, but a client must tolerate as late
-//     as after substantial input data has been delivered including lots of
-//     input packet recycling via OnFreeInputPacket().
-//   * This message can arrive more than once before the first output data.
-// 6. Provide output buffers
-//   * SetOutputBufferSettings() / AddOutputBuffer()
-// 7. Data flows, with optional EndOfStream
-//   * OnOutputPacket() / RecycleOutputPacket() / QueueInputPacket() /
-//     OnFreeInputPacket() / QueueInputEndOfStream() / OnOutputEndOfStream()
-//
-// It's possible to re-use a Codec instance for another stream, and doing so
-// can sometimes skip over re-allocation of buffers.  This can be a useful thing
-// to do for cases like seeking to a new location - at the Codec interface that
-// can look like switching to a new stream.
-
-// CodecBufferConstraints
-//
-// This struct helps ensure that packet count and buffer space are sufficient
-// to avoid major problems.  For example, a video decoder needs sufficient
-// video frame buffers to hold all potential reference frames concurrently +
-// one more video buffer to decode into.  Else, the whole video decode pipe can
-// easily deadlock.
-//
-// The secondary purpose of this struct is to help ensure that packet count and
-// buffer space are sufficient to achieve reasonably performant operation.
-//
-// There are separate instances of this struct for codec input and codec output.
-struct CodecBufferConstraints {
-    // This is a version number the server sets on the constraints to allow the
-    // server to determine when the client has caught up with the latest
-    // constraints sent by the server.  The server won't emit output data until
-    // the client has configured output settings and buffers with a
-    // buffer_constraints_version_ordinal >= the latest
-    // buffer_constraints_version_ordinal that had
-    // buffer_constraints_action_required true.  See
-    // buffer_constraints_action_required comments for more.
-    //
-    // A buffer_constraints_version_ordinal of 0 is not permitted, to simplify
-    // initial state handling.  Other than 0, both odd and even version ordinals
-    // are allowed (in constrast to the stream_lifetime_ordinal, neither the
-    // client nor server ever has a reason to consider the latest version to be
-    // stale, so there would be no benefit to disallowing even values).
-    uint64 buffer_constraints_version_ordinal;
-
-    // default_settings
-    //
-    // These settings are "default" settings, not "recommended" settings.
-    //
-    // These "default" settings can be passed to SetInputBufferSettings() /
-    // SetOutputBufferSettings() as-is without modification, but a client doing
-    // that must still obey the semantics of packet_count_for_client, despite the
-    // codec server not having any way to really know the proper setting for
-    // that field.
-    //
-    // For CodecBufferConstraints fields whose names end in "recommended", the
-    // default_settings will have the corresponding setting field set to that
-    // recommended value.
-    //
-    // The codec promises that these default settings as-is (except for
-    // buffer_lifetime_ordinal) are guaranteed to
-    // satisfy the constraints indicated by the other fields of
-    // CodecBufferConstraints.  While client-side checking that these
-    // settings are within the constraints is likely unnecessary in the client,
-    // the client should still check that these values are within client-side
-    // reasonable-ness bounds before using these values, to avoid letting a codec
-    // server cause problems for the client.
-    //
-    // This structure will always have single_buffer_mode false.  See
-    // single_buffer_mode_allowed for whether single_buffer_mode true is allowed.
-    //
-    // The client must set the buffer_lifetime_ordinal field to a proper value
-    // before sending back to the server.  The 0 initially in this field will be
-    // rejected by the server if sent back as-is.  See comments on
-    // CodecPortBufferSettings.buffer_lifetime_ordinal.
-    CodecPortBufferSettings default_settings;
-
-    // For uncompresesd video, separate and complete frames, each in its own
-    // separate buffer (buffer-per-packet mode), is always a requirement.
-
-    // per_packet_buffer_bytes.*:
-    //
-    // These per-packet buffer bytes constraints apply to both buffer-per-packet
-    // mode and single-buffer mode (see single_buffer_mode).  If
-    // buffer-per-packet mode, the constraints apply to each buffer separately.
-    // If single-buffer mode, the constraints need to be multiplied by the number
-    // of packets to determine the constraints on the single buffer.
-
-    // per_packet_buffer_bytes_min:
-    //
-    // If a client is using buffer per packet mode, each buffer must be at least
-    // this large.  If a client is using single-buffer mode, the one buffer must
-    // be at least per_packet_buffer_bytes_min * packet_count_for_codec_min in
-    // size.
-    uint32 per_packet_buffer_bytes_min;
-    // Must be >= per_packet_buffer_bytes_min.  Delivering more than
-    // this per input packet might not perform any better, and in fact might
-    // perform worse.
-    uint32 per_packet_buffer_bytes_recommended;
-    // Must be >= per_packet_buffer_bytes_recommended.  Can be 0xFFFFFFFF if there
-    // is no explicitly-enforced limit.
-    uint32 per_packet_buffer_bytes_max;
-
-    // Minimum number of packet_count_for_codec.
-    //
-    // Re. input and output:
-    //
-    // This is a strict min for packet_count_for_codec, but a client can use more
-    // packets overall if the client wants to, by using a larger value for
-    // packet_count_for_codec and/or using a non-zero packets_for_client.  A good
-    // reason to do the former would be if the client might tend to deliver a few
-    // not-very-full buffers occasionally - or to have a few extra packets within
-    // which to satisfy codec_input_bytes_min.  A good reason to do the latter
-    // would be if a client needs to hold onto some packets for any "extra"
-    // duration.
-    //
-    // If a client specifies a larger packet_count_for_codec value than
-    // packet_count_for_codec_min, a server is permitted (but not encouraged) to
-    // not make progress until packet_count_for_codec are with the server,
-    // not merely packet_count_for_codec_min.
-    //
-    // For decoder input and audio encoder input: The packet_count_for_codec_min
-    // may or may not contain enough data to allow the codec to make progress
-    // without copying into an internal side buffer.  If there isn't enough data
-    // delivered in packet_count_for_codec_min packets to permit progress, the
-    // codec must copy into its own side buffer internally to make progress.
-    //
-    // If a client intends to use extra packets for client-side purposes, the
-    // client should specify the extra packets in packets_for_client instead of
-    // packet_count_for_codec, but packet_count_for_codec must still be >=
-    // packet_count_for_codec_min.
-    //
-    // See codec.md for more on packet_count_for_codec_min.
-    uint32 packet_count_for_codec_min;
-
-    // This must be at least packet_count_for_codec_min and at most
-    // packet_count_for_codec_recommended_max.
-    //
-    // This value is likely to be used as-is by most clients, so if having one
-    // additional packet is a big performance win in a large percentage of
-    // scenarios, it can be good for the server to include that additional packet
-    // in this value.
-    uint32 packet_count_for_codec_recommended;
-
-    // This can be the same as packet_count_for_codec_max or can be lower.
-    // Values above this value and <= packet_count_for_codec_max are not
-    // recommended by the codec, but should still work given sufficient resoures
-    // available to both the client and the codec.
-    uint32 packet_count_for_codec_recommended_max;
-
-    // This can be 0xFFFFFFFF if there's no codec-enforced max, but codecs are
-    // encouraged to set a large but still plausibly-workable max, and clients
-    // are encouraged to request a number of packets that isn't excessively large
-    // for the client's scenario.
-    uint32 packet_count_for_codec_max;
-
-    // Normally this would be an implicit 0, but for now we have a min so we can
-    // force the total number of packets to be a specific number that we know
-    // works for the moment.
-    uint32 packet_count_for_client_min;
-
-    // packet_count_for_client_max
-    //
-    // The client must set packet_count_for_client to be <=
-    // packet_count_for_client_max.
-    //
-    // This value must be at least 1.  This can be 0xFFFFFFFF if there's no
-    // codec-enforced max.  Clients are encouraged to request a number of
-    // packets that isn't excessively large for the client's scenario.
-    uint32 packet_count_for_client_max;
-
-    // single_buffer_mode_allowed false allows a codec that's not required to
-    // support single-buffer mode for a given input or output the ability to
-    // decline to support single-buffer mode on that input/output.
-    //
-    // All encoder output, regardless of audio or video: server support for
-    // single-buffer mode is optional.  Please see codec.md for all the rules
-    // regarding single-buffer mode on output before using single-buffer mode on
-    // an output.
-    //
-    // Audio decoder output: server support for single-buffer mode is required.
-    //
-    // Video decoder output: There is little reason for a video decoder to
-    // support single-buffer mode on output.  Nearly all video decoders will set
-    // this to false for their output.
-    //
-    // All decoder inputs: Servers must support single-buffer mode on input.  The
-    // client is responsible for managing the input buffer space such that
-    // filling an input packet doesn't over-write any portion of an input packet
-    // already in flight to the codec.
-    //
-    // Encoder inputs: Server support for single-buffer mode on encoder input is
-    // optional.  This is more often useful for audio than for video.
-    //
-    // Support for buffer-per-packet mode is always required on both input and
-    // output, regardless of codec type.
-    bool single_buffer_mode_allowed;
-
-    // If true, the buffers need to be physically contiguous pages, such as can be
-    // allocated using zx_vmo_create_contiguous().
-    bool is_physically_contiguous_required;
-    // VERY TEMPORARY HACK / KLUDGE - we want the BufferAllocator (or one of the
-    // participant drivers that needs physically contiguous buffers) to call
-    // zx_vmo_create_contiguous(), definitely not the Codec client, but until the
-    // BufferAllocator can be reached from a driver, this is to grant the client
-    // special powers it really shouldn't have, very temporarily until
-    // BufferAllocator is hooked up properly at which point this can be removed.
-    // Strictly speaking we could reverse which end allocates buffers in the Codec
-    // interface to avoid this hack even before BufferAllocator, but the overall
-    // path seems shorter if we jump directly from this to using BufferAllocator.
-    handle? very_temp_kludge_bti_handle;
-};
-
-// CodecOutputConfig
-//
-// The codec-controlled output configuration, including both
-// CodecBufferConstraints for the output and CodecFormatDetails for the output.
-//
-// TODO(dustingreen): Need a better name for this struct, but still short
-// hopefully.  It's stuff the codec gets to control, not the client.  It's
-// different than output buffer settings, which the client does get to control
-// to some extent.  It's different than any configurable output settings the
-// client might specifiy for output of an encoder.
-struct CodecOutputConfig {
-    // A client which always immediately re-configures output buffers on reciept
-    // of OnOutputConfig() with buffer_constraints_action_required true can safely
-    // ignore this field.
-    //
-    // A client is permitted to ignore an OnOutputConfig() message even with
-    // buffer_constraints_action_required true if the client knows the server has
-    // already been told to discard the remainder of the stream with the same
-    // stream_lifetime_ordinal or if this stream_lifetime_ordinal field is set to
-    // 0.  The server is required to re-send needed output config via
-    // OnOutputConfig() with new stream_lifetime_ordinal and
-    // buffer_constraints_action_required true, if the the most recent completed
-    // server-side output config isn't what the server wants/needs yet for the
-    // new stream.
-    uint64 stream_lifetime_ordinal;
-
-    // buffer_constraints_action_required
-    //
-    // When the buffer constraints are delivered, they indicate whether action is
-    // required.  A false value here permits delivery of constraints which are
-    // fresher without forcing a buffer reconfiguration.  If this is false, a
-    // client cannot assume that it's safe to immediately re-configure output
-    // buffers.  If this is true, the client can assume it's safe to immediately
-    // configure output buffers once.
-    //
-    // A client is permitted to ignore buffer constraint versions which have
-    // buffer_constraints_action_required false.  The server is not permitted to
-    // change buffer_constraints_action_required from false to true for the same
-    // buffer_constraints_version_ordinal.
-    //
-    // For each configuration, a client must use new buffers, never buffers that
-    // were prevoiusly used for anything else, and never buffers previously used
-    // for any other Codec purposes.  This rule exists for multiple good reasons,
-    // relevant to both mid-stream changes, and changes on stream boundaries.
-    // A client should just use new buffers each time.
-    //
-    // When this is true, the server has already de-refed as many low-level
-    // output buffers as the server can while still performing efficient
-    // transition to the new buffers and will de-ref the rest asap.  A Sync() is
-    // not necessary to achieve non-overlap of resource usage to the extent
-    // efficiently permitted by the formats involved.
-    //
-    // If buffer_constraints_action_required is true, the server _must_ not
-    // deliver more output data until after output buffers have been configured
-    // (or re-configured) by the client.
-    //
-    // See codec.md for more on buffer_constraints_action_required.
-    bool buffer_constraints_action_required;
-    CodecBufferConstraints buffer_constraints;
-
-    // format_details
-    //
-    // It's up to the client to determine if a change in
-    // format_details.format_details_version_ordinal implies any client action is
-    // required, based on particular fields in format_details vs. any old value.
-    // The server guarantees that if the format has changed, then
-    // format_details.format_details_version_ordinal will change, but a change to
-    // format_details.format_details_version_ordinal does not guarantee that the
-    // format details actually changed.  Servers are strongly encouraged to not
-    // change format_details.format_details_version_ordinal other than before the
-    // first output data of a stream unless there is a real mid-stream format
-    // change in the stream.  Unnecessary mid-stream format changes can cause
-    // simpler clients that have no need to handle mid-stream format changes to
-    // just close the channel.  Format changes before the first output data of a
-    // stream are not "mid-stream" in this context - those can be useful for
-    // stream format detection / setup reasons.
-    //
-    // Note that in case output buffers don't really need to be re-configured
-    // despite a format change, a server is encouraged, but not required, to
-    // set buffer_constraints_action_required false on the message that conveys
-    // the new format details.  Simpler servers may just treat the whole output
-    // situation as one big thing and demand output buffer reconfiguration on any
-    // change in the output situation.
-    //
-    // A client may or may not actually handle a new buffer_constraints with
-    // buffer_constraints_action_required false, but the client should always
-    // track the latest format_details.
-    //
-    // An updated format_details is ordered with respect to emitted output
-    // packets, and applies to all subsequent packets until the next
-    // format_details with larger version_ordinal.  A simple client that does not
-    // intend to handle mid-stream format changes should still keep track of the
-    // most recently received format_details until the first output packet
-    // arrives, then lock down the format details, handle those format details,
-    // and verify that any format_details.format_details_version_ordinal received
-    // from the server is the same as the locked-down format_details, until the
-    // client is done with the stream.  Even such a simple client must tolerate
-    // format_details.format_details_version_ordinal changing multiple times
-    // before the start of data output from a stream (any stream - the first
-    // stream or a subsequent stream).  This allows a codec to request that
-    // output buffers and output format be configured speculatively, and for the
-    // output config to be optionally adjusted by the server before the first
-    // data output from a stream after the server knows everything it needs to
-    // know to fully establish the initial output format details.  This
-    // simplifies codec server implementation, and allows a clever codec server
-    // to guess it's output config for lower latency before any input data, while
-    // still being able to fix the output config (including format details) if
-    // the guess turns out to be wrong.
-    //
-    // Whether the format_details.format_details_version_ordinal will actually
-    // change mid-stream is a per-codec and per-stream detail that is not
-    // specified in comments here, and in most cases also depends on whether the
-    // format changes on the input to the codec.  Probably it'll be fairly common
-    // for a client to use a format which technically supports mid-stream format
-    // change, but the client happens to know that none of the streams the client
-    // intends to process will ever have a mid-stream format change.
-    CodecFormatDetails format_details;
-};
-
-// Default values for input and output
-// CodecBufferConstraints.default_settings.packet_count_for_codec.
-//
-// These are defined as "const" in FIDL to avoid all server implementations
-// needing to separately define their own values, and these should be
-// reasonable as default values, but strictly speaking this is not intended to
-// promise that this value won't change from build to build.  If a client cares
-// about a specific number, the client should separately define what that
-// number is and ensure that CodecPortBufferSettings.packet_count_for_client is
-// at least large enough.
-//
-// In contrast to packet_count_for_client, the packet_count_for_codec is much
-// more codec-specific, so this file has no numbers for that - each codec will
-// set those as appropriate for the specific codec.
-//
-// These are not "recommended" values, only "default" values, in the sense that
-// the codec doesn't really know what the correct setting for these values is
-// for a given client, and if the default is not appropriate for a client,
-// large problems could result such as deadlock.  See the comments on
-// packet_count_for_client.
-//
-// Despite these defaults, every client should ideally care about the
-// packet_count_for_client setting and should ensure that the setting is at
-// least large enough to cover the number of packets the client might ever need
-// to camp on for any non-transient duration concurrently.  The defaults are
-// only intended to be plausible for some clients, not all clients.
-//
-// One for the client to be filling and one in transit.
-const uint32 kDefaultInputPacketCountForClient = 2;
-// One for the client to be rendering, and one in transit.
-const uint32 kDefaultOutputPacketCountForClient = 2;
-
-// For input, this is the default on a fairly arbitrary basis.
-//
-// TODO(dustingreen): Do we want the default for audio encoding to be
-// single_buffer_mode true instead?  If so, we may split this up by audio/video
-// encoder/decoder.
-const bool kDefaultInputIsSingleBufferMode = false;
-const bool kDefaultOutputIsSingleBufferMode = false;
-
-// CodecPortBufferSettings
-//
-// See relevant corresponding constraints in CodecBufferConstraints.  The
-// settings must satisfy the constraints.
-//
-// The client informs the codec of these settings and then separately informs
-// the codec of each buffer.
-//
-// TODO(dustingreen): Rename from CodecPortBufferSettings to CodecBufferSettings
-// in a separate CL (after some other stuff is out of the way first).
-struct CodecPortBufferSettings {
-    // buffer_lifetime_ordinal
-    //
-    // The containing message starts a new buffer_lifetime_ordinal.
-    //
-    // There is a separate buffer_lifetime_ordinal for input vs. output.
-    //
-    // Re-use of the same value is not allowed.  Values must be odd.  Values must
-    // only increase (increasing by more than 2 is permitted).
-    //
-    // A buffer_lifetime_ordinal lifetime starts at SetInputBufferSettings() or
-    // SetOutputBufferSettings(), and ends at the the earlier of
-    // CloseCurrentStream() with release_input_buffers/release_output_buffers set
-    // or SetOutputBufferSettings() with new buffer_lifetime_ordinal in the case
-    // of mid-stream output config change.
-    //
-    // See codec.md for more on buffer_lifetime_ordinal.
-    uint64 buffer_lifetime_ordinal;
-
-    // buffer_constraints_version_ordinal
-    //
-    // This value indicates which version of constraints the client is/was aware
-    // of so far.
-    //
-    // For input, this must always be 0 because constraints don't change for
-    // input (settings can change, but there's no settings vs current constraints
-    // synchronization issue on input).
-    //
-    // For output, this allows the server to know when the client is sufficiently
-    // caught up before the server will generate any more output.
-    //
-    // When there is no active stream, a client is permitted to re-configure
-    // buffers again using the same buffer_constraints_version_ordinal.
-    //
-    // See codec.md for more on buffer_constraints_version_ordinal.
-    uint64 buffer_constraints_version_ordinal;
-
-    // The total packet count is split into two pieces to disambiguate how many
-    // packets are allocated for the client to hold onto for whatever reason, vs.
-    // how many packets are allocated for the server to hold onto for whatever
-    // reason.
-    //
-    // Extra packets to provide slack for peformance reasons can be in either
-    // category, but typically packet_count_for_codec_recommended will already
-    // include any performance-relevant slack for the server's benefit.
-
-    // packet_count_for_codec
-    //
-    // How many packets the client is allocating for the codec server's use.
-    // This must be >= CodecBufferConstraints.packet_count_for_codec_min.  If
-    // constraints change such that this would no longer be true, the server will
-    // send an OnOutputConfig() event.
-    //
-    // The codec server is allowed to demand that all of packet_count_for_codec
-    // become free before making further progress, even if
-    // packet_count_for_codec is > packet_count_for_codec_min.
-    //
-    // A reasonable value for this is
-    // CodecBufferConstraints.packet_count_for_codec_recommended.
-    //
-    // See codec.md for more on packet_count_for_codec.
-    uint32 packet_count_for_codec;
-
-    // packet_count_for_client
-    //
-    // This must be at least 1.  The server will close the channel if this is 0.
-    //
-    // How many packets the client is allocating for the client's use.  The
-    // client may hold onto this many packets for arbitrarily-long duration
-    // without handing these packets to the codec, and despite doing so, the
-    // codec will continue to make progress and function normally without getting
-    // stuck.  The client holding onto additional packets transiently is ok, but
-    // the client needs to hand those additional packets back to the codec
-    // eventually if the client wants the codec to make further progress.
-    //
-    // In addition to this value needing to include at least as many packets as
-    // the client ever intends to concurrently camp on indefinitely, any extra
-    // slack to benefit client-side performance should also be included here.
-    //
-    // A typical value for this could be at least 2, but it depends strongly on
-    // client implementation and overall client buffering goals.  It is up to the
-    // client to determine how many packets are needed in this category by any
-    // parts of the overall system that will be holding onto packets for any
-    // reason.  Those parts of the system should have a documented and possibly
-    // queryable defined value to help determine this number.  Setting this value
-    // lower than it actaully needs to be can result in the codec not making
-    // progress as it sits waiting for packets, with the client unable to recycle
-    // any more packets to the codec.  That situation can be difficult to
-    // diagnose, while excessively-large values here are wasteful, so care is
-    // warranted to set this value properly.
-    uint32 packet_count_for_client;
-
-    // per_packet_buffer_bytes
-    //
-    // In buffer-per-packet mode, we require that each buffer have usable bytes
-    // equal to per_packet_buffer_bytes.  Use of differently-sized low-level
-    // buffers is possible, but the size of the portion used via the Codec
-    // interface per CodecBuffer must be the same for all the buffers.
-    //
-    // In single-buffer mode, we require the portion of the low-level buffer used
-    // via the Codec interface to be size (packet_count_for_codec +
-    // packet_count_for_client) * per_packet_buffer_bytes.
-    //
-    // TODO(dustingreen): determine if we need to relax these restrictions a bit
-    // for convenience when using gralloc video buffers.
-    uint32 per_packet_buffer_bytes;
-
-    // If true, there is only one buffer with index 0 which all packets
-    // implicitly refer to.  If false, the packet_index and buffer_index are 1:1,
-    // and each packet refers to its corresponding buffer.
-    //
-    // While it's possible to set up single_buffer_mode false with each buffer
-    // referring to the same underlying VMO, single_buffer_mode true is more
-    // efficient for that case since only one mapping is created.
-    bool single_buffer_mode;
-};
-
-// CodecBuffer
-//
-// The CodecBuffer struct represents a pre-configured buffer.
-//
-// Both input and output uses CodecBuffer(s), but the two sets of buffers are
-// separate.
-//
-// The client uses SetInputBufferSettings() + AddInputBuffer() * N to inform
-// the codec about all the input buffers.
-//
-// The client uses SetOutputBufferSettings() + AddOutputBuffer() * N to inform
-// the codec about all the output buffers.
-//
-// When single_buffer_mode is true, there is only buffer_index 0 shared by all
-// CodecPacket(s) of the relevant input or output.  When single_buffer_mode is
-// false, the buffer_index equals the packet_index.
-struct CodecBuffer {
-    // When using AddOutputBuffer()/AddInputBuffer(), this must match the
-    // buffer_lifetime_ordinal of the most recent
-    // SetOutputBufferSettings()/SetInputBufferSettings().
-    uint64 buffer_lifetime_ordinal;
-
-    // Buffers must be added via AddOutputBuffer() / AddInputBuffer() in order by
-    // buffer_index, and the buffer_index is always equal to 0 or equal to the
-    // packet_index (depending on single_buffer_mode true or false), but it's
-    // still nice to have CodecBuffer include the buffer_index if only for easier
-    // debugging.
-    uint32 buffer_index;
-
-    // For each new buffer_lifetime_ordinal, a client must use new low-level
-    // buffers.  This rule exists for multiple very good reasons, and is relevant
-    // to mid-stream changes, changes on stream boundaries, and both input and
-    // output buffers.  A new buffer_lifetime_ordinal needs new low-level
-    // buffers, not just new CodecBuffer(s).  If you find yourself copying
-    // compressed input data into new low-level input buffers solely due to this
-    // rule, consider asking the source of the data for the ability to directly
-    // fill new VMOs.  The rule exists for good reasons, even for input buffers.
-    //
-    // The previous paragraph does not prohibit carving up VMOs into sub-pieces
-    // and using different sub-pieces as different CodecBuffer(s), with some VMOs
-    // used for more than one CodecBuffer and possibly others used for only one
-    // CodecBuffer.  While this is permitted and enables some optimizations, it's
-    // not expected to be particularly common.
-    //
-    // See codec.md for more on CodecBufferData, and more on why we never re-use
-    // the same low-level buffers for different buffer_lifetime_ordinal(s).
-    CodecBufferData data;
-};
-
-// CodecBufferData
-//
-// For the moment, a VMO per buffer is the only type of buffer.
-//
-// This is extremely likely to change significantly when adding gralloc stuff,
-// but the idea with this union is to have a struct per logical way of storing
-// the data.  Any multi-domain storage within a gralloc buffer will likely be
-// only indirectly represented here.
-union CodecBufferData {
-    CodecBufferDataVmo vmo;
-
-    // TODO(dustingreen): add the gralloc way
-};
-
-// CodecBufferDataVmo
-//
-// Details for a buffer backed by a VMO.
-struct CodecBufferDataVmo {
-    // The same VMO can be used by more than one CodecBuffer (only of the same
-    // buffer_lifetime_ordinal), but each vmo_handle must be a separate handle.
-    handle<vmo> vmo_handle;
-
-    // Offset within the VMO of the first usable byte.  Must be < the VMO's size
-    // in bytes.
-    uint64 vmo_usable_start;
-
-    // VMO-relative offset that's one past the last usable byte.  This can point
-    // one byte beyond the end of the VMO if desired.  In other words, this can
-    // be equal to the VMO's size, to indicate that the last byte of the VMO is
-    // usable (and possibly many byte before that, depending on
-    // vmo_usable_start).
-    uint64 vmo_usable_size;
-};
-
-// CodecPacketHeader
-//
-// When referring to a free packet, we use CodecPacketHeader alone instead of
-// CodecPacket, since while a packet is free it doesn't really have meaningful
-// offset or length etc.
-//
-// A populated CodecPacket also has a CodecPacketHeader.
-struct CodecPacketHeader {
-    // This is which buffer configuration lifetime this header is referring to.
-    //
-    // A packet_index is only really meaningful with respect to a particular
-    // buffer_lifetime_ordinal.
-    //
-    // See CodecPortBufferSettings.buffer_lifetime_ordinal.
-    //
-    // For QueueInputPacket(), a server receiving a buffer_lifetime_ordinal that
-    // isn't the current input buffer_lifetime_ordinal will close the channel.
-    //
-    // For OnFreeInputPacket() and RecycleOutputPacket(), the reciever (client or
-    // server) must ignore a message with stale buffer_lifetime_ordinal.
-    uint64 buffer_lifetime_ordinal;
-
-    // The overall set of packet_index values is densely packed from 0..count-1
-    // for input and output separately.  They can be queued in any order.
-    //
-    // Both the client and server should validate the packet_index against the
-    // known bound and disconnect if it's out of bounds.
-    //
-    // When running in buffer-per-packet mode, the packet_index is also the
-    // buffer index.  When running in single-buffer mode, the buffer index is
-    // always 0 referring to the single buffer.
-    //
-    // The packet_index values don't imply anything about order of use of
-    // packets. The client should not expect the ordering to remain the same over
-    // time - the codec is free to hold on to an input or output packet for a
-    // while during which other packet_index values may be used multiple times.
-    //
-    // For a given properly-functioning Codec instance, packet_index values will
-    // be unique among concurrently-outstanding packets.  Servers should validate
-    // that a client isn't double-using a packet and clients should validate as
-    // necessary to avoid undefined or unexpected client behavior.
-    uint32 packet_index;
-};
-
-// CodecPacket
-//
-// A CodecPacket represents a chunk of input or output data to or from a codec.
-//
-// codec output:
-// While the CodecPacket is outstanding with the client via OnOutputPacket(),
-// the codec will avoid modifying the referenced output data.  After the client
-// calls RecycleOutputPacket(packet_index), the codec is notified that the
-// client is again ok with the referenced data changing.
-//
-// codec input:
-// The client initially has all packet_index(es) available to fill, and later
-// gets packet_index(s) that are again ready to fill via OnFreeInputPacket().
-// The client must not modify the referenced data in between QueueInputPacket()
-// and OnFreeInputPacket().
-struct CodecPacket {
-    CodecPacketHeader header;
-
-    // Which buffer this packet refers to.  For single-buffer mode this will
-    // always be 0, but for multi-buffer mode, a given in-flight interval of a
-    // packet can refer to any buffer.  The packet has an associated buffer only
-    // while the packet is in-flight, not while the packet is free.
-    //
-    // The default value makes accidental inappropriate use of index 0 less
-    // likely (will tend to complain in an obvious way if not filled out instead
-    // of a non-obvious data corruption when decoding buffer 0 repeatedly instead
-    // of the correct buffers).
-    uint32 buffer_index = 0x80000000;
-
-    // stream_lifetime_ordinal
-    //
-    // The value 1 is the lowest permitted value after codec creation.  Values
-    // sent by the client must be odd.  Values must only increase.
-    //
-    // A stream_lifetime_ordinal represents the lifetime of a stream.  All
-    // messages that are specific to a stream have the stream_lifetime_ordinal
-    // value and the value is the same for all messages relating to a given
-    // stream.
-    //
-    // See codec.md for more on stream_lifetime_ordinal.
-    uint64 stream_lifetime_ordinal;
-
-    // start_offset and valid_length_bytes
-    //
-    // Which part of the relevant buffer is this packet using.  These are valid
-    // for input data that's in-flight to the codec, and are valid for output data
-    // from the codec.
-    //
-    // For compressed formats and uncompressed audio, the data in
-    // [start_offset, start_offset + valid_length_bytes) is the contiguously valid
-    // data refered to by this packet.
-    //
-    // For uncompressed video frames, CodecFormatDetails is the primary means of
-    // determining which bytes are relevant.  The offsets in CodecFormatDetails
-    // are relative to the start_offset here.  The valid_length_bytes must be
-    // large enough to include the full last line of pixel data, including the
-    // full line stride of the last line (not just the width in pixels of the
-    // last line).
-    //
-    // Despite these being filled out, some uncompressed video buffers are of
-    // types that are not readable by the CPU.  These fields being here don't
-    // imply there's any way for the CPU to read an uncompressed frame.
-    //
-    // TODO(dustingreen): Do we have any reason to require that these be filled
-    // out for opaque uncompressed video frames that the CPU can't read?  In that
-    // case do we want to require them just so they can be potentially passed on
-    // to a HW renderer in case the HW renderer has any use for them?  Or more
-    // likely, it may just be that these tend to refer to the whole size of an
-    // uncompressed buffer, with format_details taking care of specifying which
-    // bytes are actually relevant.
-    uint32 start_offset;
-
-    // valid_length_bytes
-    //
-    // This must be > 0.
-    //
-    // The semantics for valid data per packet vary depending on data type as
-    // follows.
-    //
-    // uncompressed video - A video frame can't be split across packets.  Each
-    // packet is one video frame.
-    //
-    // uncompressed audio - Regardless of float or int, linear or uLaw, or number
-    // of channels, a packet must contain an non-negative number of complete
-    // audio frames, where a single audio frame consists of data for all the
-    // channels for the same single point in time.  Any codec-specific internal
-    // details re. lower rate sampling for LFE channel or the like should be
-    // hidden by the Codec server implementation.
-    //
-    // compressed data input - A packet must contain at least one byte of data.
-    // See also codec_input_bytes_min.  Splitting AUs at arbitrary byte
-    // boundaries is permitted, including at boundaries that are in AU headers.
-    //
-    // compressed data output - The codec is not required to fully fill each
-    // output packet's buffer.
-    uint32 valid_length_bytes;
-
-    // This value is not strictly speaking a timestamp.  It is an arbitrary
-    // unsigned 64-bit number that, under some circumstances, will be passed by a
-    // codec unmodified from an input packet to the exactly-corresponding output
-    // packet.
-    //
-    // For timestamp_ish values to be propagated from input to output the
-    // following conditions must be true:
-    //  * promise_separate_access_units_on_input must be true
-    //  * has_timestamp_ish must be true for a given input packet, to have that
-    //    timestamp_ish value (potentially) propagate through to an output
-    //  * the Codec instance itself decides (async) that the input packet
-    //    generates an output packet - if a given input never generates an output
-    //    packet then the timestamp_ish value on the input will never show up on
-    //    any output packet - depending on the characteristics of the input and
-    //    output formats, and whether a decoder is willing to join mid-stream, etc
-    //    this can be more or less likely to occur, but clients should be written
-    //    to accomodate timestamp_ish values that are fed on input but never show
-    //    up on output, at least to a reasonable degree (not crashing, not
-    //    treating as an error).
-    //
-    // See codec.md for more on timestamp_ish.
-    bool has_timestamp_ish;
-    uint64 timestamp_ish;
-
-    // start_access_unit
-    //
-    // If promise_separate_access_units_on_input (TODO(dustingreen): or any
-    // similar mode for output) is true, this bool must be set appropriately
-    // depending on whether byte 0 _is_ or _is not_ the start of an access unit.
-    // The client is required to know, and required to set this boolean properly.
-    // The server is allowed to infer that when this boolean is false, byte 0 is
-    // the first byte of a continuation of a previously-started AU.  (The byte at
-    // start_offset is "byte 0".)
-    //
-    // If promise_separate_access_units_on_input is false, this boolean is
-    // ignored.
-    bool start_access_unit;
-
-    // known_end_access_unit
-    //
-    // A client is never required to set this boolean to true.
-    //
-    // If promise_separate_access_units_on_input is true, for input data, this
-    // boolean must be false if the last byte of this packet is not the last byte
-    // of an AU, and this boolean _may_ be true if the last byte of this packet
-    // is the last byte of an AU.  A client delivering one AU at a time that's
-    // interested in the lowest possible latency via the decoder should set this
-    // boolean to true when it can be set to true.
-    //
-    // If promise_separate_access_units_on_input is false, this boolean is
-    // ignored.
-    bool known_end_access_unit;
-};
-
-// Codec
-//
-// The Codec interface exists to anchor the configuration of input and output
-// buffers, and depending on Codec server hosting strategy, the Codec inteface
-// can, in some configurations, be 1:1 with a codec isolate (process),
-// especially when using SW codecs.  The Codec can be used to process up to one
-// stream at a time.
-//
-// Descriptions of actions taken by methods of this interface and the states of
-// things are given as if the methods are synchronously executed by the codec
-// server, but in reality, as is typical of FIDL interfaces, the message
-// processing is async.  The states described are to be read as the state from
-// the client's point of view unless otherwise stated.  Events coming back from
-// the server are of course delivered async, and a client that processes more
-// than one stream per Codec instance needs to care whether a given event is
-// from the current stream vs. some older soon-to-be-gone stream.
-//
-// The Sync() method's main purpose is to enable the client to robustly prevent
-// having both old and new buffers allocated in the system at the same time,
-// since media buffers can be significantly large, depending. The Sync() method
-// achieves this by only delivering it's response when all previous calls to
-// the Codec interface have actually taken effect in the StreamControl ordering
-// domain. Sync() can also be used to wait for the codec server to catch up if
-// there's a possibility that a client might otherwise get too far ahead of the
-// Codec server, by for example requesting creation of a large number of
-// streams in a row.  It can also be used during debugging to ensure that a
-// codec server hasn't gotten stuck.  Calling Sync() is entirely optional and
-// never required for correctness - only potentially required to de-overlap
-// resource usage.
-//
-// Semi-trusted Codec server - SW decoders run in an isolate (with very few
-// capabilities) just in case the decoding SW has a vulnerability which could
-// be used to take over the Codec server.  Clients of the codec interface using
-// decoders and processing streams of separate security contexts, to a greater
-// extent than some other interfaces, need to protect themselves against
-// invalid server behavior, such as double-free of a packet_index and any other
-// invalid server behavior.  Having fed in compressed data of one security
-// context, don't place too much trust in a single Codec instance to not mix
-// data among any buffers that Codec server has ever been told about.  Instead,
-// create separate Codec instances for use by security-separate client-side
-// contexts. While the picture for HW-based decoders looks somewhat different
-// and is out of scope of this paragraph, the client should always use separate
-// Codec instances for security-separate client-side contexts.
-interface Codec {
-    // EnableOnStreamFailed()
-    //
-    // Permit the server to use OnStreamFailed() instead of the server just
-    // closing the whole Codec channel on stream failure.
-    //
-    // If the server hasn't seen this message by the time a stream fails, the
-    // server will close the Codec channel instead of sending OnStreamFailed().
-    1: EnableOnStreamFailed();
-
-    // OnStreamFailed()
-    //
-    // The stream has failed, but the Codec instance is still usable for a new
-    // stream.
-    //
-    // This message is only ever sent by the server if the client previously sent
-    // EnableOnStreamFailed().  If the client didn't send EnableOnStreamFailed()
-    // then the server closes the Codec channel instead.
-    //
-    // Codec server implementations are encouraged to handle stream errors (and
-    // ideally to also report them via error_ bools of OnOutputPacket() and
-    // OnOutputEndOfStream()) without failing the whole stream, but if a codec
-    // server is unable to do that, but still can cleanly contain the failure to
-    // the stream, the codec server can (assuming EnableOnStreamFailed() was
-    // called) use OnStreamFailed() to indicate the stream failure to the client
-    // without closing the Codec channel.
-    //
-    // An ideal Codec server handles problems with input data without sending
-    // this message, but sending this message is preferred vs. closing the server
-    // end of the Codec channel if the Codec server can 100% reliably contain the
-    // stream failure to the stream, without any adverse impact to any later
-    // stream.
-    //
-    // No further messages will arrive from the server regarding the failed
-    // stream.  This includes any OnOutputEndOfStream() that the client would
-    // have otherwise expected.
-    //
-    // TODO(dustingreen): Add at least an error_message string and _maybe_ a
-    // zx_status_t, though that might tend to encourage mis-use of zx_status_t so
-    // maybe just error_message for quicker debugging on the client side.  Also
-    // plumb from CodecAdapterH264 and similar.
-    2: -> OnStreamFailed(uint64 stream_lifetime_ordinal);
-
-    // OnInputConstraints()
-    //
-    // The server sends this shortly after Codec creation to indicate input
-    // buffer constraints.  The "min" and "max" input constraints don't change
-    // for the life of the Codec.
-    //
-    // The "max" values for buffer size and count are large enough to support the
-    // most demanding format the server supports on input.  The "recommended"
-    // values should be workable for use with the input CodecFormatDetails
-    // conveyed during Codec creation.  The "recommended" values are not
-    // necessarily suitable if the client uses QueueInputFormatDetails() to
-    // change the input format.  In that case it's up to the client to determine
-    // suitable values, either by creating a new Codec instance instead, or
-    // knowing suitable values outside the scope of this protocol.
-    //
-    // See comments on CodecBufferConstraints.
-    //
-    // This message is guaranteed to be sent unsolicited to the Codec client
-    // during or shortly after Codec creation.  Clients should not depend on this
-    // being the very first message to arrive at the client.  OnOutputConfig()
-    // may be sent first by some codecs that already know their initial output
-    // config without any input data, to encourage (but not stictly require) the
-    // client to configure output buffers before feeding the first input, to
-    // avoid a wasteful OnOutputConfig() being generated for that first stream if
-    // the client has started configuring output but isn't done configuring
-    // output before the client sends the first input data for the first stream.
-    // A client is free to ignore OnOutputConfig() with a stale
-    // stream_lifetime_ordinal, but handling OnOutputConfig() with
-    // stream_lifetime_ordinal 0 (if any are sent) can help reduce latency to
-    // first output.  See OnOutputConfig() for more details.
-    //
-    // The "min" and "max" input constraints are guaranteed not to change for a
-    // given Codec instance.  The "recommended" values may effectively change
-    // when the server processes QueueInputFormatDetails().  There is not any way
-    // in the protocol short of creating a new Codec instance for the client to
-    // get those new "recommended" values.
-    //
-    // TODO(dustingreen): Maybe provide a way for the client to get updated
-    // "recommended" values for input, maybe only on request rather than via this
-    // event, to keep things simpler for simpler clients.  Maybe separate the
-    // recommendations from the constraints.
-    3: -> OnInputConstraints(CodecBufferConstraints input_constraints);
-
-    // SetInputBufferSettings() and AddInputBuffer()
-    //
-    // Configuring input buffers consists of calling SetInputBufferSettings()
-    // followed by a number of calls to AddInputBuffer() equal to the number of
-    // buffers set via SetInputBufferSettings().  In buffer-per-packet mode, this
-    // is the same as the number of packets.  In single-buffer mode, this is 1.
-    //
-    // After OnInputConstraints(), the client uses these two methods to set up
-    // input buffers and packets.
-    //
-    // Configuring input buffers is required before QueueInputPacket().
-    //
-    // The client can also re-set-up input buffers any time there is no current
-    // stream.  The client need not wait until all previously-set-up input
-    // buffers are with the client via OnFreeInputPacket().  The old
-    // buffer_lifetime_ordinal just ends.  See codec.md for more info on "buffer
-    // lifetime".
-    //
-    // The recommended way to de-overlap resource usage (when/if the client wants
-    // to) is to send CloseCurrentStream() with release_input_buffers true then
-    // send Sync() and wait for its response before allocating any new buffers.
-    // How to cause other parts of the system to release their references on
-    // low-level buffers is outside the scope of this interface.
-    //
-    // This call ends any previous buffer_lifetime_ordinal, and starts a new one.
-    4: SetInputBufferSettings(CodecPortBufferSettings input_settings);
-
-    // The client is required to add all the input buffers before sending any
-    // message that starts a new stream else the codec will close the Codec
-    // channel.
-    //
-    // When the last buffer is added with this message, all the input packets
-    // effectively jump from non-existent to free with the client.  The Codec
-    // will not generate an OnFreeInputPacket() for each new input packet.  The
-    // client can immediately start sending QueueInputPacket() after sending the
-    // last AddInputBuffer().
-    5: AddInputBuffer(CodecBuffer buffer);
-
-    // OnOutputConfig()
-    //
-    // This event informs the client of new output config.  The server will send
-    // at least one of these messages before the first output packet of a stream,
-    // but that message might not have buffer_constraints_action_required true.
-    //
-    // If buffer_constraints_action_required is true and the
-    // stream_lifetime_ordinal matches the current stream, the client must react
-    // by configuring or re-configuring output buffers.
-    //
-    // Some clients may prefer not to support mid-stream output config changes,
-    // but even those clients are required to process OnOutputConfig() messages
-    // up to the first output packet of each stream, as OnOutputConfig() is used
-    // for stream format detection as well as for potential mid-stream output
-    // config changes.
-    //
-    // For more on OnOutputConfig(), see cocec.md.
-    6: -> OnOutputConfig(CodecOutputConfig output_config);
-
-    // SetOutputBufferSettings() and AddOutputBuffer()
-    //
-    // These are not permitted until after the first OnOutputConfig().
-    //
-    // Roughly speaking, these messages are sent in response to OnOutputConfig()
-    // with buffer_constraints_action_required true.
-    //
-    // Configuring output buffers consists of calling SetOutputBufferSettings()
-    // followed by a number of calls to AddOutputBuffer() equal to the number of
-    // buffers set via SetOutputBufferSettings().  In buffer-per-packet mode, this
-    // is the same as the number of packets.  In single-buffer mode, this is 1.
-    //
-    // Configuring output buffers is _required_ after OnOutputConfig() is
-    // received by the client with buffer_constraints_action_required true and
-    // stream_lifetime_ordinal equal to the client's current
-    // stream_lifetime_ordinal (even if there is an active stream), and is
-    // _permitted_ any time there is no current stream.
-    //
-    // For more on SetOutputBufferSettings() and AddOutputBuffer(), see codec.md.
-    7: SetOutputBufferSettings(CodecPortBufferSettings output_settings);
-    8: AddOutputBuffer(CodecBuffer buffer);
-
-    // FlushEndOfStreamAndCloseStream()
-    //
-    // This message is optional.
-    //
-    // This message is only valid after QueueInputEndOfStream() for this stream.
-    // The stream_lifetime_ordinal input parameter must match the
-    // stream_lifetime_ordinal of the QueueInputEndOfStream(), else the server
-    // will close the channel.
-    //
-    // A client can use this message to flush through (not discard) the last
-    // input data of a stream so that the codec server generates corresponding
-    // output data for all the input data before the server moves on to the next
-    // stream, without forcing the client to wait for OnOutputEndOfStream()
-    // before queueing data of another stream.
-    //
-    // The difference between QueueInputEndOfStream() and
-    // FlushEndOfStreamAndCloseStream():  QueueInputEndOfStream() is a promise
-    // from the client that there will not be any more input data for the stream
-    // (and this info is needed by some codecs for the codec to ever emit the very
-    // last output data).  The QueueInputEndOfStream() having been sent doesn't
-    // prevent the client from later completely discarding the rest of the
-    // current stream by closing the current stream (with or without a stream
-    // switch).  In contrast, FlushEndOfStreamAndCloseStream() is a request from
-    // the client that all the previously-queued input data be processed
-    // including the logical "EndOfStream" showing up as OnOutputEndOfStream()
-    // (in success case) before moving on to any newer stream - this essentially
-    // changes the close-stream handling from discard to flush-through for this
-    // stream only.
-    //
-    // A client using this message can start providing input data for a new
-    // stream without that causing discard of old stream data.  That's the purpose
-    // of this message - to allow a client to flush through (not discard) the old
-    // stream's last data (instead of the default when closing or switching
-    // streams which is discard).
-    //
-    // Because the old stream is not done processing yet and the old stream's
-    // data is not being discarded, the client must be prepared to continue to
-    // process OnOutputConfig() messages until the stream_lifetime_ordinal is
-    // done.  The client will know the stream_lifetime_ordinal is done when
-    // OnOutputEndOfStream(), OnStreamFailed(), or the Codec channel closes.
-    //
-    // For more on FlushEndOfStreamAndCloseStream(), see codec.md.
-    9: FlushEndOfStreamAndCloseStream(uint64 stream_lifetime_ordinal);
-
-    // CloseCurrentStream()
-    //
-    // This "closes" the current stream, leaving no current stream.  In addition,
-    // this message can optionally release input buffers or output buffers.
-    //
-    // If there has never been any active stream, the stream_lifetime_ordinal must
-    // be zero or the server will close the channel.  If there has been an active
-    // stream, the stream_lifetime_ordinal must be the most recent active stream
-    // whether that stream is still active or not.  Else the server will close the
-    // channel.
-    //
-    // Multiple of this message without any new active stream in between is not
-    // to be considered an error, which allows a client to use this message to
-    // close the current stream to stop wasting processing power on a stream the
-    // user no longer cares about, then later decide that buffers should be
-    // released and send this message again with release_input_buffers and/or
-    // release_output_buffers true to get the buffers released, if the client is
-    // interested in trying to avoid overlap in resource usage between old
-    // buffers and new buffers (not all clients are).
-    //
-    // See also Sync().
-    //
-    // For more on CloseCurrentStream(), see codec.md.
-    10: CloseCurrentStream(
-            uint64 stream_lifetime_ordinal,
-            bool release_input_buffers,
-            bool release_output_buffers);
-
-    // Sync() -> ()
-    //
-    // On completion, all previous Codec calls have done what they're going to do
-    // server-side, _except_ for processing of data queued using
-    // QueueInputPacket().
-    //
-    // The main purpose of this call is to enable the client to wait until
-    // CloseCurrentStream() with release_input_buffers and/or
-    // release_output_buffers set to true to take effect, before the client
-    // allocates new buffers and re-sets-up input and/or output buffers.  This
-    // de-overlapping of resource usage can be worthwhile for media buffers which
-    // can consume resource types whose overall pools aren't necessarily vast in
-    // comparsion to resources consumed.  Especially if a client is reconfiguring
-    // buffers multiple times.
-    //
-    // Note that Sync() prior to allocating new media buffers is not alone
-    // sufficient to achieve non-overlap of media buffer resource usage system
-    // wide, but it can be a useful part of achieving that.
-    //
-    // The Sync() transits the Output ordering domain and the StreamControl
-    // ordering domain, but not the InputData ordering domain.  For more on
-    // ordering domains see codec.md.
-    //
-    // This request can be used to avoid hitting kMaxInFlightStreams which is
-    // presently 10.  A client that stays <= 8 in-flight streams will comfortably
-    // stay under the limit of 10.  While the protocol permits repeated
-    // SetInputBufferSettings() and the like, a client that spams the channel
-    // can expect that the channel will just close if the server or the channel
-    // itself gets too far behind.
-    11: Sync() -> ();
-
-    // OnOutputPacket()
-    //
-    // This is how the codec emits an output packet to the codec client.
-    //
-    // Order is significant.
-    //
-    // The client should eventually call RecycleOutputPacket() (possibly after
-    // switching streams multiple times), unless the buffer_lifetime_ordinal has
-    // moved on.  A stream change doesn't change which packets are busy with
-    // the client vs. free with the server.  See "packet lifetime" in codec.md for
-    // more.
-    //
-    // The relevant buffer is buffer 0 if running in single-buffer mode, or the
-    // buffer index is the same as packet_index if running in buffer-per-packet
-    // mode.
-    //
-    // For low-level buffer types that support it, a Codec is free to emit an
-    // output packet before the low-level buffer actually has any usable data in
-    // the buffer, with the mechanism for signalling the presence of data
-    // separate from the OnOutputPacket() message.  For such low-level buffer
-    // types, downstream consumers of data from the emitted packet must
-    // participate in the low-level buffer signalling mechanism to know when it's
-    // safe to consume the data.  This is most likely to be relevant when using a
-    // video decoder and gralloc-style buffers.
-    //
-    // The error_ bool(s) allow (but do not require) a Codec server to report
-    // errors that happen during an AU or between AUs.
-    //
-    // The scope of error_detected_before starts at the end of the last delivered
-    // output packet on this stream, or the start of stream if there were no
-    // previous output packets on this stream.  The scope ends at the start of
-    // the output_packet.
-    //
-    // The error_detected_before bool is separate so that discontinuities can be
-    // indicated separately from whether the current packet is damaged.
-    //
-    // The scope of error_detected_during is from the start to the end of this
-    // output_packet.
-    12: -> OnOutputPacket(
-            CodecPacket output_packet,
-            bool error_detected_before,
-            bool error_detected_during);
-
-    // RecycleOutputPacket()
-    //
-    // After the client is done with an output packet, the client needs to tell
-    // the codec that the output packet can be re-used for more output, via this
-    // method.
-    //
-    // It's not permitted to recycle an output packet that's already free with the
-    // codec server.  It's permitted but discouraged for a client to recycle an
-    // output packet that has been deallocated by an explicit or implicit output
-    // buffer de-configuration().  See buffer_lifetime_ordinal for more on that.
-    // A server must ignore any such stale RecycleOutputPacket() calls.
-    //
-    // For more on RecycleOutputPacket(), see codec.md.
-    13: RecycleOutputPacket(CodecPacketHeader available_output_packet);
-
-    // OnOutputEndOfStream()
-    //
-    // After QueueInputEndOfStream() is sent by the Codec client, within a
-    // reasonable duration the corresponding OnOutputEndOfStream() will be sent by
-    // the Codec server.  Similar to QueueInputEndOfStream(),
-    // OnOutputEndOfStream() is sent a maximum of once per stream.
-    //
-    // No more stream data for this stream will be sent after this message.  All
-    // input data for this stream was processed.
-    //
-    // While a Codec client is not required to QueueInputEndOfStream() (unless
-    // the client wants to use FlushEndOfStreamAndCloseStream()), if a Codec
-    // server receives QueueInputEndOfStream(), and the client hasn't closed the
-    // stream, the Codec server must generate a corresponding
-    // OnOutputEndOfStream() if nothing went wrong, or must send
-    // OnStreamFailed(), or must close the server end of the Codec channel.  An
-    // ideal Codec server would handle and report stream errors via the error_
-    // flags and complete stream processing without sending OnStreamFailed(), but
-    // in any case, the above-listed options are the only ways that an
-    // OnOutputEndOfStream() won't happen after QueueInputEndOfStream().
-    //
-    // There will be no more OnOutputPacket() or OnOutputConfig() messages for
-    // this stream_lifetime_ordinal after this message - if a server doesn't
-    // follow this rule, a client should close the Codec channel.
-    //
-    // The error_detected_before bool has the same semantics as the
-    // error_detected_before bool in OnOutputPacket().
-    14: -> OnOutputEndOfStream(
-            uint64 stream_lifetime_ordinal,
-            bool error_detected_before);
-
-    //
-    // Stream specific messages:
-    //
-
-    // QueueInputFormatDetails()
-    //
-    // If the input format details are still the same as specified during Codec
-    // creation, this message is unnecessary and does not need to be sent.
-    //
-    // If the stream doesn't exist yet, this message creates the stream.
-    //
-    // All servers must permit QueueInputFormatDetails() at the start of a stream
-    // without failing, as long as the new format is supported by the Codec
-    // instance.  Technically this allows for a server to only support the exact
-    // input format set during Codec creation, and that is by design.  A client
-    // that tries to switch formats and gets a Codec channel failure should try
-    // again one more time with a fresh Codec instance created with CodecFactory
-    // using the new input format during creation, before giving up.
-    //
-    // These format details override the format details
-    // specified during codec creation for this stream only.  The next stream will
-    // default back to the format details set during codec creation.
-    //
-    // For now, QueueInputFormatDetails() sent mid-stream will fail the Codec
-    // channel.  Clients shouldn't do this for now.
-    //
-    // This message is permitted at the start of the first stream (just like at
-    // the start of any stream).  The format specified need not match what was
-    // specified during codec creation, but if it doesn't match, the Codec channel
-    // might close as described above.
-    15: QueueInputFormatDetails(
-            uint64 stream_lifetime_ordinal, CodecFormatDetails format_details);
-
-    // QueueInputPacket()
-    //
-    // This message queues input data to the codec for processing.
-    //
-    // If the stream doesn't exist yet, this message creates the new stream.
-    //
-    // The client is required to be willing to send QueueInputPacket() prior to
-    // the server's first OnOutputConfig(), and is permitted to start a new stream
-    // without output buffers configured yet.
-    //
-    // The client must continue to deliver input data via this message even if the
-    // codec has not yet generated the first OnOutputConfig(), and even if the
-    // Codec is generating OnFreeInputPacket() for previously-queued input
-    // packets.  The input data must continue as long as there are free packets
-    // to be assured that the server will ever generate the first
-    // OnOutputConfig().
-    //
-    // For more on QueueInputPacket(), see codec.md.
-    16: QueueInputPacket(CodecPacket packet);
-
-    // OnFreeInputPacket()
-    //
-    // The server sends this message when the codec is done consuming this packet
-    // and the packet can be re-filled by the client.
-    //
-    // This is not sent for all packets when a new buffer_lifetime_ordinal starts
-    // as in that case all the packets are initially free with the client.
-    //
-    // See comments on QueueInputBuffer() and "packet lifetime" in codec.md for
-    // for description of buffer lifetime and packet lifetime.
-    //
-    // After receiving the available input buffer via this event, the codec
-    // client can call later call QueueInputBuffer with appropriate offset and
-    // length set.
-    //
-    // TODO(dustingreen): At the moment, there is no guarantee re. the order of
-    // these messages with respect to the order of QueueInputPacket(), but at
-    // least for decoders, it might be worthwhile to require that servers preserve
-    // the order vs. QueueInputPacket(), to make it easier to feed input from a
-    // ring buffer or similar.  For audio encoders it might still make sense.  For
-    // video encoders probably not.
-    17: -> OnFreeInputPacket(CodecPacketHeader free_input_packet);
-
-    // Inform the server that all QueueInputPacket() messages for this stream
-    // have been sent.
-    //
-    // If the stream isn't closed first (by the client, or by OnStreamFailed(), or
-    // Codec channel closing), there will later be a corresponding
-    // OnOutputEndOfStream().
-    //
-    // The corresponding OnOutputEndOfStream() message will be generated only if
-    // the server finishes processing the stream before the server sees the
-    // client close the stream (such as by starting a new stream).  A way to
-    // force the server to finish the stream before closing is to use
-    // FlushEndOfStreamAndCloseStream() after QueueInputEndOfStream() before any
-    // new stream.  Another way to force the server to finish the stream before
-    // closing is to wait for the OnOutputEndOfStream() before taking any action
-    // that closes the stream.
-    //
-    // In addition to serving as an "EndOfStream" marker to make it obvious
-    // client-side when all input data has been processed, if a client never
-    // sends QueueInputEndOfStream(), no amount of waiting will necessarily
-    // result in all input data getting processed through to the output.  Some
-    // codecs have some internally-delayed data which only gets pushed through by
-    // additional input data _or_ by this EndOfStream marker.  In that sense,
-    // this message can be viewed as a flush-through at InputData domain level,
-    // but the flush-through only takes effect if the codec even gets that far
-    // before the stream is just closed at StreamControl domain level.  This
-    // message is not alone sufficient to act as an overall flush-through at
-    // StreamControl level. For that, send this message first and then send
-    // FlushEndOfStreamAndCloseStream() (at which point it becomes possible to
-    // queue input data for a new stream without causing discard of this older
-    // stream's data), or wait for the OnOutputEndOfStream() before closing the
-    // current stream.
-    //
-    // If a client sends QueueInputPacket(), QueueInputFormatDetails(),
-    // QueueInputEndOfStream() for this stream after the first
-    // QueueInputEndOfStream() for this stream, a server should close the Codec
-    // channel.
-    18: QueueInputEndOfStream(uint64 stream_lifetime_ordinal);
-};
diff --git a/fidl/fuchsia.mediacodec/codec_common.fidl b/fidl/fuchsia.mediacodec/codec_common.fidl
deleted file mode 100644
index d1e7a7c..0000000
--- a/fidl/fuchsia.mediacodec/codec_common.fidl
+++ /dev/null
@@ -1,511 +0,0 @@
-// 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.
-
-library fuchsia.mediacodec;
-
-// Value
-//
-// Generic "value" for use within generic "Parameter" struct.
-union Value {
-  bool bool_value;
-  uint64 uint64_value;
-  int64 int64_value;
-  string string_value;
-  // Prefer using codec_oob_bytes instead.
-  vector<uint8> bytes_value;
-};
-
-// Parameter
-//
-// Generic parameter.
-//
-// We want to minimize use of this generic "Parameter" structure by natively
-// defining as many codec-specific parameter semantics as we can.
-//
-// TODO: When possible, describe the very limited scenarios in which it would
-// still be reasonable to use a generic Parameter.
-struct Parameter {
-  // Some indication of the scope of applicability of this Parameter.
-  string scope;
-  // Specific name of this parameter, without the scope prefix.
-  string name;
-  // The particular value of this parameter.
-  Value value;
-};
-
-// CodecFormatDetails
-//
-// The purpose of CodecFormatDetails is to fill in additional details not
-// conveyed via other means.
-//
-// TODO(dustingreen): Where at all possible, definitions for the concepts
-// within CodecFormatDetails should go in media_types.fidl or another location
-// that's widely shared.  Maybe some encoder settings could remain
-// codec-specific.
-//
-// For decoders input, the format details tend to be fairly sparse, since most
-// compressed formats tend to be mostly self-describing.
-//
-// For decoder output and encoder input, the format details need to include all
-// the out-of-band information regarding the uncompressed data, which tends not
-// to be self-describing.
-//
-// For encoder output, we also include in CodecFormatDetails some additional
-// encoding parameters which are needed to configure the encoder. These are not
-// really needed by any downstream decoder under most circumstances, but these
-// encoder config settings are legitimate optional format details, so we use
-// the same overall structure, but name them "Encoder" to make it more obvious
-// that these are mostly relevant to the encoder.  A downstream consumer could
-// potentially benefit from knowing these settings, but most won't look at them.
-//
-// Settings that are completely redundant with the data in the format itself
-// should not be in a required field here.  Some encoder parameters may also be
-// represented in codec_oob_bytes on the output of an encoder - a downstream
-// consumer can assume the codec_oob_bytes are correct and not check for whether
-// encoder settings are present or consistent.
-//
-// With some exceptions made for encoder settings on output of an encoder, this
-// stuff should be limited to things we need to know to properly process the
-// data which we can't already determine from the data itself, and which isn't
-// already covered by a format's defined OOB binary config blob, which is
-// conveyed in codec_oob_bytes.
-//
-// TODO(dustingreen): Consider whether to split encoder settings into a
-// separate struct - the main counter-argument would be if a consumer
-// immediately downstream of an encoder may have good reason to know encoder
-// settings to help process the data.  For example, the nominal bit-rate.
-
-// Compressed formats tend to be much more self-describing than uncompressed
-// formats.  (The "self" in "self-describing" includes the codec_oob_bytes.)
-//
-// Most decoders can have CodecFormatDetails.domain null.
-
-// AudioCompressedFormat
-//
-// Format details relevant to compressed audio, mostly for encoder settings.
-//
-// Unless otherwise specified in a comment on a field in this structure,
-// CodecFormatDetails.domain is null for a decoder.  A sub-structure whose name
-// ends in "Encoder" is for encoder output settings.
-//
-// TODO(dustingreen): Consider whether splitting encoder settings out separately
-// would be better.
-union AudioCompressedFormat {
-  // For an aac encoder, this field has settings the encoder needs which are
-  // specific to AAC encoding.
-  AudioCompressedFormatAacEncoder aac;
-};
-
-enum AudioBitrateMode {
-  // Used mainly when a client is configuring an encoder's output format.  May
-  // also be present in an OnOutputConfig() message from an encoder, but should
-  // not be relied upon to be present by any consumer downstream of an encoder.
-  UNSPECIFIED = 0;
-  CBR = 1;
-  VBR = 2;
-};
-
-// AudioCompressedFormatAacEncoder
-//
-// Encoder settings for an AAC encoder.
-struct AudioCompressedFormatAacEncoder {
-  // In SetOutputConfig():
-  //
-  // If zero, an encoder should generate 256 kbps, and a consumer should not
-  // assume any particular bitrate.
-  //
-  // If not zero, the encoder should not exceed this bitrate.  In CBR the
-  // encoder should use the highest available bitrate that doesn't exceed this
-  // value, or if there is no such bitrate, the lowest available bitrate.  In
-  // VBR, the encoder should stay at or below this bitrate.
-  //
-  // In VBR it's left up to the encoder to choose a reasonable ratio between
-  // max bits per second and min bits per second, with the aim in VBR being
-  // constant perceived quality.
-  //
-  // In OnOutputConfig():
-  //
-  // In CBR, the nominal bits per second.  In VBR, the nominal max bits per
-  // second.
-  uint32 bits_per_second;
-
-  // In SetOutputConfig():
-  //
-  // If UNSPECIFIED, up to the encoder.  If CBR or VBR, a hint to the encoder
-  // to use that mode.
-  //
-  // In OnOutputConfig():
-  //
-  // Actual mode being used.  UNSPECIFIED means the source is not specifying
-  // which mode.
-  AudioBitrateMode bitrate_mode;
-
-  // TODO(dustingreen): AAC profile settings.
-};
-
-// AudioPcmMode
-//
-// TODO(dustingreen): Keep or discard any non-linear formats for purposes of the
-// Codec interface?
-enum AudioPcmMode {
-  // 16 bit signed int linear or 32 bit float linear, for now
-  // 1-N channels ok, with "A.B" channels designated as A+B channel_count - the
-  // channel map is separately specified.  So 5.1 becomes channel_count 6.
-  LINEAR = 0;
-  // G.711 8 bit format-defined waveform semantics
-  // 1 channel
-  ALAW = 1;
-  // G.711 8 bit format-defined waveform semantics
-  // 1 channel
-  MULAW = 2;
-};
-
-// AudioChannelId
-//
-// Used in specifying which audio channel is for which speaker location / type.
-//
-// TODO(dustingreen): Do we need more channel IDs than this?
-//
-// TODO(dustingreen): Check with mpuryear@ re. naming consistency for "S" vs.
-// "R" as we move these to a common definition.  Also the ordering of LS/RS vs.
-// LR/RR - probably LR/RR being first would make more sense re. how channels
-// get added incrementally, but changing the order would no longer match
-// Android's ordering.
-enum AudioChannelId {
-  SKIP = 0; // unused channel
-  LF = 1;   // left front
-  RF = 2;   // right front
-  CF = 3;   // center front
-  LS = 4;   // left surround
-  RS = 5;   // right surround
-  LFE = 6;  // low frequency effects
-  CS = 7;   // back surround
-  LR = 8;   // left rear
-  RR = 9;   // right rear
-  // This is the last explicitly-defined value + 1.  This name will be
-  // re-defined in future if we add more defined channel IDs above.
-  END_DEFINED = 10;
-  // This is where format-specific (or ad-hoc) channel ID values should go, to
-  // avoid colliding with any additional values allocated above.  The values
-  // here are not guaranteed to avoid collision across different formats.
-  EXTENDED_CHANNEL_ID_BASE = 0x6f000000;
-  // Extended channel IDs should be <= Max.
-  MAX = 0x7fffffff;
-};
-
-// PcmFormat
-//
-// PCM audio format details.
-//
-// TODO(dustingreen): Discuss with mpuryear@ re. where definitions for these
-// details go and make sure the common details can specify at least this much.
-struct PcmFormat {
-  // Implicit details:
-  //   * For bits_per_sample > 8, host-endian is implied.
-  //   * At least for now, for channel_count >= 2, interleaved layout is
-  //     implied.
-
-  AudioPcmMode pcm_mode;
-
-  // bits_per_sample
-  //
-  // A "sample" is for a single channel.
-  //
-  // For example, CD quality is 16.  See PcmMode comments, as the mode
-  // constrains this value.
-  uint32 bits_per_sample;
-
-  // frames_per_second
-  //
-  // A "frame" is one datapoint (one "sample") for each channel.  Each channel
-  // is sampled this many times per second.  For example, CD quality is 44100.
-  uint32 frames_per_second;
-
-  // channel_map
-  //
-  // channel_map.size() is the channel count.  See PcmMode comments, as some
-  // modes constrain the channel count to 1.
-  //
-  // Values from AudioChannelId should be used if they are suitable.
-  //
-  // If a channel has no suitable AudioChannelId, an ad-hoc value can be used in
-  // a range starting from AudioChannel_ExtendedChannelIdBase.
-  vector<AudioChannelId>:16 channel_map;
-
-  // TODO(dustingreen): Add unsigned 8 bit, float 32 bit, maybe others. FWIW,
-  // AOSP appears to support signed 16 bit, unsigned 8 bit, and float 32 bit
-  // under "Pcm", AFAICT based on OMX_NUMERICALDATATYPE and ACodec.cpp code.
-};
-
-// AudioUncompressedFormat
-//
-// Uncompressed audio format details.
-union AudioUncompressedFormat {
-  PcmFormat pcm;
-};
-
-// AudioFormat
-//
-// Audio format details.
-union AudioFormat {
-  AudioCompressedFormat compressed;
-  AudioUncompressedFormat uncompressed;
-};
-
-// VideoCompressedFormat
-//
-// Compressed video format details.
-//
-// Mostly encoder settings will go under here.
-//
-// If a compressed video format is missing any fields here other than encoder
-// settings, it's because it's a good format and is already self-describing
-// given the mime_type + format-defined codec_oob_bytes as appropriate +
-// in-band data.
-union VideoCompressedFormat {
-  // TODO(dustingreen): Any compressed video formats that aren't sufficiently
-  // self-describing to select and create a Codec instance to decode it?
-
-  // TODO(dustingreen): temp field to make the compiler happy until we have at
-  // least one real field.
-  uint32 temp_field_todo_remove;
-};
-
-// VideoUncompressedFormatSpecificDetails
-//
-// Extended format-specific uncompressed video format details.
-//
-// TODO(dustingreen): Switch to FIDL table instead.
-union VideoUncompressedFormatSpecificDetails {
-  // TODO(dustingreen): Which formats that we care about really require special
-  // format-specific details here?
-
-  // TODO(dustingreen): temp field to make the compiler happy until we have at
-  // least one real field.
-  uint32 temp_field_todo_remove;
-};
-
-enum VideoColorSpace {
-  // TODO(dustingreen): add to this list
-  INVALID = 0;
-};
-
-// VideoUncompressedFormat
-//
-// Uncompressed video format details.
-//
-// TODO(dustingreen): Integrate with a system-wide structure for this purpose.
-struct VideoUncompressedFormat {
-  // fourcc
-  //
-  // A human-readable fourcc like RGBA should be 0x41424752 in the fourcc field
-  // (regardless of host endian-ness). Note that the R (first character) of the
-  // fourcc is in the low-order byte of this fourcc field.
-  //
-  // There are some fourcc codes that don't format nicely as a string.  While I
-  // don't foresee any use of any of the purely numeric fourcc codes (not
-  // corresponding to packed ascii character values), those would be stored
-  // such that their numeric value has it's low-order byte in the low-order
-  // byte of this fourcc value.  So a fourcc with "hex value" 0x00000001 would
-  // have the numeric value 1 in this field.
-  //
-  // The endian-ness of fourcc values stored in files or in network packets is
-  // outside the scope of these comments, other than to state that regardless
-  // of the source of the fourcc code and the order that storage / transmission
-  // format stores these bytes, a human-readable fourcc should have its
-  // human-read first ascii character value in the low order byte of this
-  // field.
-  uint32 fourcc;
-
-  // For formats with different planes having different resolution, this is the
-  // resolution of the highest-resolution plane(s).  Else it's the resolution
-  // of all the planes.
-  uint32 primary_width_pixels;
-  uint32 primary_height_pixels;
-
-  // For formats where the seconary planes are the same resolution, these fields
-  // will be the same as primary_width_pixels and primary_height_pixels.  For
-  // formats with smaller secondary resolutions, these indicate that resolution.
-  uint32 secondary_width_pixels;
-  uint32 secondary_height_pixels;
-
-  // Planar means the various planes are separately stored in their own chunks
-  // of memory.
-  bool planar;
-
-  // If a format is swizzled, the swizzling parameters are not directly here.
-  bool swizzled;
-
-  uint32 primary_line_stride_bytes;
-  // Formats with the same stride for all planes will have this field equal to
-  // primary_line_stride_bytes.
-  uint32 secondary_line_stride_bytes;
-
-  // R or Y
-  uint32 primary_start_offset;
-  // G or U
-  uint32 secondary_start_offset;
-  // B or V
-  uint32 tertiary_start_offset;
-
-  uint32 primary_pixel_stride;
-  // For formats with the same pixel stride for all planes, this field will be
-  // equal to primary_pixel_stride.
-  uint32 secondary_pixel_stride;
-
-  // These override the primary_width_pixels and primary_height_pixels for
-  // purposes of display (but not for purposes of determining the pixel layout
-  // in memory).  These can crop on the right and bottom.  These must be <= the
-  // corresponding coded dimension.
-  //
-  // This value must be <= primary_width_pixels.
-  uint32 primary_display_width_pixels;
-  // This value must be <= primary_height_pixels.
-  uint32 primary_display_height_pixels;
-
-  // The pixel_aspect_ratio_width : pixel_aspect_ratio_height is the pixel
-  // aspect ratio (AKA sample aspect ratio aka SAR) for the luma (AKA Y)
-  // samples. A pixel_aspect_ratio of 1:1 mean square pixels. A
-  // pixel_aspect_ratio of 2:1 would mean pixels that are displayed twice as
-  // wide as they are tall. Codec implementation should ensure these two values
-  // are relatively prime by reducing the fraction (dividing both by GCF) if
-  // necessary.
-  //
-  // When has_pixel_aspect_ratio == false, pixel_aspect_ratio_width and
-  // pixel_aspect_ratio_height will both be 1, but in that case the
-  // pixel_aspect_ratio_width : pixel_aspect_ratio_height of 1:1 is just a very
-  // weak suggestion re. reasonable-ish handling, not in any way authoritative.
-  // In this case (or in any case really) the receiver of this message may have
-  // other OOB means to determine the actual pixel_aspect_ratio.
-  bool has_pixel_aspect_ratio = false;
-  uint32 pixel_aspect_ratio_width = 1;
-  uint32 pixel_aspect_ratio_height = 1;
-
-  // TODO(dustingreen): Currently this assumes 8 bits per channel, but we'll
-  // need fields to indicate more bits per pixel such as 10 or 12 bits per
-  // pixel.  Also, potentially a way to indicate different number of bits per
-  // channel for 565 16 bit RGB + packing details.  Also, potentially
-  // endian-ness.
-  //
-  // TODO(dustingreen): Also, an easy way to get a template
-  // VideoUncompressedFormat that's pre-populated with reasonably-plausible
-  // values, based on a fourcc or enum value + maybe primary resolution.
-
-  VideoUncompressedFormatSpecificDetails special_formats;
-};
-
-// VideoFormat
-//
-// Video (compress or uncompressed) format details.
-union VideoFormat {
-  VideoCompressedFormat compressed;
-  VideoUncompressedFormat uncompressed;
-};
-
-// DomainFormat
-//
-// Domain-specific format details (audio or video, compressed or uncompressed).
-union DomainFormat {
-  AudioFormat audio;
-  VideoFormat video;
-};
-
-const uint64 kMaxCodecOobBytesSize = 8192;
-
-// CodecFormatDetails
-//
-// This describes/details the format on input or output of a codec (separate
-// instances for input vs. output).
-struct CodecFormatDetails {
-  // Particular instances of CodecFormatDetails will set this field to make it
-  // easier for a receiver to determine if any part of the format has changed
-  // vs. the last CodecFormatDetails received for the same context.
-  uint64 format_details_version_ordinal;
-
-  // "mime_type" strings used by particular decoders / encoders so far:
-  //
-  // SW AAC decoder:
-  //   * input:
-  //     * "audio/aac-adts" - ATDS AAC; self-contained format, but
-  //       implementation for now requires codec_oob_bytes to contain
-  //       AudioSpecificConfig() reconstructed from ADTS header data - see also
-  //       make_AudioSpecificConfig_from_ADTS_header() for now.
-  //   * output:
-  //     * "audio/raw" - stereo linear 16 bit integer PCM
-  //
-  // TODO(dustingreen): avoid requiring codec_oob_bytes when using SoftAAC2.cpp
-  // for AAC ADTS.
-  //
-  // TODO(dustingreen): Add non-ADTS AAC support (which naturally needs
-  // codec_oob_bytes).
-  //
-  // TODO(dustingreen): Consider "pseudo_mime_type", or an enum, + "domain"
-  // details as needed instead, since calling this "mime_type" could lead to
-  // confusion.
-  string mime_type;
-
-  // Some codecs have their own binary codec configuration structure.  For those
-  // codecs we allow that binary structure to be directly conveyed to the codec
-  // here.
-  //
-  // audio/aac - this is an AudioSpecificConfig().
-  // audio/aac-adts - this is not set.
-  // TODO(dustingreen): make the audio/aac-adts statement true soon.  At the
-  // moment we set this with make_AudioSpecificConfig_from_ADTS_header(), but
-  // that should not be the client's job for ADTS.
-  //
-  // For some formats whose "ES" data format is self-contained, or for which
-  // there is no format-defined binary OOB config, this is null.
-  //
-  // A server can close the channel if the count of bytes is >
-  // kMaxCodecOobBytesSize or is larger than makes any sense for the codec.  If
-  // any codec actually needs more than kMaxCodecOobBytesSize bytes here, we
-  // could potentially increase this restriction some, but this interface isn't
-  // designed to support codec OOB config blobs that approach
-  // ZX_CHANNEL_MAX_MSG_BYTES.
-  vector<uint8>? codec_oob_bytes;
-
-  // Decoder input format:
-  //
-  // If a format is not self-describing given the mime_type and a
-  // format-spec-defined codec_oob_bytes, this domain field can be set to
-  // provide the additional compressed-format-specific details.  This is
-  // expected to be fairly rare, so most compressed input formats will have
-  // only the mime_type and possibly codec_oob_bytes set, with domain typically
-  // null.  If an encoder is upstream however, domain may be set to convey the
-  // encoder settings that were used, but a decoder consumer doesn't need to
-  // look at those.
-  //
-  // Encoder output format:
-  //
-  // The encoder's compressed data output typically needs some configuration
-  // (provided in this field) that's convenient to provide in a form that's not
-  // codec_oob_bytes, and the codec can convert that config to codec_oob_bytes
-  // on encoder output via OnOutputConfig().  We retain these encoder settings
-  // in the output CodecFormatDetails to allow for cases where a downstream
-  // consumer knowing the encoder settings could be useful.
-  //
-  // TODO(dustingreen): Decide if we want to retain this, or if we'd prefer to
-  // split out config settings and maybe only represent a few encoder settings
-  // as best-effort optional aux data, like bitrate.
-  //
-  // Encoder input format / decoder output format:
-  //
-  // This field contains fairly detailed information re. uncompressed data
-  // format details, which tends to _not_ be self-describing in-band.
-  DomainFormat? domain;
-
-  // See comments above on Parameter.  At the time we lock relevant FIDL
-  // interfaces, there should be zero use of this field outside tests, but this
-  // is here in case we need to allow a codec client to convey additional config
-  // parameters to/from a codec which we didn't anticipate before locking.
-  //
-  // If there are any known "official" exceptions to the previous paragraph,
-  // we'll list them here by corresponding mime_type (none so far):
-  //   * "<mime_type>" - <usage_description>
-  //
-  // For codecs that define their own codec-specific config/OOB data, put that
-  // in codec_oob_bytes above instead of this field.
-  vector<Parameter>? pass_through_parameters;
-};
diff --git a/fidl/fuchsia.mediacodec/codec_factory.fidl b/fidl/fuchsia.mediacodec/codec_factory.fidl
deleted file mode 100644
index 6fad411..0000000
--- a/fidl/fuchsia.mediacodec/codec_factory.fidl
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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.
-
-library fuchsia.mediacodec;
-
-// CreateDecoder_Params
-//
-// Input parameters for creating a decoder (audio or video).
-//
-// TODO(dustingreen): Switch this to a FIDL table instead when possible.
-struct CreateDecoder_Params {
-  // Input mime type for a decoder.
-  //
-  // The recognized mime types for now:
-  // audio/aac
-  //   input_details.codec_oob_bytes must be an AudioSpecificConfig() as defined
-  //   by AAC spec.
-  // audio/aac-adts
-  //   On a temporary basis, input_details.codec_oob_bytes must be an
-  //   AudioSpecificConfig() extracted from the ADTS stream data by the client.
-  //   This is temporary.  Later, codec_oob_bytes will be ignored and allowed to
-  //   be null.  On a temporary basis, see
-  //   make_AudioSpecificConfig_from_ADTS_header() for some self-contained
-  //   conversion code.
-  //   TODO(dustingreen): fix this up server side and make most of this
-  //   paragraph go away, possibly by also parsing ADTS before it hits OMX
-  //   since the parsing code there doesn't tolerate split ADTS headers.
-  CodecFormatDetails input_details;
-
-  // The settings below nail down more details.
-
-  // This must be true in order for the client to be permitted to put a
-  // timestamp on an input packet, which is in turn required to get any
-  // timestamps on any output packets.
-  //
-  // It is always legal to provide separate Access Units (henceforth AUs) to a
-  // decoder, but this boolean must be true for a decoder to accept and
-  // propagate timestamp values.
-  //
-  // This must be true when creating a video encoder, or the CodecFactory
-  // channel will close.
-  bool promise_separate_access_units_on_input = false;
-
-  // "require" fields:
-  //
-  // Specifying any of these "require" fields can result in failure to get a
-  // Codec if there's no suitable codec.  None of these correspond to any
-  // required features of a codec server.
-  //
-  // TODO(dustingreen): implement filtering codecs based on these fields.
-
-  // Require that the selected codec be capable of accepting input where
-  // AUs are not separated into separate packets.
-  //
-  // This does not imply that the decoder can find the start of the first AU;
-  // for that see require_can_find_start.  This does not imply that the decoder
-  // can re-sync on its own if the stream data is damaged; for that see
-  // require_can_re_sync.
-  //
-  // If both promise_separate_access_units_on_input and
-  // require_can_stream_bytes_input are true, the CodecFactory channel will
-  // close.
-  //
-  // If this is false, the client must feed separate AUs on the fuchsia.ui.input.  This
-  // must be false for a video encoder, and if true the CodecFactory channel
-  // will close.
-  //
-  // Unless a client demands a decoder capable of taking concatenated AUs
-  // (require_can_stream_bytes_input true), the client must feed a decoder
-  // separate AUs.  This means the client cannot have parts of two separate AUs
-  // in the same packet, unless require_can_stream_bytes_input is true.
-  bool require_can_stream_bytes_input = false;
-
-  // A decoder is allowed to be capable of streaming bytes but not capable of
-  // searching for the start of the first usable AU.  To require both, set both
-  // require_can_stream_bytes_input and require_can_find_start.  Setting
-  // require_can_find_start without require_can_stream_bytes_input is invalid.
-  //
-  // With require_can_stream_bytes_input true but require_can_find_start false,
-  // the client must start the first packet with the start of an AU, but can
-  // send a stream of bytes after that.
-  bool require_can_find_start = false;
-
-  // On problematic input data, all decoders are expected to at least be able to
-  // close the channel rather than getting stuck in a failed and/or broken
-  // state.
-  //
-  // A decoder returned from a request with require_can_re_sync is potentially
-  // able to handle damaged input without closing the Codec channel.  Such a
-  // Codec is encouraged, but not required, to also satisfy requirements of
-  // require_report_all_detected_errors.
-  bool require_can_re_sync = false;
-
-  // Sometimes a client would rather fail an overall use of a decoder than fail
-  // to notice data corruption.  For such scenarios, the client can specify
-  // require_report_all_detected_errors.  For any codec returned from a
-  // request with require_report_all_detected_errors set, on detection of
-  // any input data corruption the codec will report in one or more of these
-  // ways:
-  //   * closing the Codec channel
-  //   * OnStreamFailed()
-  //   * error_detected_before
-  //   * error_detected_during
-  //
-  // If false, a codec may silently skip past corrupted input data.
-  //
-  // No decoder can detect all corruption, because some corruption can look like
-  // valid stream data.  This requirement is only to request a codec that
-  // is written to attempt to detect _and report_ input stream corruption.
-  //
-  // This flag is not intended to be 100% bulletproof.  If a client needs robust
-  // assurance that _all_ detectable stream corruption is _always_ detected,
-  // this flag is not enough of a guarantee to achieve that.  Since some stream
-  // corruption is inherently non-detectable in any case, such a client should
-  // consider using stronger techniques upstream to ensure that corruption can
-  // be detected with the needed probability very close to 1.
-  //
-  // This flag being true doesn't imply anything about whether the codec will
-  // discard damaged data vs. producing corresponding damaged output.  Only that
-  // the codec will set error_detected_* bools to true when appropriate.
-  //
-  // Regardless of this setting, not all timstamp_ish values provided on input
-  // are guaranteed to show up on ouput.
-  bool require_report_all_detected_errors = false;
-
-  // If true, require that the returned codec is HW-accelerated.
-  bool require_hw = false;
-
-  // permit_lack_of_split_header_handling
-  //
-  // This field is a temporary field that will be going away.
-  //
-  // TODO(dustingreen): Remove this field once we're down to zero codecs with
-  // problems handling split headers.
-  //
-  // By default, a Codec instance is required to handle "split headers", meaning
-  // that a client is allowed to deliver parts of an AU one byte at a time,
-  // including parts near the beginning of the AU, and the codec is required to
-  // tolerate and handle that properly.  However, unfortunately not all codecs
-  // properly support split headers.  If a client is willing to permit such a
-  // codec to be used, the client can set this to true.  Clients are not
-  // encouraged to set this, but setting it may be necessary to find a codec for
-  // some formats _for now_.  If a client sets this to true, the client should
-  // deliver data of each AU with many contiguous non-split bytes from the start
-  // of each AU.  The client is not strictly required to deliver one AU at a
-  // time, only to ensure that either all the AU bytes are in a single packet or
-  // that many bytes at the start of each AU are in a single packet.
-  //
-  // The specification for how a client should use this and how a client should
-  // behave if setting this to true is intentionally vague, because lack of
-  // support for header splitting is not ideal, and is expected to be
-  // temporary, and all codecs should handle split headers in the long run.
-  // The main intent of this field is to avoid giving an innocent client using
-  // default value of false here a codec that can't properly handle split
-  // headers.  This is not an attempt at a mechanism to fully work around a
-  // codec that doesn't handle split headers.
-  //
-  // TODO(dustingreen): In the near term, wire this up so that SoftAAC2.cpp
-  // used for ADTS is not selected when this field is false, even if there is
-  // no other suitable codec.  In the long term, fix or work around the header
-  // handling behavior of SoftAAC2 when used in ADTS mode (and any other
-  // similar issues in other codecs) and remove this field.
-  bool permit_lack_of_split_header_handling = false;
-};
-
-enum CodecType {
-  DECODER = 0;
-  ENCODER = 1;
-};
-
-struct CodecDescription {
-  // Decoder or encoder.
-  CodecType codec_type;
-  // The mime type of the compressed format.  For decoders this is the mime
-  // type of the input.  For encoders, this is the mime type of the output.
-  string mime_type;
-
-  // TODO(dustingreen): All these fields should be optional.
-  //
-  // TODO(dustingreen): Re-evaluate this for encoders.
-  //
-  // For each of these fields, the default is the most-capable setting, but if a
-  // codec doesn't support the most-capable behavior, then the codec must
-  // override the default.
-  bool can_stream_bytes_input = true;
-  bool can_find_start = true;
-  bool can_re_sync = true;
-  bool will_report_all_detected_errors = true;
-  bool is_hw = true;
-  bool split_header_handling = true;
-};
-
-// CodecFactory
-//
-// The purpose of the media::CodecFactory interface is to create media::Codec
-// instances.
-//
-// The interface methods don't attempt to homogenize all codec types, preferring
-// to have a separate dedicated message for decoders.  TBD whether calls for
-// creating encoders will split up audio vs. video encoders, or be combined.
-//
-// Each create request is self-contained, in the sense that the interface is not
-// stateful between create requests.
-[Discoverable]
-interface CodecFactory {
-  // Driver-based local CodecFactory(s) will send this once shortly after the
-  // main CodecFactory connects to the driver-local CodecFactory.
-  //
-  // For now, the main CodecFactory will not send this.
-  //
-  // A SW-based local CodecFactory(s) will not send this event.
-  //
-  // Each codec in the list must be separately-described, for clean aggregation.
-  1: -> OnCodecList(vector<CodecDescription> codecs);
-
-  // Rough sequence to create a decoder:
-  //
-  // factory = ConnectToEnvironmentService(CodecFactory);
-  // CreateDecoder_Params params;
-  // [fill out params]
-  // CreateDecoder(params, decoder_request);
-  //
-  // See use_media_decoder code for more detail.
-  //
-  // TODO(dustingreen): More detail in this comment block.
-
-  // Requests:
-
-  // CreateDecoder:
-  //
-  // decoder_params - See CreateDecoder_Params comments for required
-  // and optional parameters for creating a decoder.
-  //
-  // decoder - a Codec.NewRequest() which will hopefully be connected to
-  // a Codec server, or the Codec channel will get closed if no suitable codec
-  // can be found.  We don't return any additional Codec-specific status here
-  // because finding the Codec is allowed to be fully async, so we don't
-  // necessarily yet know on return from this method which Codec will be
-  // selected, if any.
-  2: CreateDecoder(
-    CreateDecoder_Params decoder_params,
-    request<Codec> decoder);
-
-  // TODO(dustingreen):
-  // CreateAudioEncoder
-  // CreateVideoEncoder
-  // (or combined)
-};
diff --git a/fidl/fuchsia.mediacodec/meta.json b/fidl/fuchsia.mediacodec/meta.json
deleted file mode 100644
index 9f9f144..0000000
--- a/fidl/fuchsia.mediacodec/meta.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.mediacodec/codec_common.fidl", 
-    "fidl/fuchsia.mediacodec/codec_factory.fidl", 
-    "fidl/fuchsia.mediacodec/codec.fidl"
-  ], 
-  "name": "fuchsia.mediacodec", 
-  "root": "fidl/fuchsia.mediacodec", 
-  "sources": [
-    "fidl/fuchsia.mediacodec/codec_common.fidl", 
-    "fidl/fuchsia.mediacodec/codec_factory.fidl", 
-    "fidl/fuchsia.mediacodec/codec.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.mem/buffer.fidl b/fidl/fuchsia.mem/buffer.fidl
deleted file mode 100644
index ff281cc..0000000
--- a/fidl/fuchsia.mem/buffer.fidl
+++ /dev/null
@@ -1,14 +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.
-
-library fuchsia.mem;
-
-struct Buffer {
-    // The vmo.
-    handle<vmo> vmo;
-
-    // The size of the data in the vmo. This size must be smaller than the
-    // physical size of the vmo.
-    uint64 size;
-};
diff --git a/fidl/fuchsia.mem/meta.json b/fidl/fuchsia.mem/meta.json
deleted file mode 100644
index f12f499..0000000
--- a/fidl/fuchsia.mem/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.mem/buffer.fidl"
-  ], 
-  "name": "fuchsia.mem", 
-  "root": "fidl/fuchsia.mem", 
-  "sources": [
-    "fidl/fuchsia.mem/buffer.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.net.http/client.fidl b/fidl/fuchsia.net.http/client.fidl
deleted file mode 100644
index 945a453..0000000
--- a/fidl/fuchsia.net.http/client.fidl
+++ /dev/null
@@ -1,184 +0,0 @@
-// 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.
-
-library fuchsia.net.http;
-
-using fuchsia.mem;
-
-// An error occurred during the HTTP transaction.
-struct Error {
-    // The numerical error code.
-    //
-    // These error codes coorespond to
-    // <https://fuchsia.googlesource.com/garnet/+/master/bin/network/net_error_list.h>
-    int32 code;
-
-    // A textual description of the error in en-US.
-    string? description;
-};
-
-// An HTTP header field.
-struct Header {
-    // The name of the header field.
-    vector<uint8> name;
-
-    // The value of the header field.
-    vector<uint8> value;
-};
-
-// The body of either an HTTP request or an HTTP response.
-union Body {
-    // A buffer that will contain the complete request or response body.
-    fuchsia.mem.Buffer buffer;
-
-    // A socket that will contain the streaming request or response body.
-    handle<socket> stream;
-};
-
-// Specify the cache behavior of the request.
-enum CacheMode {
-    // Default behavior.
-    DEFAULT = 0;
-
-    // The HTTP request will bypass the local cache and will have a
-    // 'Cache-Control: nocache' header added in that causes any proxy servers
-    // to also not satisfy the request from their cache.  This has the effect
-    // of forcing a full end-to-end fetch.
-    BYPASS_CACHE = 1;
-
-    // The HTTP request will fail if it cannot serve the requested resource
-    // from the cache (or some equivalent local store).
-    ONLY_FROM_CACHE = 2;
-};
-
-// Specify the mechanism used to return the response body.
-//
-// Streaming the response can be more efficient if the response body is large
-// and can be processed incrementally (e.g., by an image decoder).
-//
-// Buffering the response can be more efficient if the response body is in cache
-// and the cache entry can be directly mapped into the resulting buffer.
-enum ResponseBodyMode {
-    // The complete response body should be returned in the |buffer| field of
-    // the response body.
-    //
-    // The loader MAY abort the transation if the buffer size exceeds an
-    // implementation-defined limit.
-    BUFFER = 0;
-
-    // The response body should be streamed through the |stream| field of the
-    // response body.
-    STREAM = 1;
-};
-
-// An HTTP request.
-struct Request {
-    // The HTTP method if applicable.
-    string method = "GET";
-
-    // The URL to load.
-    vector<uint8> url;
-
-    // Additional HTTP request headers.
-    vector<Header>? headers;
-
-    // The payload for the request body. For HTTP requests, the method must be set
-    // to "POST" or "PUT". If a buffer is used for the body, a Content-Length
-    // header will automatically be added.
-    Body? body;
-
-    // The loader will cancel the request if the peer for this event is closed.
-    //
-    // When this happens, the loader will send a Response with the appropriate
-    // error code.
-    handle<eventpair>? event;
-
-    // The cache behavior for the request.
-    CacheMode cache_mode = DEFAULT;
-
-    // The response body mode.
-    ResponseBodyMode response_body_mode = BUFFER;
-};
-
-// A description of the redirect the server requested.
-//
-// The semantics of an HTTP redirect vary according to the status code use to
-// generate the redirect. This structure ensures that the loader and its client
-// agree on the interpretation of the redirect response from the server.
-struct RedirectTarget {
-    // The HTTP method the server suggested for the redirect.
-    string method;
-
-    // The URL the server suggested for the redirect.
-    vector<uint8> url;
-
-    // The referrer the server suggested for the redirect.
-    vector<uint8> referrer;
-};
-
-// A response to an HTTP request.
-struct Response {
-    // If the response resulted in a network level error, this field will be set.
-    Error? error;
-
-    // The response body.
-    Body? body;
-
-    // The final URL of the response, after redirects have been followed.
-    vector<uint8>? url;
-
-    // The HTTP status code.
-    //
-    // 0 if not applicable.
-    uint32 status_code;
-
-    // The HTTP status line.
-    string? status_line;
-
-    // The HTTP response headers.
-    vector<Header>? headers;
-
-    // The MIME type of the response body.
-    string? mime_type;
-
-    // The character set of the response body.
-    string? charset;
-};
-
-// An HTTP loader.
-//
-// The loader can service many HTTP requests concurrently. The loader tracks all
-// the outstanding requests and will cancel them all if the client closes the
-// loader interface.
-[Discoverable]
-interface Loader {
-    // Initiate the given HTTP request, follow redirects, and return the final
-    // response.
-    //
-    // The loader will follow redirects (up to an implementation-defined limit)
-    // and return the final response as a reply to this message. To cancel the
-    // request, either close the loader interface or close the peer to the |event|
-    // included in the |request|.
-    1: Fetch(Request request) -> (Response response);
-
-    // Initiate the given HTTP request and return all intermediate responses to
-    // the given client.
-    //
-    // Unlike |Fetch|, |Start| does not automatically follow all redirects.
-    // Instead, each individual response along the redirect chain is delivered to
-    // the |LoaderClient|.
-    2: Start(Request request, LoaderClient client);
-};
-
-// A client interface used with |Loader.Start|.
-//
-// Closing the underlying channel will cancel the associated HTTP transaction.
-interface LoaderClient {
-    // Called by the loader when the loader receives an HTTP response.
-    //
-    // If the server has requested a redirect, then |redirect| will be non-null
-    // and describe the target the server requested. To follow the redirect, reply
-    // to this message. To not follow the redirect, close the underlying channel.
-    1: OnResponse(Response response, RedirectTarget? redirect) -> ();
-};
diff --git a/fidl/fuchsia.net.http/meta.json b/fidl/fuchsia.net.http/meta.json
deleted file mode 100644
index 024fdfe..0000000
--- a/fidl/fuchsia.net.http/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.net.http/client.fidl"
-  ], 
-  "name": "fuchsia.net.http", 
-  "root": "fidl/fuchsia.net.http", 
-  "sources": [
-    "fidl/fuchsia.net.http/client.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.net.oldhttp/http_error.fidl b/fidl/fuchsia.net.oldhttp/http_error.fidl
deleted file mode 100644
index db39ed6..0000000
--- a/fidl/fuchsia.net.oldhttp/http_error.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-struct HttpError {
-  int32 code;
-  string? description;
-};
diff --git a/fidl/fuchsia.net.oldhttp/http_header.fidl b/fidl/fuchsia.net.oldhttp/http_header.fidl
deleted file mode 100644
index 5e5f48f..0000000
--- a/fidl/fuchsia.net.oldhttp/http_header.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-struct HttpHeader {
-  string name;
-  string value;
-};
diff --git a/fidl/fuchsia.net.oldhttp/http_service.fidl b/fidl/fuchsia.net.oldhttp/http_service.fidl
deleted file mode 100644
index 8e960a7..0000000
--- a/fidl/fuchsia.net.oldhttp/http_service.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-[Discoverable]
-interface HttpService {
-  1: CreateURLLoader(request<URLLoader> loader);
-};
diff --git a/fidl/fuchsia.net.oldhttp/meta.json b/fidl/fuchsia.net.oldhttp/meta.json
deleted file mode 100644
index 1078f70..0000000
--- a/fidl/fuchsia.net.oldhttp/meta.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "deps": [
-    "fuchsia.mem", 
-    "fuchsia.netstack"
-  ], 
-  "files": [
-    "fidl/fuchsia.net.oldhttp/http_error.fidl", 
-    "fidl/fuchsia.net.oldhttp/http_header.fidl", 
-    "fidl/fuchsia.net.oldhttp/http_service.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_body.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_loader.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_request.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_response.fidl"
-  ], 
-  "name": "fuchsia.net.oldhttp", 
-  "root": "fidl/fuchsia.net.oldhttp", 
-  "sources": [
-    "fidl/fuchsia.net.oldhttp/http_error.fidl", 
-    "fidl/fuchsia.net.oldhttp/http_header.fidl", 
-    "fidl/fuchsia.net.oldhttp/http_service.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_body.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_loader.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_request.fidl", 
-    "fidl/fuchsia.net.oldhttp/url_response.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.net.oldhttp/url_body.fidl b/fidl/fuchsia.net.oldhttp/url_body.fidl
deleted file mode 100644
index d0bb9b2..0000000
--- a/fidl/fuchsia.net.oldhttp/url_body.fidl
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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.
-
-library fuchsia.net.oldhttp;
-
-using fuchsia.mem;
-
-union URLBody {
-  // A socket that will contain the streaming request or response body.
-  handle<socket> stream;
-  // A shared buffer that will contain the complete request or response body.
-  fuchsia.mem.Buffer buffer;
-};
diff --git a/fidl/fuchsia.net.oldhttp/url_loader.fidl b/fidl/fuchsia.net.oldhttp/url_loader.fidl
deleted file mode 100644
index 4f44c0c..0000000
--- a/fidl/fuchsia.net.oldhttp/url_loader.fidl
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-struct URLLoaderStatus {
-  // If the loader has failed due to a network level error, this field will be
-  // set.
-  HttpError? error;
-
-  // Set to true if the URLLoader is still working. Set to false once an error
-  // is encountered or the response body is completely copied to the response
-  // body stream.
-  bool is_loading;
-
-  // TODO(darin): Add further details about the stages of loading (e.g.,
-  // "resolving host") that happen prior to receiving bytes.
-};
-
-interface URLLoader {
-  // Loads the given |request|, asynchronously producing |response|. Consult
-  // |response| to determine if the request resulted in an error, was
-  // redirected, or has a response body to be consumed.
-  1: Start(URLRequest request) -> (URLResponse response);
-
-  // If the request passed to |Start| had |auto_follow_redirects| set to false,
-  // then upon receiving an URLResponse with a non-NULL |redirect_url| field,
-  // |FollowRedirect| may be called to load the URL indicated by the redirect.
-  2: FollowRedirect() -> (URLResponse response);
-
-  // Query status about the URLLoader.
-  3: QueryStatus() -> (URLLoaderStatus status);
-};
diff --git a/fidl/fuchsia.net.oldhttp/url_request.fidl b/fidl/fuchsia.net.oldhttp/url_request.fidl
deleted file mode 100644
index 999675e..0000000
--- a/fidl/fuchsia.net.oldhttp/url_request.fidl
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-// Specify the cache behavior of the request.
-enum CacheMode {
-  // Default behavior.
-  DEFAULT = 0;
-
-  // The HTTP request will bypass the local cache and will have a
-  // 'Cache-Control: nocache' header added in that causes any proxy servers
-  // to also not satisfy the request from their cache.  This has the effect
-  // of forcing a full end-to-end fetch.
-  BYPASS_CACHE = 1;
-
-  // The HTTP request will fail if it cannot serve the requested resource
-  // from the cache (or some equivalent local store).
-  ONLY_FROM_CACHE = 2;
-};
-
-// Specify the mechanism used to return the response body.
-enum ResponseBodyMode {
-  // The complete response body should be returned in the |buffer| field of
-  // the response body.
-  BUFFER = 0;
-  // The response body should be streamed through the |stream| field of the
-  // response body.
-  STREAM = 1;
-  // The response body may be returned as a buffer or stream.
-  BUFFER_OR_STREAM = 2;
-};
-
-struct URLRequest {
-  // The URL to load.
-  string url;
-
-  // The HTTP method if applicable.
-  string method = "GET";
-
-  // Additional HTTP request headers.
-  vector<HttpHeader>? headers;
-
-  // The payload for the request body. For HTTP requests, the method must be set
-  // to "POST" or "PUT". If a buffer is used for the body, a Content-Length
-  // header will automatically be added.
-  URLBody? body;
-
-  // The buffer size of the socket returned in URLResponse's |body| member.
-  // A value of 0 indicates that the default buffer size should be used.  This
-  // value is just a suggestion. The URLLoader may choose to ignore this value.
-  uint32 response_body_buffer_size = 0;
-
-  // If set to true, then redirects will be automatically followed. Otherwise,
-  // when a redirect is encounterd, FollowRedirect must be called to proceed.
-  bool auto_follow_redirects = false;
-
-  // The cache behavior for the request.
-  CacheMode cache_mode = DEFAULT;
-
-  // The response body mode.
-  ResponseBodyMode response_body_mode = STREAM;
-};
diff --git a/fidl/fuchsia.net.oldhttp/url_response.fidl b/fidl/fuchsia.net.oldhttp/url_response.fidl
deleted file mode 100644
index e8667ca..0000000
--- a/fidl/fuchsia.net.oldhttp/url_response.fidl
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.net.oldhttp;
-
-struct URLResponse {
-  // If the response resulted in a network level error, this field will be set.
-  HttpError? error;
-
-  // The response body.
-  URLBody? body;
-
-  // The final URL of the response, after redirects have been followed.
-  string? url;
-
-  // The HTTP status code. 0 if not applicable.
-  uint32 status_code;
-
-  // The HTTP status line.
-  string? status_line;
-
-  // The HTTP response headers.
-  vector<HttpHeader>? headers;
-
-  // The MIME type of the response body.
-  string? mime_type;
-
-  // The character set of the response body.
-  string? charset;
-
-  // These fields are set to non-NULL if this response corresponds to a
-  // redirect.  Call the |FollowRedirect| method on the URLLoader instance to
-  // follow this redirect.
-  string? redirect_method;
-  string? redirect_url;
-  string? redirect_referrer;
-};
diff --git a/fidl/fuchsia.net/connectivity.fidl b/fidl/fuchsia.net/connectivity.fidl
deleted file mode 100644
index 671cb9d..0000000
--- a/fidl/fuchsia.net/connectivity.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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.
-
-library fuchsia.net;
-
-[Discoverable]
-interface Connectivity {
-    1: -> OnNetworkReachable(bool reachable);
-};
diff --git a/fidl/fuchsia.net/meta.json b/fidl/fuchsia.net/meta.json
deleted file mode 100644
index 4c6f872..0000000
--- a/fidl/fuchsia.net/meta.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.net/connectivity.fidl", 
-    "fidl/fuchsia.net/net.fidl", 
-    "fidl/fuchsia.net/socket.fidl"
-  ], 
-  "name": "fuchsia.net", 
-  "root": "fidl/fuchsia.net", 
-  "sources": [
-    "fidl/fuchsia.net/connectivity.fidl", 
-    "fidl/fuchsia.net/net.fidl", 
-    "fidl/fuchsia.net/socket.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.net/net.fidl b/fidl/fuchsia.net/net.fidl
deleted file mode 100644
index b881862..0000000
--- a/fidl/fuchsia.net/net.fidl
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-library fuchsia.net;
-
-// IPv4Address is expressed in network byte order, so the most significant byte
-// ("127" in the address "127.0.0.1") will be at index 0.
-struct IPv4Address {
-    array<uint8>:4 addr;
-};
-
-// IPv6Address is expressed in network byte order, so the most significant byte
-// ("ff" in the address "ff02::1") will be at index 0.
-struct IPv6Address {
-    array<uint8>:16 addr;
-};
-
-union IpAddress {
-    IPv4Address ipv4;
-    IPv6Address ipv6;
-};
-
-struct Subnet {
-    // The IPv4 or IPv6 address. Only the |prefix_len| most significant bits may be set in |addr|;
-    // all bits in the host portion of the address must be zero.
-    IpAddress addr;
-
-    // The prefix length of the netmask. E.g. for 192.168.1.0/24, the prefix
-    // length is 24, corresponding to a netmask of 255.255.255.0.
-    // For IPv4, prefix_len must be in the range [0, 32].
-    // For IPv6, prefix_len must be in the range [0, 128].
-    uint8 prefix_len;
-};
diff --git a/fidl/fuchsia.net/socket.fidl b/fidl/fuchsia.net/socket.fidl
deleted file mode 100644
index 34b8f23..0000000
--- a/fidl/fuchsia.net/socket.fidl
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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.
-
-library fuchsia.net;
-
-// Legacy interface to create a socket
-enum SocketDomain {
-    inet = 2;
-    inet6 = 10;
-};
-
-enum SocketType {
-    stream = 1;
-    dgram = 2;
-};
-
-enum SocketProtocol {
-    ip = 0;
-    icmp = 1;
-    tcp = 6;
-    udp = 17;
-    ipv6 = 41;
-    icmpv6 = 58;
-};
-
-enum AddrInfoStatus {
-    ok = 0;
-    // invalid flags
-    bad_flags = 1;
-    // missing node name or service name
-    no_name = 2;
-    // temporary failure
-    again = 3;
-    // non-recoverable failure
-    fail = 4;
-    // no address found for node name
-    no_data = 5;
-    // argument buffer overflow
-    buffer_overflow = 6;
-    // system error
-    system_error = 7;
-};
-
-struct AddrInfoHints {
-    int32 flags;
-    int32 family;
-    int32 sock_type;
-    int32 protocol;
-};
-
-struct AddrStorage {
-    array<uint8>:16 val;
-    uint32 len;
-};
-
-struct AddrInfo {
-    int32 flags;
-    int32 family;
-    int32 sock_type;
-    int32 protocol;
-    AddrStorage addr; // TODO(tamird): use vector<uint8>:16 addr when we can?
-    uint16 port;
-};
-
-[Discoverable, Layout = "Simple"]
-interface LegacySocketProvider {
-    1: OpenSocket(SocketDomain domain, SocketType type, SocketProtocol protocol)
-           -> (handle<socket>? s, int32 status);
-    2: GetAddrInfo(string:256? node, string:256? service, AddrInfoHints? hints)
-           -> (AddrInfoStatus status, uint32 nres, array<AddrInfo>:4 res);
-    // TODO(tamird): change (nres, res) to a vector once we can.
-};
diff --git a/fidl/fuchsia.netstack/meta.json b/fidl/fuchsia.netstack/meta.json
deleted file mode 100644
index 90d68f4..0000000
--- a/fidl/fuchsia.netstack/meta.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "deps": [
-    "fuchsia.net", 
-    "zircon.ethernet"
-  ], 
-  "files": [
-    "fidl/fuchsia.netstack/netstack.fidl"
-  ], 
-  "name": "fuchsia.netstack", 
-  "root": "fidl/fuchsia.netstack", 
-  "sources": [
-    "fidl/fuchsia.netstack/netstack.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.netstack/netstack.fidl b/fidl/fuchsia.netstack/netstack.fidl
deleted file mode 100644
index 1b582f4..0000000
--- a/fidl/fuchsia.netstack/netstack.fidl
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.netstack;
-
-using fuchsia.net;
-using zircon.ethernet;
-using zx;
-
-enum Protocol {
-    UNSPECIFIED = 0;
-    UDP = 1;
-    TCP = 2;
-};
-
-enum Status {
-    OK = 0;
-    UNKNOWN_ERROR = 1;
-    DNS_ERROR = 2;
-    PARSE_ERROR = 3;
-    IPV4_ONLY = 4;
-    UNKNOWN_INTERFACE = 5;
-};
-
-struct NetErr {
-    Status status;
-    string message;
-};
-
-struct NetTrafficStats {
-    // See network interface stats in Linux for future ideas:
-    // https://chromium.googlesource.com/native_client/linux-headers-for-nacl/+/2dc04f8190a54defc0d59e693fa6cff3e8a916a9/include/linux/if_link.h#7
-
-    uint64 pkts_total;
-    uint64 pkts_echo_req; // request
-    uint64 pkts_echo_rep; // reply
-    uint64 pkts_echo_req_v6; // request
-    uint64 pkts_echo_rep_v6; // reply
-
-    uint64 bytes_total;
-};
-
-struct NetInterfaceStats {
-    // Placeholder for all statistics regarding the network interface,
-    // including, but not limited to traffic itself.
-
-    int64 up_since; // Unix epoch.
-
-    NetTrafficStats rx;
-    NetTrafficStats tx;
-};
-
-struct IpStats {
-    uint64 packets_received;
-    uint64 invalid_addresses_received;
-    uint64 packets_delivered;
-    uint64 packets_sent;
-    uint64 outgoing_packet_errors;
-};
-
-struct TcpStats {
-    uint64 active_connection_openings;
-    uint64 passive_connection_openings;
-    uint64 failed_connection_attempts;
-    uint64 valid_segments_received;
-    uint64 invalid_segments_received;
-    uint64 segments_sent;
-    uint64 resets_sent;
-};
-
-struct UdpStats {
-    uint64 packets_received;
-    uint64 unknown_port_errors;
-    uint64 receive_buffer_errors;
-    uint64 malformed_packets_received;
-    uint64 packets_sent;
-};
-
-// Mirrors tcpip.Stats in third_party/netstack/tcpip/tcpip.go.
-struct AggregateStats {
-    uint64 unknown_protocol_received_packets;
-    uint64 malformed_received_packets;
-    uint64 dropped_packets;
-    IpStats ip_stats;
-    TcpStats tcp_stats;
-    UdpStats udp_stats;
-};
-
-struct InterfaceConfig {
-    string name;
-    IpAddressConfig ip_address_config;
-};
-
-union IpAddressConfig {
-    fuchsia.net.Subnet static_ip;
-    bool dhcp;
-};
-
-// https://linux.die.net/man/7/netdevice
-struct NetInterface {
-    uint32 id;
-    uint32 flags;
-    uint32 features;
-    uint32 configuration;
-    string name;
-    fuchsia.net.IpAddress addr;
-    fuchsia.net.IpAddress netmask;
-    fuchsia.net.IpAddress broadaddr;
-    vector<fuchsia.net.Subnet> ipv6addrs;
-    vector<uint8> hwaddr;
-};
-
-// Flags for NetInterface.flags.
-const uint32 NetInterfaceFlagUp = 0x01; // Set if the interface is up.
-const uint32 NetInterfaceFlagDhcp = 0x02; // Set if DHCP is enabled.
-
-struct RouteTableEntry {
-    fuchsia.net.IpAddress destination;
-    fuchsia.net.IpAddress netmask;
-    fuchsia.net.IpAddress gateway;
-    uint32 nicid;
-};
-
-struct SocketAddress {
-    fuchsia.net.IpAddress addr;
-    uint16 port;
-};
-
-[Discoverable]
-interface Netstack {
-    // Finds the port number from a given service name and protocol. [service] can be a
-    // number like "42", or a service name like "http". If [protocol] is UNSPECIFIED,
-    // the service is checked for TCP first, then UDP.
-    2: GetPortForService(string service, Protocol protocol) -> (uint16 port);
-
-    // Finds the IP address for a given host name and port. This may issue network
-    // requests via DNS to look up domain names. E.g.
-    // GetAddress("example.com", 80) -> [{142.42.42.1}]
-    3: GetAddress(string address, uint16 port) -> (vector<SocketAddress> addresses, NetErr err);
-
-    // Returns the list of registered network interfaces.
-    4: GetInterfaces() -> (vector<NetInterface> interfaces);
-
-    // DEPRECATED: see devicesettings.fidl
-    // Returns the netstack's node name.
-    // 5: GetNodeName() -> (string node_name);
-
-    // Don't use this for read-modify-write.  Use StartRouteTableTransaction instead.
-    5: GetRouteTable() -> (vector<RouteTableEntry> rt);
-
-    // TODO (porce): Separate interfaces.
-    6: GetStats(uint32 nicid) -> (NetInterfaceStats stats);
-
-    // Get stats for all NICs on the stack.
-    7: GetAggregateStats() -> (AggregateStats stats);
-
-    // Sets the status (up or down) for the interface with the given nicid.
-    8: SetInterfaceStatus(uint32 nicid, bool enabled);
-
-    // DEPRECATED: Use StartRouteTableTransaction and SetRouteTable from there.
-    // 9: SetRouteTable(vector<RouteTableEntry> rt);
-
-    // Sets the address for the interface with the given nicid.
-    // Masks off addr.PrefixLen bits from addr.Addr to set the subnet.
-    10: SetInterfaceAddress(uint32 nicid, fuchsia.net.IpAddress addr, uint8 prefixLen) -> (NetErr result);
-
-    // Removes the address for the interface with the given nicid.
-    // Masks off addr.PrefixLen bits from addr.Addr to set the subnet.
-    15: RemoveInterfaceAddress(uint32 nicid, fuchsia.net.IpAddress addr, uint8 prefixLen) -> (NetErr result);
-
-    11: SetDhcpClientStatus(uint32 nicid, bool enabled) -> (NetErr result);
-
-    12: BridgeInterfaces(vector<uint32> nicids) -> (NetErr result);
-
-    // TODO(NET-1263): remove once we can use the ResolverAdmin interface
-    16: SetNameServers(vector<fuchsia.net.IpAddress> servers);
-
-    17: AddEthernetDevice(string topological_path, InterfaceConfig interfaceConfig, zircon.ethernet.Device device);
-
-    // Begin a route transaction for atomically getting and setting the route
-    // table.  Returns true if a transaction can be started.
-    18: StartRouteTableTransaction(request<RouteTableTransaction> routeTableTransaction) -> (zx.status status);
-
-    0x1000: -> OnInterfacesChanged(vector<NetInterface> interfaces);
-};
-
-// When Commit is called, the most recent SetRouteTable will be
-// committed to the route tables.  Commit may be called multiple times.
-[Discoverable]
-interface RouteTableTransaction {
-    1: GetRouteTable() -> (vector<RouteTableEntry> rt);
-
-    2: SetRouteTable(vector<RouteTableEntry> rt);
-
-    3: Commit() -> (zx.status status);
-};
diff --git a/fidl/fuchsia.process/launcher.fidl b/fidl/fuchsia.process/launcher.fidl
deleted file mode 100644
index 5415894..0000000
--- a/fidl/fuchsia.process/launcher.fidl
+++ /dev/null
@@ -1,148 +0,0 @@
-// 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.
-
-library fuchsia.process;
-
-using fuchsia.io;
-using zx;
-
-struct HandleInfo {
-    // The handle to use for this argument.
-    handle handle;
-
-    // Process argument identifier, from <zircon/processargs.h>.
-    uint32 id;
-};
-
-struct NameInfo {
-    // Path at which to install the associated directory.
-    //
-    // Must be an absolute path (i.e., start with '/').
-    string path;
-
-    // The associated directory.
-    fuchsia.io.Directory directory;
-};
-
-struct LaunchInfo {
-    // The executable to run in the process.
-    handle<vmo> executable;
-
-    // The job in which to create the process.
-    handle<job> job;
-
-    // The name to assign to the created process.
-    string name;
-};
-
-struct LaunchResult {
-    // A status code describing the result of the launch.
-    zx.status status;
-
-    // A string describing the failure.
-    //
-    // Non-null when |status| is an error.
-    string? error_message;
-
-    // The process that was launched.
-    //
-    // Present when |status| is ZX_OK.
-    handle<process>? process;
-};
-
-struct ProcessStartData {
-    // The process that was created.
-    handle<process> process;
-
-    // The vmar object that was created when the process was created.
-    //
-    // See <https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/process_create.md>.
-    handle<vmar> root_vmar;
-
-    // The initial thread for the process.
-    //
-    // Should be passed to |zx_process_start| when starting the process.
-    handle<thread> thread;
-
-    // The address of the initial entry point in the process.
-    //
-    // Should be passed to |zx_process_start| when starting the process.
-    uint64 entry;
-
-    // The stack pointer value for the initial thread of the process.
-    //
-    // Should be passed to |zx_process_start| when starting the process.
-    uint64 sp;
-
-    // The bootstrap channel to pass to the process on startup.
-    //
-    // Should be passed to |zx_process_start| when starting the process.
-    handle<channel> bootstrap;
-
-    // The base address of the vDSO to pass to the process on startup.
-    //
-    // Should be passed to |zx_process_start| when starting the process.
-    uint64 vdso_base;
-
-    // The base load address of the ELF file loaded.
-    //
-    // Most often used by debuggers or other tools that inspect the process.
-    uint64 base;
-};
-
-struct CreateWithoutStartingResult {
-    // A status code describing the result of the launch.
-    zx.status status;
-
-    // A string describing the failure.
-    //
-    // Non-null when |status| is an error.
-    string? error_message;
-
-    // Data describing the process that was created.
-    //
-    // Non-null when |status| is ZX_OK.
-    ProcessStartData? data;
-};
-
-[Discoverable]
-interface Launcher {
-    // Creates and starts the process described by |info|.
-    //
-    // After processing this message, the |Launcher| is reset to its initial
-    // state and is ready to launch another process.
-    1: Launch(LaunchInfo info) -> (LaunchResult result);
-
-    // Creates the process described by |info| but does not start it.
-    //
-    // After processing this message, the |Launcher| is reset to its initial
-    // state and is ready to launch another process.
-    //
-    // The caller is responsible for calling |zx_process_start| using the data
-    // in |ProcessStartData| to actually start the process.
-    2: CreateWithoutStarting(LaunchInfo info) -> (CreateWithoutStartingResult result);
-
-    // Adds the given arguments to the command-line for the process.
-    //
-    // Calling this method multiple times concatenattes the arguments.
-    10: AddArgs(vector<string> args);
-
-    // Adds the given variables to the environment variables for the process.
-    //
-    // Calling this method multiple times concatenates the variables.
-    11: AddEnvirons(vector<string> environ);
-
-    // Adds the given names to the namespace for the process.
-    //
-    // The paths in the namespace must be non-overlapping. See
-    // <https://fuchsia.googlesource.com/docs/+/master/the-book/namespaces.md> for details.
-    //
-    // Calling this method multiple times concatenates the names.
-    12: AddNames(vector<NameInfo> names);
-
-    // Adds the given handles to the startup handles for the process.
-    //
-    // Calling this method multiple times concatenates the handles.
-    13: AddHandles(vector<HandleInfo> handles);
-};
diff --git a/fidl/fuchsia.process/meta.json b/fidl/fuchsia.process/meta.json
deleted file mode 100644
index 5f06c40..0000000
--- a/fidl/fuchsia.process/meta.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "deps": [
-    "fuchsia.io", 
-    "fuchsia.ldsvc"
-  ], 
-  "files": [
-    "fidl/fuchsia.process/launcher.fidl", 
-    "fidl/fuchsia.process/resolver.fidl"
-  ], 
-  "name": "fuchsia.process", 
-  "root": "fidl/fuchsia.process", 
-  "sources": [
-    "fidl/fuchsia.process/launcher.fidl", 
-    "fidl/fuchsia.process/resolver.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.process/resolver.fidl b/fidl/fuchsia.process/resolver.fidl
deleted file mode 100644
index 780f8f9..0000000
--- a/fidl/fuchsia.process/resolver.fidl
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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.
-
-library fuchsia.process;
-
-using fuchsia.ldsvc;
-using zx;
-
-const uint32 MAX_RESOLVE_NAME = 2048;
-
-[Discoverable, Layout = "Simple"]
-interface Resolver {
-    // Resolves the given |name| to an |executable| and an shared library loader.
-    //
-    // If present, the |executable| is suitable for use as the |executable|
-    // property of |LaunchInfo|. If present, the |ldsvc| is suitable for use as
-    // the PA_LDSVC_LOADER handle when launching the process.
-    //
-    // For example, the resolver might locate the given |name| inside a package
-    // and return the executable binary from the package as well as a shared
-    // library loader scoped to that package.
-    1: Resolve(string:MAX_RESOLVE_NAME name) -> (zx.status status,
-                                                 handle<vmo>? executable,
-                                                 fuchsia.ldsvc.Loader? ldsvc);
-};
diff --git a/fidl/fuchsia.simplecamera/meta.json b/fidl/fuchsia.simplecamera/meta.json
deleted file mode 100644
index 8370c5b..0000000
--- a/fidl/fuchsia.simplecamera/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [
-    "fuchsia.images"
-  ], 
-  "files": [
-    "fidl/fuchsia.simplecamera/simple_camera.fidl"
-  ], 
-  "name": "fuchsia.simplecamera", 
-  "root": "fidl/fuchsia.simplecamera", 
-  "sources": [
-    "fidl/fuchsia.simplecamera/simple_camera.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.simplecamera/simple_camera.fidl b/fidl/fuchsia.simplecamera/simple_camera.fidl
deleted file mode 100644
index f551fde..0000000
--- a/fidl/fuchsia.simplecamera/simple_camera.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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.
-
-library fuchsia.simplecamera;
-
-using fuchsia.images;
-
-// Simple camera interface.  This will be deprecated when
-// CameraManager replaces it.
-[Discoverable]
-interface SimpleCamera {
-  // Connect to a camera using the first enumerated format.
-  // The device opened will be /dev/class/camera/camera_id
-  1: ConnectToCamera(uint32 camera_id, fuchsia.images.ImagePipe image_pipe);
-};
diff --git a/fidl/fuchsia.sys/component_controller.fidl b/fidl/fuchsia.sys/component_controller.fidl
deleted file mode 100644
index 42e20ec..0000000
--- a/fidl/fuchsia.sys/component_controller.fidl
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-enum TerminationReason {
-  // The channel closed without giving a termination reason.
-  UNKNOWN = 0;
-  // Component ran and exited with a given return_code.
-  EXITED = 1;
-  // The given URL given to launch was invalid.
-  URL_INVALID = 2;
-  // The requested package could not be found.
-  PACKAGE_NOT_FOUND = 3;
-  // An internal error happened during the launch process.
-  INTERNAL_ERROR = 4;
-  // Process creation failed.
-  PROCESS_CREATION_ERROR = 5;
-  // A Runner failed to start.
-  RUNNER_FAILED = 6;
-  // A Runner terminated while attempting to run a component.
-  RUNNER_TERMINATED = 7;
-  // Attempted to use an unsupported feature.
-  UNSUPPORTED = 8;
-};
-
-// An interface for controlling components.
-//
-// Closing this interface implicitly kills the controlled component unless
-// the |Detach| method has been called.
-//
-// If the component exits, this interface will be closed.
-//
-// Typically obtained via |Launcher.CreateComponent|.
-interface ComponentController {
-  // Terminates the component.
-  //
-  // This ComponentController connection is closed when the component has
-  // terminated.
-  1: Kill();
-
-  // Decouples the lifetime of the component from this controller.
-  //
-  // After calling |Detach|, the component will not be implicitly killed when
-  // this interface is closed.
-  2: Detach();
-
-  // DEPRECATED: Use OnTerminated instead of Wait().
-  // 3: Wait()
-
-  // Event that is triggered when the component is terminated.
-  //
-  // This event provides the return code of the process and reason for
-  // its termination. The return_code is only valid if the termination
-  // reason is EXITED. If the termination reason is not EXITED, the
-  // return code is guaranteed not to be 0.
-  4: -> OnTerminated(int64 return_code, TerminationReason termination_reason);
-
-  // Event that is triggered when the component's output directory is mounted.
-  //
-  // This event will not be triggered for every component, only those that
-  // serve a directory over their PA_DIRECTORY_REQUEST handle.
-  5: -> OnDirectoryReady();
-};
diff --git a/fidl/fuchsia.sys/environment.fidl b/fidl/fuchsia.sys/environment.fidl
deleted file mode 100644
index 2bbf1b3..0000000
--- a/fidl/fuchsia.sys/environment.fidl
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-// Maximum length for an environment label.
-const uint32 kLabelMaxLength = 32;
-
-struct EnvironmentOptions {
-  // True if this environment should inherit services provided by the
-  // parent environment.
-  bool inherit_parent_services;
-  // True if components in this environment can share a runner provided
-  // by the parent environment. If false, a new runner will be started
-  // in this environment for components.
-  bool allow_parent_runners;
-  // True if this environment should be killed first in out of memory
-  // situations by setting the ZX_PROP_JOB_KILL_ON_OOM property on this
-  // environment's job.
-  bool kill_on_oom;
-};
-
-// An interface for managing a set of applications.
-//
-// Applications run inside environments, which provide ambient services and
-// support for their lifecycle.
-[Discoverable] interface Environment {
-  // Creates a new environment nested inside this environment.
-  //
-  // When applications are created inside the nested environment using the
-  // environment's |Launcher|, the environment requests the
-  // environment services from |host_directory| before passing those services to
-  // the newly created application in its |StartupInfo|.
-  //
-  // The |controller| can be used to control the lifecycle of the created
-  // environment. If an |EnvironmentController|'s interface is
-  // request, the environment will be killed when the interface is closed.
-  //
-  // The |label| is an optional name to associate with the environment for
-  // diagnostic purposes.  The label will be truncated if it is longer
-  // than |kLabelMaxLength|.
-  //
-  // |additional_services|, which may be empty, contains a list of services
-  // that the environment provides, which are hosted by
-  // |additional_services.host_directory|. If |options.inherit_parent_services|
-  // is false, |host_directory| must provide a |Loader| service if it wishes to
-  // allow new components to be loaded in the new environment.
-  //
-  // |options| provides additional options, see |EnvironmentOptions| for
-  // details.
-  1: CreateNestedEnvironment(request<Environment> environment,
-                             request<EnvironmentController>? controller,
-                             string? label,
-                             ServiceList? additional_services,
-                             EnvironmentOptions options);
-
-  // Gets the Launcher associated with this environment.
-  //
-  // Applications created using this application launcher will be given the
-  // environment services provided by this environment's |host_directory|.
-  2: GetLauncher(request<Launcher> launcher);
-
-  // Gets a superset of services provided by this environment's
-  // |host_directory|.
-  3: GetServices(request<ServiceProvider> services);
-
-  // Gets a superset of services provided by this environment's
-  // |host_directory|.
-  4: GetDirectory(handle<channel> directory_request);
-};
diff --git a/fidl/fuchsia.sys/environment_controller.fidl b/fidl/fuchsia.sys/environment_controller.fidl
deleted file mode 100644
index c886c6b..0000000
--- a/fidl/fuchsia.sys/environment_controller.fidl
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-// An interface for controlling an environment.
-//
-// Closing this interface implicitly kills the controlled environment unless
-// the |Detach| method has been called.
-//
-// If the environment is destroyed, this interface will be closed.
-//
-// Typically obtained via |Environment.CreateNestedEnvironment|.
-interface EnvironmentController {
-  // Terminates the environment.
-  //
-  // When an |Environment| is terminated, all applications launched
-  // in the environment (and in all transitively nested environments) are also
-  // killed.
-  1: Kill() -> ();
-
-  // Decouples the lifetime of the environment from this controller.
-  //
-  // After calling |Detach|, the environment will not be implicitly killed when
-  // this interface is closed.
-  2: Detach();
-
-  // Event that is triggered when the environment is created.
-  3: -> OnCreated();
-};
diff --git a/fidl/fuchsia.sys/flat_namespace.fidl b/fidl/fuchsia.sys/flat_namespace.fidl
deleted file mode 100644
index fe8bdb9..0000000
--- a/fidl/fuchsia.sys/flat_namespace.fidl
+++ /dev/null
@@ -1,15 +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.
-
-library fuchsia.sys;
-
-struct FlatNamespace {
-  // The mount point for each of the directories below.
-  //
-  // For example, ["/pkg", "/svc"].
-  vector<string> paths;
-
-  // The directories mounted at each path in the namespace.
-  vector<handle<channel>> directories;
-};
diff --git a/fidl/fuchsia.sys/job_provider.fidl b/fidl/fuchsia.sys/job_provider.fidl
deleted file mode 100644
index dbdbe7d..0000000
--- a/fidl/fuchsia.sys/job_provider.fidl
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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.
-
-library fuchsia.sys;
-
-// An interface for providing a job handle. Instances of this interface are
-// created in the context of an already-identified realm, so there is no need
-// to explicitly identify the realm below.
-[Discoverable]
-interface JobProvider {
-  // Gets the root job associated with the realm.
-  1: GetJob() -> (handle<job> job);
-};
diff --git a/fidl/fuchsia.sys/launcher.fidl b/fidl/fuchsia.sys/launcher.fidl
deleted file mode 100644
index 0df4415..0000000
--- a/fidl/fuchsia.sys/launcher.fidl
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-// An FDIO file descriptor.
-// TODO(abarth): Use the real FDIO declaration once FDIO converts to FIDL2.
-struct FileDescriptor {
-  // The FDIO types of the handle (e.g., FA_FDIO_REMOTE).
-  int32 type0;
-  int32 type1;
-  int32 type2;
-
-  // The handles for the file descriptor (e.g., a channel).
-  handle? handle0;
-  handle? handle1;
-  handle? handle2;
-};
-
-// Information used to create an instance of a component and obtain
-// services from it.
-struct LaunchInfo {
-  // The location from which to retrieve this component.
-  //
-  // This field will probably be replaced with a stronger notion of identity,
-  // such as an unforgeable token. This field is included in this iteration to
-  // ease the transition from the previous component interfaces.
-  string url;
-
-  // The arguments to be provided to the component.
-  vector<string>? arguments;
-
-  // The file descriptor to use for stdout.
-  //
-  // If null, the component will use the default stdout for the environment.
-  FileDescriptor? out;
-
-  // The file descriptor to use for stderr.
-  //
-  // If null, the component will use the default stderr for the environment.
-  FileDescriptor? err;
-
-  // The interface request for a Directory that is passed through to the
-  // component and arrives in the component as its |directory_request|
-  // interface request.
-  handle<channel>? directory_request;
-
-  // A custom namespace that can be appended to the namespace generated by
-  // appmgr and provided to this component.
-  // Adding a mount point at standard paths like 'pkg' or 'svc' will be ignored.
-  // HACK(alhaad): Adding mount points for deprecated default directories like
-  // '/data' will override the default.
-  FlatNamespace? flat_namespace;
-
-  // A list of services to be added to this component's svc namespace. These
-  // services are in addition to those coming from Environment.
-  ServiceList? additional_services;
-};
-
-struct ServiceList {
-  // A list of services that can be requested from |provider|.
-  vector<string> names;
-
-  // A service provider to get the services listed in |names| from.
-  ServiceProvider? provider;
-
-  // A channel to the directory hosting the services in |names|.
-  // TODO(CP-124): Support |host_directory| for CreateComponent and deprecate
-  // |provider|.
-  handle<channel>? host_directory;
-};
-
-// An interface for creating component instances.
-//
-// Typically obtained via |Environment.GetLauncher|.
-[Discoverable]
-interface Launcher {
-  // Creates a new instance of the component described by |launch_info|.
-  //
-  // The component instance is created in the |Environment|
-  // associated with this |Launcher|. When creating the component,
-  // the environment requests the environment services for this component from
-  // its |EnvironmentHost|.
-  //
-  // The |controller| can be used to control the lifecycle of the created
-  // component instance. If an |ComponentController|'s interface is
-  // requested, the component instance is killed when the interface is closed.
-  1: CreateComponent(LaunchInfo launch_info,
-                     request<ComponentController>? controller);
-};
diff --git a/fidl/fuchsia.sys/loader.fidl b/fidl/fuchsia.sys/loader.fidl
deleted file mode 100644
index c8ed6ab..0000000
--- a/fidl/fuchsia.sys/loader.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-// An interface for loading from pacakges.
-[Discoverable]
-interface Loader {
-    // LoadUrl a package by url.
-    1: LoadUrl(string url) -> (Package? package);
-};
diff --git a/fidl/fuchsia.sys/meta.json b/fidl/fuchsia.sys/meta.json
deleted file mode 100644
index 35dee7e..0000000
--- a/fidl/fuchsia.sys/meta.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "deps": [
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.sys/component_controller.fidl", 
-    "fidl/fuchsia.sys/environment.fidl", 
-    "fidl/fuchsia.sys/environment_controller.fidl", 
-    "fidl/fuchsia.sys/flat_namespace.fidl", 
-    "fidl/fuchsia.sys/job_provider.fidl", 
-    "fidl/fuchsia.sys/launcher.fidl", 
-    "fidl/fuchsia.sys/loader.fidl", 
-    "fidl/fuchsia.sys/runner.fidl", 
-    "fidl/fuchsia.sys/service_provider.fidl"
-  ], 
-  "name": "fuchsia.sys", 
-  "root": "fidl/fuchsia.sys", 
-  "sources": [
-    "fidl/fuchsia.sys/component_controller.fidl", 
-    "fidl/fuchsia.sys/environment.fidl", 
-    "fidl/fuchsia.sys/environment_controller.fidl", 
-    "fidl/fuchsia.sys/flat_namespace.fidl", 
-    "fidl/fuchsia.sys/job_provider.fidl", 
-    "fidl/fuchsia.sys/launcher.fidl", 
-    "fidl/fuchsia.sys/loader.fidl", 
-    "fidl/fuchsia.sys/runner.fidl", 
-    "fidl/fuchsia.sys/service_provider.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.sys/runner.fidl b/fidl/fuchsia.sys/runner.fidl
deleted file mode 100644
index dfa10e4..0000000
--- a/fidl/fuchsia.sys/runner.fidl
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-using fuchsia.mem;
-
-// Information given to components at startup.
-//
-// For ELF binaries, this information is provided in the initialization message
-// given to libc by fuchsia.process.Launcher.
-struct StartupInfo {
-  // The launch info for the to start.
-  LaunchInfo launch_info;
-
-  // The namespace in which to run the component.
-  FlatNamespace flat_namespace;
-
-  // Key string value string map of the component's program metadata, obtained
-  // from its component manifest.
-  vector<ProgramMetadata>? program_metadata;
-
-  // TODO(abarth): Add more fields to this struct relating to component and
-  // environment identity.
-};
-
-// Program information about a component.
-struct ProgramMetadata {
-  // Key for program metadata pair. E.g. "binary" for an ELF binary component,
-  // or "data" for a flutter/dart component.
-  string key;
-
-  // Value for program metadata pair. E.g. "bin/app" for a "binary" key, or
-  // "data/foo" for a flutter/dart component.
-  string value;
-};
-
-// A binary representation of a component.
-//
-// Typically provided to |Runner.StartComponent| when starting a
-// component.
-struct Package {
-  // A read-only binary representation of the component. For example, if the
-  // component is intended to run in the Dart virtual machine, this data might
-  // contain a dartx package.
-  fuchsia.mem.Buffer? data;
-
-  // A directory containing the contents of the package. For example, if the
-  // component is stored in pkgfs, this directory will be the pkgfs directory
-  // containing the package.
-  handle<channel>? directory;
-
-  // Resolved URL of the component. This is the url specified in startup_info
-  // after following redirects and resolving relative paths.
-  string resolved_url;
-};
-
-// An interface for running components.
-//
-// Typically exposed by components that provide execution environments for
-// particular classes of programs. For example, the Dart virtual machine exposes
-// this interface to run Dart programs.
-[Discoverable]
-interface Runner {
-  // Execute the given component.
-  //
-  // Upon startup, the component is to be given the information in
-  // |startup_info|, but the mechanism by which the component receives that
-  // information is up to the component runner.
-  //
-  // The |controller| interface request typically originates from the
-  // |Launcher.CreateComponent| message that caused this
-  // component to be started.
-  1: StartComponent(Package package,
-                    StartupInfo startup_info,
-                    request<ComponentController>? controller);
-};
diff --git a/fidl/fuchsia.sys/service_provider.fidl b/fidl/fuchsia.sys/service_provider.fidl
deleted file mode 100644
index be2ef12..0000000
--- a/fidl/fuchsia.sys/service_provider.fidl
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.sys;
-
-// An interface through which a client may request services from a host.
-// Instances of this interface are created within the context of an
-// already-identified client and host pair, so there is no need to explicitly
-// identify the client or host in the methods below.
-//
-// This interface is deprecated.  Services should be published as directory
-// entries instead, just like files.
-// TODO(ZX-1358): Point to the FIDL interface for file I/O once RIO is migrated.
-interface ServiceProvider {
-  // Asks the host to provide the service identified by |service_name| through
-  // the |channel| endpoint supplied by the caller. If the host is not willing
-  // or able to provide the requested service, it should close the |channel|.
-  1: ConnectToService(string service_name, handle<channel> channel);
-};
diff --git a/fidl/fuchsia.sysinfo/meta.json b/fidl/fuchsia.sysinfo/meta.json
deleted file mode 100644
index 98fb975..0000000
--- a/fidl/fuchsia.sysinfo/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.sysinfo/sysinfo.fidl"
-  ], 
-  "name": "fuchsia.sysinfo", 
-  "root": "fidl/fuchsia.sysinfo", 
-  "sources": [
-    "fidl/fuchsia.sysinfo/sysinfo.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.sysinfo/sysinfo.fidl b/fidl/fuchsia.sysinfo/sysinfo.fidl
deleted file mode 100644
index 4cfd790..0000000
--- a/fidl/fuchsia.sysinfo/sysinfo.fidl
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-library fuchsia.sysinfo;
-
-using zx;
-
-const uint8 SYSINFO_BOARD_NAME_LEN = 32;
-
-enum InterruptControllerType {
-    UNKNOWN = 0;
-    APIC = 1;
-    GIC_V2 = 2;
-    GIC_V3 = 3;
-};
-
-struct InterruptControllerInfo {
-    InterruptControllerType type;
-};
-
-[Layout = "Simple"]
-interface Device {
-    // Return the root job handle.
-    1: GetRootJob() -> (zx.status status, handle<job>? job);
-
-    // Return the root resource (with only ZX_RIGHT_ENUMERATE and ZX_RIGHT_TRANSFER).
-    2: GetRootResource() -> (zx.status status, handle<resource>? resource);
-
-    // Return the hypervisor resource (with only ZX_RIGHT_TRANSFER).
-    3: GetHypervisorResource() -> (zx.status status, handle<resource>? resource);
-
-    // Return the board name for the platform we are running on.
-    4: GetBoardName() -> (zx.status status, string:SYSINFO_BOARD_NAME_LEN? name);
-
-    // Return interrupt controller information.
-    5: GetInterruptControllerInfo() -> (zx.status status, InterruptControllerInfo? info);
-};
diff --git a/fidl/fuchsia.ui.app/meta.json b/fidl/fuchsia.ui.app/meta.json
deleted file mode 100644
index 1b67046..0000000
--- a/fidl/fuchsia.ui.app/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [
-    "fuchsia.sys"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.app/view_provider.fidl"
-  ], 
-  "name": "fuchsia.ui.app", 
-  "root": "fidl/fuchsia.ui.app", 
-  "sources": [
-    "fidl/fuchsia.ui.app/view_provider.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.app/view_provider.fidl b/fidl/fuchsia.ui.app/view_provider.fidl
deleted file mode 100644
index 0e1dbda..0000000
--- a/fidl/fuchsia.ui.app/view_provider.fidl
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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.
-
-library fuchsia.ui.app;
-
-using fuchsia.sys;
-
-// NOTE: This is likely not the ViewProvider you are looking for!  This is
-// the new ViewProvider interface that will be deprecating the old one soon.
-// The old ViewProvider is in fuchsia.ui.viewsv1.ViewProvider.
-// TODO(SCN-589): Remove this when old ViewProvider is deleted.
-//
-// ViewProvider is the standard mechanism for two modules to each obtain half
-// of a shared eventpair token.  The shared token is a capability allowing the
-// modules to ask Scenic to create a ViewHolder/View pair.  The resulting
-// View and ViewHolder are linked together until either one is destroyed.
-//
-// Modules are free to use any other mechanism to agree upon the shared
-// eventpair token, and use this to create the linked ViewHolder/View.
-// ViewProvider is given for the convenience of clients that don't require
-// a more complex implementation.
-[Discoverable]
-interface ViewProvider {
-    // Creates a new View under the control of the ViewProvider.
-    //
-    // |token| is one half of the shared eventpair which will bind the new View
-    // to its associated ViewHolder.  The ViewProvider will use |token| to
-    // create its internal View representation.  The caller is expected to use
-    // its half to create corresponding ViewHolder object.
-    //
-    // |incoming_services| allows clients to request services from the
-    // ViewProvider implementation.  |outgoing_services| allows clients to
-    // provide services of their own to the ViewProvider implementation.
-    //
-    // Clients can embed a ViewHolder (and by proxy the paired View) into their
-    // scene graph by using |Node.AddChild()|.  The ViewHolder cannot itself
-    // have any children. A ViewProvider implementation can nest scene objects
-    // within its View by using |View.AddChild()|.  The View itself
-    // cannot be a child of anything.
-    //
-    // Modules can use these mechanisms to establish a distributed,
-    // inter-process scene graph.
-    1: CreateView(handle<eventpair> token,
-                  request<fuchsia.sys.ServiceProvider>? incoming_services,
-                  fuchsia.sys.ServiceProvider? outgoing_services);
-};
diff --git a/fidl/fuchsia.ui.gfx/commands.fidl b/fidl/fuchsia.ui.gfx/commands.fidl
deleted file mode 100644
index a780347..0000000
--- a/fidl/fuchsia.ui.gfx/commands.fidl
+++ /dev/null
@@ -1,724 +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.
-
-library fuchsia.ui.gfx;
-
-using fuchsia.mem;
-
-// Commands that are used to modify the state of a |Session|.
-// TODO(SCN-237): reorder Command definitions to match the order in this union.
-union Command {
-  CreateResourceCmd create_resource;
-  ReleaseResourceCmd release_resource;
-  ExportResourceCmd export_resource;
-  ImportResourceCmd import_resource;
-
-  // Tagging commands.
-  SetTagCmd set_tag;
-
-  // Grouping commands.
-  DetachCmd detach;
-
-  // Spatial commands.
-  SetTranslationCmd set_translation;
-  SetScaleCmd set_scale;
-  SetRotationCmd set_rotation;
-  SetAnchorCmd set_anchor;
-  SetSizeCmd set_size;
-  SetOpacityCmd set_opacity;
-
-  SendSizeChangeHintCmdHACK send_size_change_hint_hack;
-
-  // Node-specific commands.
-  AddChildCmd add_child;  // TODO: Should we require a DetachCmd before
-                              // re-parenting?
-  AddPartCmd add_part;
-  DetachChildrenCmd detach_children;
-  SetShapeCmd set_shape;
-  SetMaterialCmd set_material;
-  SetClipCmd set_clip;
-  SetHitTestBehaviorCmd set_hit_test_behavior;
-  SetViewPropertiesCmd set_view_properties;
-  TakeSnapshotCmdHACK take_snapshot_cmd;
-
-  // Camera and lighting commands.
-  SetCameraCmd set_camera;
-  SetCameraTransformCmd set_camera_transform;
-  SetCameraProjectionCmd set_camera_projection;
-  SetStereoCameraProjectionCmd set_stereo_camera_projection;
-  SetCameraPoseBufferCmd set_camera_pose_buffer;
-  SetLightColorCmd set_light_color;
-  SetLightDirectionCmd set_light_direction;
-  AddLightCmd add_light;
-  DetachLightCmd detach_light;
-  DetachLightsCmd detach_lights;
-
-  SetTextureCmd set_texture;
-  SetColorCmd set_color;
-
-  // Mesh commands.
-  BindMeshBuffersCmd bind_mesh_buffers;
-
-  // Layer and renderer commands.
-  AddLayerCmd add_layer;
-  RemoveLayerCmd remove_layer;
-  RemoveAllLayersCmd remove_all_layers;
-  SetLayerStackCmd set_layer_stack;
-  SetRendererCmd set_renderer;
-  SetRendererParamCmd set_renderer_param;
-
-  // Events.
-  SetEventMaskCmd set_event_mask;
-
-  // Diagnostic commands.
-  SetLabelCmd set_label;
-
-  // Debugging commands.
-  SetDisableClippingCmd set_disable_clipping;
-
-  // TODO(SCN-1026): Remove this.
-  SetImportFocusCmd set_import_focus;
-};
-
-// Instructs the compositor to create the specified |Resource|, and to register
-// it in a table so that it can be referenced by subsequent commands.
-struct CreateResourceCmd {
-  // An ID that is currently not used within the session.
-  uint32 id;
-  ResourceArgs resource;
-};
-
-// Releases the client's reference to the resource; it is then illegal to use
-// the ID in subsequent Commands.  Other references to the resource may exist,
-// so releasing the resource does not result in its immediate destruction; it is
-// only destroyed once the last reference is released.  For example, the
-// resource may be required to render an in-progress frame, or it may be
-// referred to by another resource).  However, the ID will be immediately
-// unregistered, and may be reused to create a new resource.
-struct ReleaseResourceCmd {
-  // ID of the resource to be dereferenced.
-  uint32 id;
-};
-
-// Create an external reference to the specified resource, which can then be
-// imported into another Session by passing a handle to |token|'s peer to
-// ImportResourceCmd; see that comment for more details.
-//
-// The importing client is typically in a different process than the exporter.
-// No specific mechanism is provided for transferring a token from an exporter
-// to an importer; collaborators may choose any out-of-band API they wish to do
-// so.
-struct ExportResourceCmd {
-  uint32 id;
-  handle<eventpair> token;
-};
-
-// Import a resource that was exported via ExportResourceCmd().  |token| is
-// a handle to the eventpair peer that was used to export the resource, and
-// |spec| describes the type of the imported resource, and the commands which
-// can legally be applied to it.  Afterward, |id| can be used to refer to the
-// resource in an Command, similarly (but not identically: see below) to a
-// resource that was created in the session.  For example, you can add children
-// to an imported EntityNode via AddChildCmd.
-//
-// However, note that the importer does not gain full access to the imported
-// resource, but rather to an attenuated subset of its capabilities.  For
-// example, you cannot use a DetachCmd to detach an imported EntityNode from
-// its parent.
-//
-// Unlike ExportResourceCmd, there is no configurable timeout.  There is an
-// expectation that the exported resource will become available in a short
-// amount of time.  TODO: this needs elaboration... e.g. we might notify via the
-// SessionListener when we know that the link will never be made (e.g. if the
-// peer of the import token is destroyed).
-//
-// TODO: describe how the imported resource behaves if the exported resource
-// isn't yet available, or becomes unavailable (e.g. an imported Material might
-// act as a plain white texture).
-struct ImportResourceCmd {
-  uint32 id;
-  handle<eventpair> token;
-  ImportSpec spec;
-};
-
-// Maximum length for a resource label.
-const uint32 kLabelMaxLength = 32;
-
-// Sets/clears a label to help developers identify the purpose of the resource
-// when using diagnostic tools.
-//
-// The label serves no functional purpose in the scene graph.  It exists only
-// to help developers understand its structure.  The scene manager may truncate
-// or discard labels at will.
-//
-// Constraints:
-// - The label's maximum length is |kLabelMaxLength| characters.
-// - Setting the label to an empty string clears it.
-struct SetLabelCmd {
-  uint32 id;
-  string label;
-};
-
-// Add a node as a child to another node.
-//
-// Constraints:
-// - |id| refs a Node with the has_children characteristic.
-// - |child_id| refs any Node.
-//
-// Discussion:
-// The child node is first removed from its existing parent, as if DetachCmd
-// was applied first.
-struct AddChildCmd {
-  uint32 node_id;
-  uint32 child_id;
-};
-
-// Add a node as a part of another node.  The implications of being a part
-// rather than a child differ based on the type of the part.  However, one
-// implication is constant: removing all of a node's children (e.g. via
-// DetachChildrenCmd) does not affect its parts.  This is similar to the
-// "shadow DOM" in a web browser: the controls of a <video> element are
-// implemented as using the shadow DOM, and do no show up amongst the children
-// of that element.
-//
-// Constraints:
-// - |id| refs a Node with the has_parts characteristic.
-// - |part_id| refs any Node.
-//
-// Discussion:
-// The part node is first removed from its existing parent, as if DetachCmd
-// was applied first.
-struct AddPartCmd {
-  uint32 node_id;
-  uint32 part_id;
-};
-
-interface SnapshotCallbackHACK {
-  1: OnData(fuchsia.mem.Buffer data);
-};
-
-struct TakeSnapshotCmdHACK {
-  uint32 node_id;
-  SnapshotCallbackHACK callback;
-};
-
-// Detaches a parentable object from its parent (e.g. a node from a parent node,
-// or a layer from a layer stack).  It is illegal to apply this command to a
-// non-parentable object.  No-op if the target object currently has no parent.
-//
-// Constraints:
-// - |id| refs a parentable object
-//
-// Discussion:
-// For nodes, this command will detach a node from its parent, regardless of
-// whether it is a part or a child of its parent.
-struct DetachCmd {
-  uint32 id;
-};
-
-// Detaches all of a node's children (but not its parts).
-struct DetachChildrenCmd {
-  uint32 node_id;
-};
-
-// Sets/clears a node's tag value.
-//
-// A session can apply a tag value to any node to which it has access, including
-// imported nodes.  These tags are private to the session and cannot be read
-// or modified by other sessions.  When multiple sessions import the same node,
-// each session will only observe its own tag values.
-//
-// Hit test results for a session only include nodes which the session has
-// tagged with a non-zero value.  Therefore a session can use tag values to
-// associate nodes with their functional purpose when picked.
-//
-// Constraints:
-// - |node_id| refs a |Node|.
-// - |tag_value| is the tag value to assign, or 0 to remove the tag.
-struct SetTagCmd {
-  uint32 node_id;
-  uint32 tag_value;
-};
-
-// Sets a Resource's (typically a Node's) translation.
-//
-// Constraints:
-// - |id| refs a Resource with the has_transform characteristic.
-struct SetTranslationCmd {
-  uint32 id;
-  Vector3Value value;
-};
-
-// Sets a Resource's (typically a Node's) scale.
-//
-// Constraints:
-// - |id| refs a Resource with the has_transform characteristic.
-struct SetScaleCmd {
-  uint32 id;
-  Vector3Value value;
-};
-
-// Sets a Resource's (typically a Node's) rotation.
-//
-// Constraints:
-// - |id| refs a Resource with the has_transform characteristic.
-struct SetRotationCmd {
-  uint32 id;
-  QuaternionValue value;
-};
-
-// Sets a Resource's (typically a Node's) anchor point.
-//
-// Constraints:
-// - |id| refs a Resource with the has_transform characteristic.
-struct SetAnchorCmd {
-  uint32 id;
-  Vector3Value value;
-};
-
-// Sets an object's size.
-//
-// Constraints:
-// - |id| refs a resizeable object.
-// - some objects that support this command may have additional constraints
-//   (e.g. in some cases |depth| must be zero).
-struct SetSizeCmd {
-  uint32 id;
-  Vector2Value value;
-};
-
-// Sends a hint about a pending size change to the given node and all nodes
-// below. This is generally sent before an animation.
-//
-// |width_change_factor| and |height_change_factor| is how much bigger or smaller
-// the item is expected to be in the near future. This one number encapsulate
-// both changes in scale, as well as changes to layout width and height.
-struct SendSizeChangeHintCmdHACK {
-  uint32 node_id;
-  float32 width_change_factor;
-  float32 height_change_factor;
-};
-
-// Sets a node's opacity.
-//
-// Constraints:
-// - |node_id| refs a |Node| with the has_opacity characteristic.
-// - |opacity| is in the range [0, 1].
-struct SetOpacityCmd {
-  uint32 node_id;
-  float32 opacity;
-};
-
-// Sets/clears a node's shape.
-//
-// Constraints:
-// - |node_id| refs a |Node| with the has_shape characteristic.
-// - |shape_id| refs a |Shape|, or nothing.
-// - if this command causes the target to have both a |Shape| and a |Material|,
-//   then these must be compatible with each other (see README.md regarding
-//   "Shape/Material Compatibility").
-// TODO: add "Shape/Material Compatibility section"
-//
-// Discussion:
-// In order to be painted, a node requires both a |Shape| and a |Material|.
-// Without a material, a node can still participate in hit-testing and clipping.
-// Without a shape, a node cannot do any of the above.
-struct SetShapeCmd {
-  uint32 node_id;
-  uint32 shape_id;
-};
-
-// Sets/clears a node's material.
-//
-// Constraints:
-// - |node_id| refs a |Node| with the has_material characteristic.
-// - |material_id| refs a |Material|, or nothing.
-// - if this command causes the target to have both a |Shape| and a |Material|,
-//   then these must be compatible with each other (see README.md regarding
-//   "Shape/Material Compatibility").
-// TODO: add "Shape/Material Compatibility section"
-//
-// Discussion:
-// In order to be painted, a node requires both a |Shape| and a |Material|.
-// Without a material, a node can still participate in hit-testing and clipping.
-// Without a shape, a node cannot do any of the above.
-struct SetMaterialCmd {
-  uint32 node_id;
-  uint32 material_id;
-};
-
-// Sets/clears a node's clip.
-//
-// Constraints:
-// - |node_id| refs a |Node| with the has_clip characteristic.
-// - |clip_id| a |Node| with the is_clip characteristic, or nothing.  If the
-//   referenced node is not rooted, then it will have no effect (since its
-//   full world-transform cannot be determined).
-// - |clip_to_self| If false, children are only clipped to the region specified
-//   by |clip_id|.  If true, children are additionally clipped to the node's
-//   shape (as determined by its ShapeNode parts).
-//
-// Discussion:
-// If a node has a clip, it will be applied to both the parts and the children
-// of the node.  Under some circumstances (TBD), a clip will not be applicable
-// to a node; in such cases it will be as though no clip has been specified for
-// the node.
-// TODO: elaborate on the circumstances under which a clip is inapplicable.
-// For example, consider a 3D space that looks through a portal into a 2D space
-// that uses a clip for a circular reveal.  It would not be meaningful to clip
-// objects on the outside (i.e. in the 3D space).
-struct SetClipCmd {
-  uint32 node_id;
-  uint32 clip_id;
-  bool clip_to_self;
-};
-
-// Sets a node's hit test behavior.
-//
-// Discussion:
-// By default, hit testing is performed on the node's content, its parts,
-// and its children.
-struct SetHitTestBehaviorCmd {
-  uint32 node_id;
-  HitTestBehavior hit_test_behavior;
-};
-
-// Sets the properties for a ViewHolder's attached View.
-//
-// Constraints:
-// - |view_holder_id| refs a |ViewHolder|.
-struct SetViewPropertiesCmd {
-  uint32 view_holder_id;
-  ViewProperties properties;
-};
-
-// Sets a renderer's camera.
-//
-// Constraints:
-// - |renderer_id| refs a |Renderer|.
-// - |camera_id| refs a |Camera|, or stops rendering by passing zero.
-// - |matrix| is a value or variable of type kMatrix4x4.
-struct SetCameraCmd {
-  uint32 renderer_id;
-  uint32 camera_id;
-};
-
-// Sets a camera's view matrix.
-// This operation can be applied to both Cameras and StereoCameras.
-//
-// Constraints:
-// - |camera_id| refs a |Camera|.
-// - |eye_position| is the position of the eye.
-// - |eye_look_at| is the point is the scene the that eye is pointed at.
-// - |eye_up| defines the camera's "up" vector.
-struct SetCameraTransformCmd {
-  uint32 camera_id;
-  Vector3Value eye_position;
-  Vector3Value eye_look_at;
-  Vector3Value eye_up;
-};
-
-// Sets a camera's projection matrix.
-// This operation cannot be applied to a StereoCamera.
-//
-// Constraints:
-// - |camera_id| refs a |Camera| that is not a |StereoCamera|.
-// - |fovy| is the Y-axis field of view, in radians.
-//
-// NOTE: A default orthographic projection is specified by setting |fovy| to
-// zero.  In this case, the camera transform is ignored.
-struct SetCameraProjectionCmd {
-  uint32 camera_id;
-  FloatValue fovy;  // Y-axis field of view, in radians.
-};
-
-// Sets a StereoCamera's projection matrices.
-// This operation can only be applied to a StereoCamera.
-//
-// Constraints:
-// - |camera_id| refs a |StereoCamera|.
-// - |left_projection| is the projection matrix for the left eye.
-// - |right_projection| is the projection matrix for the right eye.
-//
-// These projection matrices may also contain a transform in camera space for
-// their eye if needed.
-struct SetStereoCameraProjectionCmd {
-  uint32 camera_id;
-  Matrix4Value left_projection;
-  Matrix4Value right_projection;
-};
-
-// Sets the "pose buffer" for the camera identified by |camera_id|.
-// This operation can be applied to both Cameras and StereoCameras.
-//
-// This will override any position and rotation set for the camera and will
-// make it take its position and rotation from the pose buffer each frame
-// based on the presentation time for that frame.
-//
-// A pose buffer represents a ring buffer of poses for a fixed number of time
-// points in the future. Each entry in the buffer identified by |buffer_id| is
-// a quaternion and a position layed out as follows:
-//
-// struct Pose {
-//   // Quaternion
-//   float32 a;
-//   float32 b;
-//   float32 c;
-//   float32 d;
-//
-//   // Position
-//   float32 x;
-//   float32 y;
-//   float32 z;
-//
-//   // Reserved/Padding
-//   byte[4] reserved;
-// }
-//
-// The buffer can be thought of as a packed array of |num_entries| Pose structs
-// and is required to be at least num_entries * sizeof(Pose) bytes.
-//
-// The quaternions and positions are specified in the space of the camera's
-// parent node.
-//
-// |base_time| is a base time point expressed in nanoseconds in the
-// |CLOCK_MONOTONIC| timebase and |time_interval| is the time in nanoseconds
-// between entries in the buffer. |base_time| must be in the past.
-//
-// For a given point in time |t| expressed in nanoseconds in the
-// |CLOCK_MONOTONIC| timebase the index of the corresponding pose in
-// the pose buffer can be computed as follows:
-//
-// index(t) = ((t - base_time) / time_interval) % num_entries
-//
-// poses[index(t)] is valid for t over the time interval (t - time_interval, t]
-// and should be expected to updated continuously without synchronization
-// for the duration of that interval. If a single pose value is needed for
-// multiple non-atomic operations a value should be latched and stored outside
-// the pose buffer.
-//
-// Because the poses are not protected by any synchronization primitives it is
-// possible that when a pose is latched it will be only partially updated, and
-// the pose being read will contain some components from the pose before it is
-// updated and some components from the updated pose. The safety of using these
-// "torn" poses relies on two things:
-//
-// 1) Sequential poses written to poses[index(t)] are very similar to each
-// other numerically, so that if some components are taken from the first and
-// some are taken from another the result is numerically similar to both
-//
-// 2) The space of positions and quaternions is locally flat at the scale of
-// changes between sequential updates, which guarantees that two poses which
-// are numerically similar also represent semantically similar poses (i.e.
-// there are no discontinuities which will cause a small numerical change in
-// the position or quaterninon to cause a large change in the encoded pose)
-// For positions this is guaranteed because Scenic uses a Euclidean 3-space
-// which is globally flat and for quaternions this is guaranteed because
-// quaternions encode rotation as points on a unit 4-sphere, and spheres are
-// locally flat. For more details on the encoding of rotations in quaterions
-// see https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
-//
-// This commanderation is intended for late latching camera pose to support
-// low-latency motion-tracked rendering.
-struct SetCameraPoseBufferCmd {
-  uint32 camera_id;
-  uint32 buffer_id;
-  uint32 num_entries;
-  int64 base_time;
-  uint64 time_interval;
-};
-
-// Sets the color of the Light identified by |light_id|.
-struct SetLightColorCmd {
-  uint32 light_id;
-  ColorRgbValue color;
-};
-
-// Sets the direction of the DirectionalLight identified by |light_id|.
-struct SetLightDirectionCmd {
-  uint32 light_id;
-  Vector3Value direction;
-};
-
-// Adds the light specified by |light_id| specified by |light_id| to the scene
-// identified by |scene_id|.
-struct AddLightCmd {
-  uint32 scene_id;
-  uint32 light_id;
-};
-
-// Detach the light specified by |light_id| from the scene that it is attached
-// to, if any.
-struct DetachLightCmd {
-  uint32 light_id;
-};
-
-// Detach all lights from the scene specified by |scene_id|.
-struct DetachLightsCmd {
-  uint32 scene_id;
-};
-
-// Sets/clears a material's texture.
-//
-// Constraints:
-// - |material_id| refs a |Material|.
-// - |texture_id| refs a |Image|, |ImagePipe|, or nothing.
-//
-// If no texture is provided (i.e. |texture_id| is zero), a solid color is used.
-// If a texture is provided, then the value sampled from the texture is
-// multiplied by the color.
-struct SetTextureCmd {
-  uint32 material_id;
-  uint32 texture_id;  // Refers to an Image resource.  May be zero (no texture).
-};
-
-// Sets a material's color.
-//
-// Constraints:
-// - |material_id| refs a |Material|.
-//
-// If a texture is set on the material, then the value sampled from the texture
-// is multiplied by the color.
-struct SetColorCmd {
-  uint32 material_id;
-  ColorRgbaValue color;
-};
-
-// Set a mesh's indices and vertices.
-//
-// |mesh_id| refs the Mesh to be updated.
-// |index_buffer_id| refs a Buffer that contains the mesh indices.
-// |index_format| defines how the index buffer data is to be interpreted.
-// |index_offset| number of bytes from the start of the index Buffer.
-// |index_count| number of indices.
-// |vertex_buffer_id| refs a Buffer that contains the mesh vertices.
-// |vertex_format| defines how the vertex buffer data is to be interpreted.
-// |vertex_offset| number of bytes from the start of the vertex Buffer.
-// |vertex_count| number of vertices.
-// |bounding_box| must contain all vertices within the specified range.
-//
-// The MeshVertexFormat defines which per-vertex attributes are provided by the
-// mesh, and the size of each attribute (and therefore the size of each vertex).
-// The attributes are ordered within the vertex in the same order that they
-// appear within the MeshVertexFormat struct.  For example, if the values are
-// kVector3, kNone and kVector2, then:
-//   - each vertex has a position and UV-coordinates, but no surface normal.
-//   - the 3D position occupies bytes 0-11 (3 dimensions * 4 bytes per float32).
-//   - the UV coords occupy bytes 12-19, since no surface normal is provided.
-enum MeshIndexFormat {
-  // TODO(SCN-275): only kUint32 is currently supported.
-  kUint16 = 1;
-  kUint32 = 2;
-};
-
-struct MeshVertexFormat {
-  // kVector2 or kVector3.
-  ValueType position_type;
-  // kVector2 or kVector3 (must match position_type), or kNone.
-  ValueType normal_type;
-  // kVector2 or kNone.
-  ValueType tex_coord_type;
-};
-
-struct BindMeshBuffersCmd {
-  uint32 mesh_id;
-  uint32 index_buffer_id;
-  MeshIndexFormat index_format;
-  uint64 index_offset;
-  uint32 index_count;
-  uint32 vertex_buffer_id;
-  MeshVertexFormat vertex_format;
-  uint64 vertex_offset;
-  uint32 vertex_count;
-  BoundingBox bounding_box;
-};
-
-// Add a layer to a layer stack.
-// Constraints:
-// - |layer_stack_id| refs a |LayerStack|.
-// - |layer_id| refs a |Layer|.
-// - The layer must not already belong to a different stack; it must first be
-//   detached.
-struct AddLayerCmd {
-  uint32 layer_stack_id;
-  uint32 layer_id;
-};
-
-// Remove a layer from a layer stack.
-// Constraints:
-// - |layer_stack_id| refs a |LayerStack|.
-// - |layer_id| refs a |Layer|.
-// - The layer must belong to this stack.
-struct RemoveLayerCmd {
-  uint32 layer_stack_id;
-  uint32 layer_id;
-};
-
-// Remove all layers from a layer stack.
-// Constraints
-// - |layer_stack_id| refs a |LayerStack|.
-struct RemoveAllLayersCmd {
-  uint32 layer_stack_id;
-};
-
-// Set a compositor's layer stack, replacing the current stack (if any).
-// Constraints:
-// - |compositor_id| refs a |DisplayCompositor| or |ImagePipeCompositor|.
-// - |layer_stack_id| refs a |LayerStack|.
-struct SetLayerStackCmd {
-  uint32 compositor_id;
-  uint32 layer_stack_id;
-};
-
-// Set a layer's renderer, replacing the current renderer (if any).
-// Constraints:
-// - |layer_id| refs a |Layer|.
-// - |renderer_id| refs a |Renderer|.
-struct SetRendererCmd {
-  uint32 layer_id;
-  uint32 renderer_id;
-};
-
-// Sets a parameter that affects how a renderer renders a scene.
-//
-// |renderer_id| refs the Renderer that is being modified.
-// |param| describes the parameter that should be set, and to what.
-struct SetRendererParamCmd {
-  uint32 renderer_id;
-  RendererParam param;
-};
-
-// Sets which events a resource should deliver to the session listener.
-// This command replaces any prior event mask for the resource.
-//
-// The initial event mask for a resource is zero, meaning no events are
-// reported.
-//
-// Constraints:
-// - |resource_id| is a valid resource id
-// - |event_mask| is zero or a combination of |k*EventMask| bits OR'ed together.
-struct SetEventMaskCmd {
-  uint32 id;
-  uint32 event_mask;
-};
-
-// Set whether clipping should be disabled for the specified renderer.  For a
-// newly-created renderer, clipping will NOT be disabled (i.e. it will be
-// enabled).
-//
-// NOTE: this disables visual clipping only; objects are still clipped for the
-// purposes of hit-testing.
-//
-// |renderer_id| refs the target renderer.
-// |disable_clipping| specifies whether the clipping should be disabled.
-struct SetDisableClippingCmd {
-  uint32 renderer_id;
-  bool disable_clipping;
-};
-
-// TODO(SCN-1026): Remove this.
-struct SetImportFocusCmd {
-  uint32 id;
-  bool focusable;
-};
diff --git a/fidl/fuchsia.ui.gfx/display_info.fidl b/fidl/fuchsia.ui.gfx/display_info.fidl
deleted file mode 100644
index 1fb1cc2..0000000
--- a/fidl/fuchsia.ui.gfx/display_info.fidl
+++ /dev/null
@@ -1,12 +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.
-
-library fuchsia.ui.gfx;
-
-// Provides information about a display.
-struct DisplayInfo {
-  // The size of the display, in physical pixels.
-  uint32 width_in_px;
-  uint32 height_in_px;
-};
diff --git a/fidl/fuchsia.ui.gfx/events.fidl b/fidl/fuchsia.ui.gfx/events.fidl
deleted file mode 100644
index 98a2495..0000000
--- a/fidl/fuchsia.ui.gfx/events.fidl
+++ /dev/null
@@ -1,127 +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.
-
-library fuchsia.ui.gfx;
-
-// Reports metrics information.
-// This event type is only reported for node resources.
-const uint32 kMetricsEventMask = 1;
-const uint32 kSizeChangeHintEventMask = 2;
-
-// These are all of the types of events which can be reported by a |Session|.
-// Use |SetEventMaskCmd| to enable event delivery for a resource.
-union Event {
-  // Events which are controlled by a mask.
-  MetricsEvent metrics;
-
-  SizeChangeHintEvent size_change_hint;
-
-  // Events which are always delivered, regardless of mask.
-  ImportUnboundEvent import_unbound;
-  ViewConnectedEvent view_connected;
-  ViewDisconnectedEvent view_disconnected;
-  ViewHolderDisconnectedEvent view_holder_disconnected;
-  ViewAttachedToSceneEvent view_attached_to_scene;
-  ViewDetachedFromSceneEvent view_detached_from_scene;
-  ViewPropertiesChangedEvent view_properties_changed;
-  ViewStateChangedEvent view_state_changed;
-};
-
-// Provides rendering target metrics information about the specified node.
-//
-// This event is delivered when the following conditions are true:
-// - The node is a descendant of a |Scene|.
-// - The node has |kMetricsEventMask| set to an enabled state.
-// - The node's metrics have changed since they were last delivered, or since
-//   |kMetricsEventMask| transitioned from a disabled state to an enabled state.
-//
-// Subscribe to this event to receive information about the scale factors you
-// should apply when generating textures for your nodes.
-struct MetricsEvent {
-  uint32 node_id;
-  Metrics metrics;
-};
-
-// Delivered in response to a size change hint from a parent node
-// (SendSizeChangeHintCmd).
-//
-// This event is delivered when the following conditions are true:
-// - The node has |kSizeChangeEventMask| set to an enabled state.
-// - A parent node has sent a SendSizeChangeHintCmd.
-//
-// Subscribe to this event to receive information about how large textures you
-// will need in the near future for your nodes. The canonical use case is to
-// pre-allocate memory to avoid repeated re-allocations.
-struct SizeChangeHintEvent {
-  uint32 node_id;
-  float32 width_change_factor;
-  float32 height_change_factor;
-};
-
-// Delivered when the imported resource with the given ID is no longer bound to
-// its host resource, or if the imported resource can not be bound because
-// the host resource is not available.
-struct ImportUnboundEvent {
-  uint32 resource_id;
-};
-
-// Delivered to a ViewHolder's Session when its peer View is connected.
-struct ViewConnectedEvent {
-  uint32 view_holder_id;
-};
-
-// Delivered to a ViewHolder's Session when its peer View is disconnected or
-// destroyed.
-//
-// If the View is destroyed before the connection is established, then this
-// event will be delivered immediately when the ViewHolder attempts to connect.
-struct ViewDisconnectedEvent {
-  uint32 view_holder_id;
-};
-
-// Delivered to a View's Session when its peer ViewHolder is disconnected or
-// destroyed.
-//
-// If the ViewHolder is destroyed before the connection is established, then
-// this event will be delivered immediately when the View attempts to connect.
-struct ViewHolderDisconnectedEvent {
-  uint32 view_id;
-};
-
-// Delivered to a View's Session when the parent ViewHolder for the given View
-// becomes a part of a Scene.
-//
-// A ViewHolder is considered to be part of a Scene if there is an unbroken
-// chain of parent-child relationships between the Scene node and the
-// ViewHolder node.
-struct ViewAttachedToSceneEvent {
-  uint32 view_id;
-  ViewProperties properties;
-};
-
-// Delivered to a View's Session when the parent ViewHolder for the given View
-// is no longer part of a scene.
-//
-// This can happen if the ViewHolder is detached directly from the scene, or
-// if one of its parent nodes is.
-//
-// A ViewHolder is considered to be part of a Scene if there is an unbroken
-// chain of parent-child relationships between the Scene node and the
-// ViewHolder node.
-struct ViewDetachedFromSceneEvent {
-  uint32 view_id;
-};
-
-// Delivered when the parent ViewHolder for the given View makes a change to
-// the View's properties.
-struct ViewPropertiesChangedEvent {
-  uint32 view_id;
-  ViewProperties properties;
-};
-
-// Delivered to a ViewHolder's Session when its peer View's state has changed.
-struct ViewStateChangedEvent {
-  uint32 view_holder_id;
-  ViewState state;
-};
diff --git a/fidl/fuchsia.ui.gfx/hit.fidl b/fidl/fuchsia.ui.gfx/hit.fidl
deleted file mode 100644
index d96a44c..0000000
--- a/fidl/fuchsia.ui.gfx/hit.fidl
+++ /dev/null
@@ -1,36 +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.
-
-library fuchsia.ui.gfx;
-
-// Describes where a hit occurred within the content of a node tagged
-// by this session.
-//
-// To compute the point of intersection within the node's local coordinate
-// system, perform the following calculation using the ray which was
-// originally passed to |Session.HitTest()|.
-//
-//   hit_point = ray.origin + (hit.distance * ray.direction)
-//   local_point = hit.inverse_transform * hit_point
-struct Hit {
-  // The node's tag value.
-  uint32 tag_value;
-
-  // The origin of the ray that was used for the hit test, in the hit
-  // node's coordinate system.
-  vec4 ray_origin;
-
-  // The direction of the ray that was used for the hit test, in the hit
-  // node's coordinate system.
-  vec4 ray_direction;
-
-  // The inverse transformation matrix which maps the coordinate system of
-  // the node at which the hit test was initiated into the local coordinate
-  // system of the node which was hit.
-  mat4 inverse_transform;
-
-  // The distance from the ray's origin to the closest point of intersection
-  // in multiples of the ray's direction vector.
-  float32 distance;
-};
diff --git a/fidl/fuchsia.ui.gfx/meta.json b/fidl/fuchsia.ui.gfx/meta.json
deleted file mode 100644
index cc5b23e..0000000
--- a/fidl/fuchsia.ui.gfx/meta.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "deps": [
-    "fuchsia.images", 
-    "fuchsia.math", 
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.gfx/commands.fidl", 
-    "fidl/fuchsia.ui.gfx/display_info.fidl", 
-    "fidl/fuchsia.ui.gfx/events.fidl", 
-    "fidl/fuchsia.ui.gfx/hit.fidl", 
-    "fidl/fuchsia.ui.gfx/nodes.fidl", 
-    "fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl", 
-    "fidl/fuchsia.ui.gfx/renderer.fidl", 
-    "fidl/fuchsia.ui.gfx/resources.fidl", 
-    "fidl/fuchsia.ui.gfx/shapes.fidl", 
-    "fidl/fuchsia.ui.gfx/types.fidl"
-  ], 
-  "name": "fuchsia.ui.gfx", 
-  "root": "fidl/fuchsia.ui.gfx", 
-  "sources": [
-    "fidl/fuchsia.ui.gfx/commands.fidl", 
-    "fidl/fuchsia.ui.gfx/display_info.fidl", 
-    "fidl/fuchsia.ui.gfx/events.fidl", 
-    "fidl/fuchsia.ui.gfx/hit.fidl", 
-    "fidl/fuchsia.ui.gfx/nodes.fidl", 
-    "fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl", 
-    "fidl/fuchsia.ui.gfx/renderer.fidl", 
-    "fidl/fuchsia.ui.gfx/resources.fidl", 
-    "fidl/fuchsia.ui.gfx/shapes.fidl", 
-    "fidl/fuchsia.ui.gfx/types.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.gfx/nodes.fidl b/fidl/fuchsia.ui.gfx/nodes.fidl
deleted file mode 100644
index 33e46c7..0000000
--- a/fidl/fuchsia.ui.gfx/nodes.fidl
+++ /dev/null
@@ -1,65 +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.
-
-library fuchsia.ui.gfx;
-
-// These are the types of nodes that can be created within a Mozart |Session|.
-//
-// All nodes have an associated transform, which distinguishes them from mere
-// resources.  Nodes may also have one or more node Characteristics:
-//
-// These are characteristics that each type of |Node| either has or doesn't.
-// These constrain operations that reference nodes; violations will cause the
-// |Session| connection to be closed.  For example, |NodeAddChildOp| must target
-// a node with the "has_children" characteristic.  These characteristics are not
-// explicitly reflected in the Session API; instead, they must be enforced by
-// implementations of the API.
-// - has_children: The node can contain other nodes as children.
-// - has_parent: The node can be a child of another node.  If this is false,
-//   the node can only be a direct descendant of its containing scene.
-// - has_parts:  The node can contain other nodes as parts.  All parts must be
-//   from the same session as their parent.
-// - has_clip:  The node can contain a clip node as a child.
-// - is_clip:  The node can clip other nodes.
-// - has_shape: The node can contain ShapeNodes as children.
-// - has_material:  The node can have a Material resource applied to it.
-
-// Characteristics:
-// - has_parent
-// - has_shape
-// - has_material
-struct ShapeNodeArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 unused = 0;
-};
-
-// Characteristics:
-// - has_parent
-// - is_clip
-// - has_parts
-struct ClipNodeArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 unused = 0;
-};
-
-// Characteristics:
-// - has_transform
-// - has_parent
-// - has_children
-// - has_parts
-// - has_opacity
-struct OpacityNodeArgs {
-    uint32 unused = 0;
-};
-
-// Characteristics:
-// - has_transform
-// - has_children
-// - has_parent
-// - has_parts
-// - has_clip
-struct EntityNodeArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 unused = 0;
-};
diff --git a/fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl b/fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl
deleted file mode 100644
index 8fcadc1..0000000
--- a/fidl/fuchsia.ui.gfx/pose_buffer_provider.fidl
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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.
-
-library fuchsia.ui.gfx;
-
-[Discoverable]
-// A minimal fidl interface to allow sourcing the contents of a PoseBuffer from another service.
-interface PoseBufferProvider {
-  // Sets the PoseBuffer and the parameters PoseBufferProvider will use to fill that PoseBuffer.
-  // Setting this when it is already set will replace the previously set parameters with the new
-  // parameters, which will release the provider's reference to the buffer.
-  1: SetPoseBuffer(handle<vmo> buffer, uint32 num_entries, int64 base_time, uint64 time_interval);
-};
diff --git a/fidl/fuchsia.ui.gfx/renderer.fidl b/fidl/fuchsia.ui.gfx/renderer.fidl
deleted file mode 100644
index 6bcbd22..0000000
--- a/fidl/fuchsia.ui.gfx/renderer.fidl
+++ /dev/null
@@ -1,33 +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.
-
-library fuchsia.ui.gfx;
-
-// These are all of the types of parameters that can be set to configure a
-// |Renderer|.
-union RendererParam {
-  ShadowTechnique shadow_technique;
-  RenderFrequency render_frequency;
-};
-
-// Represents the shadow algorithm that the |Renderer| should use when lighting
-// the scene.
-enum ShadowTechnique {
-  // No shadows.
-  UNSHADOWED = 0;
-  // Default.  Screen-space, depth-buffer based shadows; SSDO-ish.
-  SCREEN_SPACE = 1;
-  // Basic shadow map.
-  SHADOW_MAP = 2;
-  // Moment shadow map (see http://momentsingraphics.de).
-  MOMENT_SHADOW_MAP = 3;
-};
-
-enum RenderFrequency {
-  // Render only on when requested (i.e. when something triggers it).
-  // Default behavior.
-  WHEN_REQUESTED = 0;
-  // Render one frame after another regardless of it it's needed.
-  CONTINUOUSLY = 1;
-};
diff --git a/fidl/fuchsia.ui.gfx/resources.fidl b/fidl/fuchsia.ui.gfx/resources.fidl
deleted file mode 100644
index 095eb69..0000000
--- a/fidl/fuchsia.ui.gfx/resources.fidl
+++ /dev/null
@@ -1,260 +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.
-
-library fuchsia.ui.gfx;
-
-using fuchsia.images;
-
-// These are all of the types of resources that can be created within a
-// |Session|.
-union ResourceArgs {
-  // Memory resources.
-  MemoryArgs memory;
-  ImageArgs image;
-  ImagePipeArgs image_pipe;
-  BufferArgs buffer;
-
-  // Views.
-  ViewArgs view;
-  ViewHolderArgs view_holder;
-
-  // Shapes (see shapes.fidl).
-  RectangleArgs rectangle;
-  RoundedRectangleArgs rounded_rectangle;
-  CircleArgs circle;
-  MeshArgs mesh;
-
-  // Nodes (see nodes.fidl).
-  ShapeNodeArgs shape_node;
-  ClipNodeArgs clip_node;
-  EntityNodeArgs entity_node;
-  OpacityNodeArgs opacity_node;
-
-  // Materials.
-  MaterialArgs material;
-
-  // Layers.
-  CompositorArgs compositor;
-  DisplayCompositorArgs display_compositor;
-  ImagePipeCompositorArgs image_pipe_compositor;
-  LayerStackArgs layer_stack;
-  LayerArgs layer;
-
-  // Scene representation and display.
-  SceneArgs scene;
-  CameraArgs camera;
-  StereoCameraArgs stereo_camera;
-  RendererArgs renderer;
-
-  // Lighting.
-  AmbientLightArgs ambient_light;
-  DirectionalLightArgs directional_light;
-
-  // A value that can be used in place of a constant value.
-  VariableArgs variable;
-};
-
-struct ImagePipeArgs {
-  request<fuchsia.images.ImagePipe> image_pipe_request;
-};
-
-// |Memory| is a |Resource| that wraps a client-provided Zircon vmo to register
-// it with Scenic.
-// TODO: specify resizing behavior.  Who can resize?  Client/Scenic/both/none?
-struct MemoryArgs {
-  // The VMO which backs this memory.
-  handle<vmo> vmo;
-
-  // The amount of memory from |vmo| that should be utilized.
-  uint64 allocation_size;
-
-  // The type of memory stored in the VMO, namely whether it's GPU memory or
-  // host memory.
-  fuchsia.images.MemoryType memory_type;
-};
-
-// An image mapped to a range of a |Memory| resource.
-// TODO: more precise and extensive docs.
-struct ImageArgs {
-  fuchsia.images.ImageInfo info;
-
-  uint32 memory_id;      // id of a |Memory| resource
-  uint32 memory_offset;  // byte offset of image within |Memory| resource
-};
-
-// A buffer mapped to a range of |Memory|.
-struct BufferArgs {
-  uint32 memory_id;      // id of a |Memory| resource
-  uint32 memory_offset;  // byte offset of buffer within |Memory| resource
-  uint32 num_bytes;
-};
-
-// Represents a transform space which serves as a container for Nodes.  The
-// Nodes will have the Views' coordinate transform applied to their own, in
-// addition to being clipped to the Views' bounding box.
-// See |ViewProperties|.
-//
-// Each View is linked to a paired ViewHolder via a shared token.
-//
-// Usually the View and its associated ViewHolder exist in separate processes,
-// allowing a distributed scene graph to be constructed.
-struct ViewArgs {
-  handle<eventpair> token;
-  string? debug_name;
-};
-
-// Represents a proxy for a View which can be added to a scene graph in order
-// to embed the View within it.
-//
-// Each ViewHolder is linked to a paired View via a shared token.
-//
-// Usually the ViewHolder and its associated View exist in separate processes,
-// allowing a distributed scene graph to be constructed.
-struct ViewHolderArgs {
-  handle<eventpair> token;
-  string? debug_name;
-};
-
-// A Compositor draws its |LayerStack| into a framebuffer provided by its
-// attached |Display|, if any.  If no display is attached, nothing is rendered.
-// TODO(SCN-452): there is currently no way to create/attach a display.
-struct CompositorArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// A DisplayCompositor draws its attached |LayerStack| into an image that is
-// presented on a display.
-struct DisplayCompositorArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// An ImagePipeCompositor draws its attached |LayerStack| into an image that is
-// presented on an image-pipe.
-struct ImagePipeCompositorArgs {
-  fuchsia.images.ImagePipe target;
-};
-
-// A LayerStack is a stack of layers that are attached to a Compositor, which
-// draws them in order of increasing Z-order (or rather, presents the illusion
-// of drawing them in that order: it may apply any optimizations that don't
-// affect the output).
-//
-// Supported commands:
-// - AddLayer
-struct LayerStackArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// Supported commands:
-// - Detach
-// - SetCamera
-// - SetColor
-// - SetTexture
-// - SetSize (depth must be zero)
-// - SetSize
-// - SetTranslation (z component determines the relative Z-ordering of layers)
-// - SetRotation (must rotate around Z-axis)
-// - SetScale
-//
-// A layer is not drawn unless it has a camera, texture, or color.
-struct LayerArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// A Scene is the root of a scene-graph, and defines the rendering environment
-// (lighting, etc.) for the tree of nodes beneath it.  The following commands
-// may be  applied to a Scene (public/fidl/fuchsia.ui.gfx/commands.fidl):
-//   - Add/RemoveLight
-//   - AddChild
-struct SceneArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// A Camera is used to render a Scene from a particular viewpoint.  This is
-// achieved by setting a Renderer to use the camera.  The following operations
-// may be applied to a Camera (see ops.fidl):
-//   - SetCameraTransform
-//   - SetCameraProjection
-//   - SetCameraPoseBuffer
-struct CameraArgs {
-  // The scene that the camera is viewing.
-  uint32 scene_id;
-};
-
-// A StereoCamera is a Camera that renders the scene in side-by-side stereo.
-// The following operations may be applied to a StereoCamera but not a Camera:
-//   - SetStereoCameraProjection
-// Additionally, any operation which can be applied to a Camera can also be
-// applied to a StereoCamera.
-struct StereoCameraArgs {
-  // The scene that the camera is viewing.
-  uint32 scene_id;
-};
-
-// A Renderer renders a Scene via a Camera.  The following operations may be
-// applied to a Renderer (see ops.fidl):
-//   - SetCamera
-//   - SetRendererParam
-struct RendererArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// An AmbientLight is a Light that is is assumed to be everywhere in the scene,
-// in all directions.
-//
-// The following commands may be applied to an AmbientLight
-// (public/fidl/fuchsia.ui.gfx/commands.fidl):
-//   - SetLightColor
-struct AmbientLightArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// A DirectionalLight is a Light that is emitted from a point at infinity.
-//
-// Although the light is directional, the light has some amount of angular
-// dispersion (i.e., the light is not fully columnated). For simplicity, we
-// assume the dispersion of the light source is symmetric about the light's
-// primary direction.
-//
-// The following commands may be applied to a DirectionalLight
-// (public/fidl/fuchsia.ui.gfx/commands.fidl):
-//   - SetLightColor
-//   - SetDirection
-struct DirectionalLightArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-// Simple texture-mapped material.
-//
-// Commands that can be performed later:
-// SetTextureCmd will set the texture, or it can be left as zero (no
-// texture).
-//   The texture can be an Image or ImagePipe.
-// SetColorCmd will set the color.
-struct MaterialArgs {
-  // TODO(SCN-694): Clean up dummy args.
-  uint32 dummy = 0;
-};
-
-struct VariableArgs {
-  ValueType type;
-  Value initial_value;  // Must match type.  Must not be a variable_id.
-};
-
-// Describes an exported resource that is to be imported by an
-// ImportResourceCmd.
-//
-// NOTE: Currently just an enum of importable resource types, but may later be
-// expanded to express concepts like "meshes with a particular vertex format".
-enum ImportSpec {
-  NODE = 0;
-};
diff --git a/fidl/fuchsia.ui.gfx/shapes.fidl b/fidl/fuchsia.ui.gfx/shapes.fidl
deleted file mode 100644
index 5734af1..0000000
--- a/fidl/fuchsia.ui.gfx/shapes.fidl
+++ /dev/null
@@ -1,40 +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.
-
-library fuchsia.ui.gfx;
-
-// The shapes defined in this file can be used to define the rendered shape of
-// an |ObjectNode|, and to define the clip region of a |ClipNode|.
-
-// Rectangle centered at (0,0).
-struct RectangleArgs {
-  Value width;  // float32
-  Value height; // float32
-};
-
-// RoundedRectangle centered at (0,0).  Legal parameter values must satisfy the
-// constraint that the flat sides of the rectangle have non-negative length.
-// In other words, the following constraints must hold:
-//   - top_left_radius + top_right_radius <= width
-//   - bottom_left_radius + bottom_right_radius <= width
-//   - top_left_radius + bottom_left_radius <= height
-//   - top_right_radius + bottom_right_radius <= height
-struct RoundedRectangleArgs {
-  Value width;                // float32
-  Value height;               // float32
-  Value top_left_radius;      // float32
-  Value top_right_radius;     // float32
-  Value bottom_right_radius;  // float32
-  Value bottom_left_radius;   // float32
-};
-
-struct CircleArgs {
-  Value radius;  // float32
-};
-
-// A Mesh cannot be rendered until it has been bound to vertex/index buffers;
-// see BindMeshBuffersCmd.
-struct MeshArgs {
-    uint8 dummy;
-};
diff --git a/fidl/fuchsia.ui.gfx/types.fidl b/fidl/fuchsia.ui.gfx/types.fidl
deleted file mode 100644
index d470e5b..0000000
--- a/fidl/fuchsia.ui.gfx/types.fidl
+++ /dev/null
@@ -1,236 +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.
-
-library fuchsia.ui.gfx;
-
-struct vec2 {
-  float32 x;
-  float32 y;
-};
-
-struct vec3 {
-  float32 x;
-  float32 y;
-  float32 z;
-};
-
-struct vec4 {
-  float32 x;
-  float32 y;
-  float32 z;
-  float32 w;
-};
-
-struct mat4 {
-  // Column major order.
-  array<float32>:16 matrix;
-};
-
-// TODO(MZ-238): use float32s instead of uint8.
-struct ColorRgba {
-  uint8 red;
-  uint8 green;
-  uint8 blue;
-  uint8 alpha;
-};
-
-struct ColorRgb {
-  float32 red;
-  float32 green;
-  float32 blue;
-};
-
-struct Quaternion {
-  float32 x;
-  float32 y;
-  float32 z;
-  float32 w;
-};
-
-struct FactoredTransform {
-  vec3 translation;
-  vec3 scale;
-  // Point around which rotation and scaling occur.
-  vec3 anchor;
-  Quaternion rotation;
-};
-
-union Value {
-  float32 vector1;
-  vec2 vector2;
-  vec3 vector3;
-  vec4 vector4;
-  mat4 matrix4x4;
-  ColorRgba color_rgba;
-  ColorRgb color_rgb;
-  // Degrees of counter-clockwise rotation in the XY plane.
-  float32 degrees;
-  Quaternion quaternion;
-  FactoredTransform transform;
-  // ID of a value-producing resource (an animation or an expression).
-  // The type of this value matches the type produced by the named resource.
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a float32, and |value| is ignored.
-struct FloatValue {
-  float32 value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a vec2, and |value| is ignored.
-struct Vector2Value {
-  vec2 value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a vec3, and |value| is ignored.
-struct Vector3Value {
-  vec3 value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a vec4, and |value| is ignored.
-struct Vector4Value {
-  vec4 value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a vec4, and |value| is ignored.
-struct Matrix4Value {
-  mat4 value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a ColorRgb, and |value| is ignored.
-struct ColorRgbValue {
-  ColorRgb value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a ColorRgba, and |value| is ignored.
-struct ColorRgbaValue {
-  ColorRgba value;
-  uint32 variable_id;
-};
-
-// A value that is specified explicitly by |value| if |variable_id| is zero,
-// or is the value produced by the resource identified by |variable_id|, e.g.
-// an animation or expression.  In the latter case, the value produced by the
-// resource must be a Quaternion, and |value| is ignored.
-struct QuaternionValue {
-  Quaternion value;
-  uint32 variable_id;
-};
-
-enum ValueType {
-  kNone = 0;
-  kVector1 = 1;
-  kVector2 = 2;
-  kVector3 = 3;
-  kVector4 = 4;
-  kMatrix4 = 5;
-  kColorRgb = 6;
-  kColorRgba = 7;
-  kQuaternion = 8;
-  kFactoredTransform = 9;
-};
-
-// Describes how nodes interact with hit testings.
-enum HitTestBehavior {
-  // Apply hit testing to the node's content, its parts, and its children.
-  kDefault = 0;
-
-  // Suppress hit testing of the node and everything it contains.
-  kSuppress = 1;
-};
-
-// Rendering target metrics associated with a node.
-// See also |MetricsEvent|.
-struct Metrics {
-  // The ratio between the size of one logical pixel within the node's local
-  // coordinate system and the size of one physical pixel of the rendering
-  // target.
-  //
-  // This scale factors change in relation to the resolution of the rendering
-  // target and the scale transformations applied by containing nodes.
-  // They are always strictly positive and non-zero.
-  //
-  // For example, suppose the rendering target is a high resolution display
-  // with a device pixel ratio of 2.0 meaning that each logical pixel
-  // within the model corresponds to two physical pixels of the display.
-  // Assuming no scale transformations affect the node, then its metrics event
-  // will report a scale factor of 2.0.
-  //
-  // Building on this example, if instead the node's parent applies a
-  // scale transformation of 0.25 to the node, then the node's metrics event
-  // will report a scale factor of 0.5 indicating that the node should render
-  // its content at a reduced resolution and level of detail since a smaller
-  // area of physical pixels (half the size in each dimension) will be rendered.
-  float32 scale_x;
-  float32 scale_y;
-  float32 scale_z;
-};
-
-// Represents an axis-aligned bounding box.  If any of the dimensions has a
-// negative extent (e.g. max.x < min.x) then the bounding box is treated as
-// empty.
-struct BoundingBox {
-  vec3 min;
-  vec3 max;
-};
-
-// Represents the properties for a View.
-struct ViewProperties {
-  // The View's bounding box extents can be defined as:
-  //    { bounding_box.min - inset_from_min, bounding_box.max + inset_from_max }
-  // Content contained within the View is clipped to this bounding box.
-  //
-  // TODO(SCN-819): should we just have a vec3 extent instead of a bounding box
-  // with a potentially non-zero min?
-  BoundingBox bounding_box;
-
-  // |insets_from_min| and |insets_from_max| specify the distances between the
-  // view's bounding box and that of its parent.
-  vec3 inset_from_min;
-  vec3 inset_from_max;
-
-  // Whether the View can receive a focus event; default is true.  When
-  // false, and this View is eligible to receive a focus event, no
-  // focus/unfocus event is actually sent to any View.
-  bool focus_change = true;
-
-  // Whether the View allows geometrically underlying Views to receive input;
-  // default is true. When false, Scenic does not send input events to
-  // underlying Views.
-  bool downward_input = true;
-};
-
-// Represents the state of a View in Scenic.
-struct ViewState {
-  // Whether the View is rendering. Default is false. Delivered to the View's
-  // corresponding ViewHolder after the View's first frame render request.
-  bool is_rendering;
-};
diff --git a/fidl/fuchsia.ui.input/commands.fidl b/fidl/fuchsia.ui.input/commands.fidl
deleted file mode 100644
index 098ccb0..0000000
--- a/fidl/fuchsia.ui.input/commands.fidl
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-library fuchsia.ui.input;
-
-union Command {
-  // Commands for conveying input events to a |Session|.
-  // Structs defined in input_events.fidl.
-  SendKeyboardInputCmd send_keyboard_input;
-  SendPointerInputCmd send_pointer_input;
-
-  // Command to enable/disable delivery of hard keyboard events.
-  SetHardKeyboardDeliveryCmd set_hard_keyboard_delivery;
-
-  // Command to enable/disable parallel delivery of input events.
-  SetParallelDispatchCmd set_parallel_dispatch;
-};
-
-struct SendKeyboardInputCmd {
-  uint32 compositor_id;
-  KeyboardEvent keyboard_event;  // Defined in input_events.fidl
-};
-
-struct SendPointerInputCmd {
-  uint32 compositor_id;
-  PointerEvent pointer_event;  // Defined in input_events.fidl
-};
-
-// Typically, clients should receive text inputs from an IME.
-//
-// For cases where no IME mediation is desired (such as a game application),
-// this command requests Scenic to deliver hard keyboard events to the client.
-//
-// By default, Scenic will *not* deliver hard keyboard events to a client.
-struct SetHardKeyboardDeliveryCmd {
-  bool delivery_request;
-};
-
-// Typically, clients that participate in the hit test should receive input
-// events in parallel. This behavior is required for gesture disambiguation.
-//
-// This command, typically set by the root presenter, allows disabling parallel
-// dispatch; it is part of the input v2 transition work.
-// TODO(SCN-1047): Remove after gesture disambiguation is implemented.
-struct SetParallelDispatchCmd {
-  bool parallel_dispatch;
-};
diff --git a/fidl/fuchsia.ui.input/ime_service.fidl b/fidl/fuchsia.ui.input/ime_service.fidl
deleted file mode 100644
index 3ee5b58..0000000
--- a/fidl/fuchsia.ui.input/ime_service.fidl
+++ /dev/null
@@ -1,25 +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.
-
-library fuchsia.ui.input;
-
-// The service provided by an IME
-[Discoverable]
-interface ImeService {
-  1: GetInputMethodEditor(KeyboardType keyboard_type,
-                         InputMethodAction action,
-                         TextInputState initial_state,
-                         InputMethodEditorClient client,
-                         request<InputMethodEditor> editor);
-  2: ShowKeyboard();
-  3: HideKeyboard();
-  4: InjectInput(InputEvent event);
-};
-
-// Onscreen keyboard containers connect to this to know when a keyboard
-// should be shown or hidden.
-[Discoverable]
-interface ImeVisibilityService {
-  1: -> OnKeyboardVisibilityChanged(bool visible);
-};
diff --git a/fidl/fuchsia.ui.input/input_connection.fidl b/fidl/fuchsia.ui.input/input_connection.fidl
deleted file mode 100644
index 497fff1..0000000
--- a/fidl/fuchsia.ui.input/input_connection.fidl
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.input;
-
-// TODO(jeffbrown): Redesign input event representation later.
-
-// The input connection service allows a view to receive input events
-// such as key presses and pointer movements.
-
-// This service can be retrieved from the |View| service provider.
-//
-// TODO(jeffbrown): Elaborate this.  Particularly need to think about
-// how to handle focus and gestures.
-[Discoverable]
-interface InputConnection {
-  // Sets the listener for receiving input events.
-  //
-  // If |listener| is null, then the previously set listener is removed.
-  1: SetEventListener(InputListener? listener);
-
-  // Retrieves an |InputMethodEditor| to handle text editing.
-  2: GetInputMethodEditor(KeyboardType keyboard_type,
-                         InputMethodAction action,
-                         TextInputState initial_state,
-                         InputMethodEditorClient client,
-                         request<InputMethodEditor> editor);
-  3: ShowKeyboard();
-  4: HideKeyboard();
-};
-
-// An interface applications may implement to receive events from an
-// input connection.
-// TODO(MZ-33): This should include hit testing and an input arena.
-[Discoverable]
-interface InputListener {
-  // Called to deliver an input event.
-  //
-  // The |consumed| result should indicate whether the input event was
-  // consumed by the connection.  If |consumed| is false, the system may
-  // apply default behavior of its own in response to the event.
-  1: OnEvent(InputEvent event) -> (bool consumed);
-};
diff --git a/fidl/fuchsia.ui.input/input_device_registry.fidl b/fidl/fuchsia.ui.input/input_device_registry.fidl
deleted file mode 100644
index 84fca87..0000000
--- a/fidl/fuchsia.ui.input/input_device_registry.fidl
+++ /dev/null
@@ -1,20 +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.
-
-library fuchsia.ui.input;
-
-// Service to receive input events.
-//
-// Input devices can describe their capabilities using |DeviceDescriptor|
-// and register themselves with the |InputDeviceRegistry|.
-[Discoverable]
-interface InputDeviceRegistry {
-    // Register a device with the capabilities described by |DeviceDescriptor|
-    1: RegisterDevice(DeviceDescriptor descriptor, request<InputDevice> input_device);
-};
-
-interface InputDevice {
-    // Dispatch an |InputReport| from the device |token|
-    1: DispatchReport(InputReport report);
-};
diff --git a/fidl/fuchsia.ui.input/input_dispatcher.fidl b/fidl/fuchsia.ui.input/input_dispatcher.fidl
deleted file mode 100644
index 744bf1b..0000000
--- a/fidl/fuchsia.ui.input/input_dispatcher.fidl
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.input;
-
-// TODO(jeffbrown): Redesign input event representation later.
-
-// The input dispatcher service allows the component which owns and controls
-// a view tree to dispatch input events to the views that it contains.
-//
-// This service can be retrieved from the |ViewTree| service provider.
-//
-// TODO(jeffbrown): Elaborate how input devices are registered with the
-// dispatcher so that applications can query their capabilities and distinguish
-// input coming from multiple sources concurrently.
-[Discoverable]
-interface InputDispatcher {
-  // Dispatches an event through the view tree.  The dispatcher will deliver
-  // the event to the appropriate views based on the current state of the
-  // tree, such as focus and the structure of the scene graph.
-  //
-  // The dispatcher expects the stream of events that it receives to be
-  // internally consistent.  For example, each pointer down must be matched
-  // by a corresponding pointer up.
-  //
-  // It is an error to supply an inconsistent stream events to the dispatcher;
-  // the connection will be closed.
-  //
-  // TODO(jeffbrown): Is this the right policy?  It would certainly help
-  // diagnose faults earlier.
-  // TODO(jeffbrown): Decide whether there should be a way to track the
-  // progress of input events.  For testing purposes it is often desirable
-  // to block the test until a sequence of events have been delivered and
-  // handled.  However these same mechanisms have proven to be brittle in
-  // the past so it might be better to solve the problem some other way.
-  1: DispatchEvent(InputEvent event);
-};
diff --git a/fidl/fuchsia.ui.input/input_event_constants.fidl b/fidl/fuchsia.ui.input/input_event_constants.fidl
deleted file mode 100644
index 3131664..0000000
--- a/fidl/fuchsia.ui.input/input_event_constants.fidl
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 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.
-
-library fuchsia.ui.input;
-
-// Keyboard modifiers
-const uint32 kModifierCapsLock     = 1;
-const uint32 kModifierLeftShift    = 2;
-const uint32 kModifierRightShift   = 4;
-const uint32 kModifierShift        = 6; // (kModifierLeftShift | kModifierRightShift);
-const uint32 kModifierLeftControl  = 8;
-const uint32 kModifierRightControl = 16;
-const uint32 kModifierControl      = 24; // (kModifierLeftControl | kModifierRightControl);
-const uint32 kModifierLeftAlt      = 32;
-const uint32 kModifierRightAlt     = 64;
-const uint32 kModifierAlt          = 96; // (kModifierLeftAlt | kModifierRightAlt);
-const uint32 kModifierLeftSuper    = 128;
-const uint32 kModifierRightSuper   = 256;
-const uint32 kModifierSuper        = 384; // (kModifierLeftSuper | kModifierRightSuper);
-
-// Mouse buttons
-const uint32 kMousePrimaryButton   = 1;
-const uint32 kMouseSecondaryButton = 2;
-const uint32 kMouseTertiaryButton  = 4;
-
-// Stylus buttons
-const uint32 kStylusPrimaryButton   = 1;
-const uint32 kStylusSecondaryButton = 2;
-
-// end-no-format
diff --git a/fidl/fuchsia.ui.input/input_events.fidl b/fidl/fuchsia.ui.input/input_events.fidl
deleted file mode 100644
index fb3c386..0000000
--- a/fidl/fuchsia.ui.input/input_events.fidl
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 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.
-
-library fuchsia.ui.input;
-
-enum KeyboardEventPhase {
-  // When key is pressed down.
-  PRESSED = 0;
-  // When key is released.
-  RELEASED = 1;
-  // This key |PRESSED| is not directed to this input client anymore.
-  CANCELLED = 2;
-  // Whether this is an automatically generated key repeat
-  REPEAT = 3;
-};
-
-// |KeyboardEvent| represents event generated by a user's interaction with a
-// keyboard.
-//
-// Those events are triggered by distinct pressed state changes of the keys.
-//
-// The state transitions should be as follows:
-// PRESSED -> (REPEAT ->) RELEASED
-// or
-// PRESSED -> (REPEAT ->) CANCELLED
-//
-// The input system will repeat those events automatically when a code_point is
-// available.
-struct KeyboardEvent {
-  // Time the event was delivered. The time is in nanoseconds and corresponds
-  // to the uptime of the machine.
-  uint64 event_time;
-
-  uint32 device_id;
-
-  KeyboardEventPhase phase;
-
-  // Keyboard HID Usage
-  // See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
-  uint32 hid_usage;
-
-  // The unicode code point represented by this key event, if any.
-  // Dead keys are represented as Unicode combining characters.
-  //
-  // If there is no unicode code point, this value is zero.
-  uint32 code_point;
-
-  // Key modifiers as defined by the different kModifier constants such as
-  // |kModifierCapsLock| currently pressed
-  uint32 modifiers;
-};
-
-enum PointerEventType {
-  // A touch-based pointer device.
-  TOUCH = 0;
-
-  // A pointer device with a stylus.
-  STYLUS = 1;
-
-  // A pointer device with a stylus that has been inverted.
-  INVERTED_STYLUS = 2;
-
-  // A pointer device without a stylus.
-  MOUSE = 3;
-};
-
-enum PointerEventPhase {
-  // The device has started tracking the pointer.
-  //
-  // For example, the pointer might be hovering above the device, having not yet
-  // made contact with the surface of the device.
-  ADD = 0;
-
-  // The pointer has moved with respect to the device while not in contact with
-  // the device.
-  HOVER = 1;
-
-  // The pointer has made contact with the device.
-  //
-  // For |MOUSE| devices, this is triggered when the primary button is pressed
-  // down to emulate a touch on the screen.
-  DOWN = 2;
-
-  // The pointer has moved with respect to the device while in contact with the
-  // device.
-  MOVE = 3;
-
-  // The pointer has stopped making contact with the device.
-  //
-  // For |MOUSE| devices, this is triggered when the primary button is
-  // released.
-  UP = 4;
-
-  // The device is no longer tracking the pointer.
-  //
-  // For example, the pointer might have drifted out of the device's hover
-  // detection range or might have been disconnected from the system entirely.
-  REMOVE = 5;
-
-  // The input from the pointer is no longer directed towards this receiver.
-  CANCEL = 6;
-
-  // TODO: add phases to indicate button press / release
-};
-
-// Pointers represent raw data about the user's interaction with the screen.
-//
-// The state transitions should be as follows:
-// ADD (-> HOVER) -> DOWN -> MOVE -> UP (-> HOVER) -> REMOVE
-//
-// At any point after the initial ADD, a transition to CANCEL is also possible.
-struct PointerEvent {
-  // Time the event was delivered. The time is in nanoseconds and corresponds
-  // to the uptime of the machine.
-  uint64 event_time;
-
-  uint32 device_id;
-
-  uint32 pointer_id;
-
-  PointerEventType type;
-
-  PointerEventPhase phase;
-
-  // |x| and |y| are in the coordinate system of the View.
-  float32 x;
-  float32 y;
-
-  // TODO(jpoichet) float32 vx;
-  // TODO(jpoichet) float32 vy;
-
-  float32 radius_major;
-  float32 radius_minor;
-  // TODO(jpoichet) float32 orientation;
-  // TODO(jpoichet) float32 tilt;
-  // TODO(jpoichet) float32 altitude;
-  // TODO(jpichet) float32 amplitude;
-
-  // Currently pressed buttons as defined the kButton constants such as
-  // |kMousePrimaryButton|
-  uint32 buttons;
-};
-
-struct FocusEvent {
-  // Time the event was delivered. The time is in nanoseconds and corresponds
-  // to the uptime of the machine.
-  uint64 event_time;
-
-  // Whether the view has gained input focused or not.
-  bool focused;
-};
-
-union InputEvent {
-  PointerEvent pointer;
-  KeyboardEvent keyboard;
-  FocusEvent focus;
-};
diff --git a/fidl/fuchsia.ui.input/input_reports.fidl b/fidl/fuchsia.ui.input/input_reports.fidl
deleted file mode 100644
index 0cff1e2..0000000
--- a/fidl/fuchsia.ui.input/input_reports.fidl
+++ /dev/null
@@ -1,259 +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.
-
-library fuchsia.ui.input;
-
-// Descriptors are used to describe the capabilities of an input device.
-//
-// Devices can have multiple descriptors of multiple kinds, for example:
-// |KeyboardDescriptor|, |MouseDescriptor|, |StylusDescriptor|,
-// |TouchscreenDescriptor| and |SensorDescriptor|
-//
-// An input device will generate |InputReport| corresponding to the
-// capabilities of that device listed in its descriptor.
-// For instance a input device with a |KeyboardDescriptor| will generate
-// |KeyboardReport| when a key is pressed on the keyboard.
-
-// Describe a |Range| of values
-struct Range {
-  int32 min;
-  int32 max;
-};
-
-struct RangeF {
-  float32 min;
-  float32 max;
-};
-
-enum AxisScale {
-  LINEAR = 0;
-  LOGARITHMIC = 1;
-};
-
-// An |Axis| is defined as a |range| and |resolution|.
-struct Axis {
-  Range range;
-  int32 resolution = 1;
-  AxisScale scale = LINEAR;
-};
-
-struct AxisF {
-  RangeF range;
-  float32 resolution = 1.0;
-  AxisScale scale = LINEAR;
-};
-
-// |ButtonsDescriptor| describes the buttons.
-struct ButtonsDescriptor {
-  // The list of buttons available.
-  uint32 buttons;
-};
-
-// Keyboards
-
-// |KeyboardDescriptor| describes the capabilities of a keyboard.
-struct KeyboardDescriptor {
-  // The list of HID keyboard usages that this keyboard can generate.
-  vector<uint32> keys;
-};
-
-// |KeyboardReport| lists the keys currently pressed down.
-struct KeyboardReport {
-  // |pressed_keys| is the list of HID usage that are currently pressed down on
-  // the keyboard.
-  vector<uint32> pressed_keys;
-};
-
-// Mouse
-
-// |MouseDescriptor| describes the capabilities of a mouse.
-struct MouseDescriptor {
-  // The range of relative X and Y movement which can be described by a mouse
-  // report.
-  Axis rel_x;
-  Axis rel_y;
-
-  // The range of relative vertical and horizontal scroll which can be
-  // described by a mouse report.
-  Axis? vscroll;
-  Axis? hscroll;
-
-  // The list of HID mouse usages that this mouse can generate.
-  uint32 buttons;
-};
-
-// |MouseReport| gives the relative mouvement of the mouse and currently
-// pressed buttons.
-struct MouseReport {
-  // Relative X and Y positional displacement.
-  int32 rel_x;
-  int32 rel_y;
-
-  // Relative horizontal and vertical scrolling displacement.
-  int32 rel_hscroll;
-  int32 rel_vscroll;
-
-  // buttons currently down
-  uint32 pressed_buttons;
-};
-
-// Stylus
-
-// |Stylus| describes the capabilities of a stylus.
-struct StylusDescriptor {
-  // Ranges for the |x| and |y| axis of the stylus.
-  Axis x;
-  Axis y;
-
-  // Range for the pressure of the tip
-  Axis? pressure;
-
-  bool is_invertible = false;
-
-  // The list of HID button usages that this stylus can generate.
-  uint32 buttons;
-};
-
-// |StylusReport| describes the current state of the stylus.
-struct StylusReport {
-  // Current position of the stylus within the range described in
-  // |StylusDescriptor|
-  int32 x;
-  int32 y;
-
-  // Pressure applied on the stylus tip
-  uint32 pressure;
-
-  // Whether the stylus has made contact with the surface.
-  bool is_in_contact;
-
-  // Whether the stylus is within range. If |is_in_contact| is false, then the stylus
-  // is hovering.
-  bool in_range;
-
-  // Whether the stylus is thought to be inverted.
-  bool is_inverted;
-
-  // List of buttons currently pressed down.
-  uint32 pressed_buttons;
-};
-
-// Touchscreen
-
-// |TouchscreenDescriptor| describes the capabilities of a touchscreen.
-struct TouchscreenDescriptor {
-  // Ranges of the |x| and |y| axis.
-  Axis x;
-  Axis y;
-  uint32 max_finger_id;
-};
-
-// |Touch| describes one touch on a touchscreen, which should correspond to
-// one finger.
-struct Touch {
-  // Identifier for a finger that is down.
-  // Note: |finger_id| might not be sequential and will range from 0 to
-  // |max_finger_id|
-  uint32 finger_id;
-
-  // Location within the axis defined in |TouchscreenDescriptor|
-  int32 x;
-  int32 y;
-
-  // Area pressed.
-  uint32 width;
-  uint32 height;
-};
-
-// |TouchscreenReport| describes the current touches recorded by the touchscreen
-// and holds a |Touch| per finger down.
-struct TouchscreenReport {
-  vector<Touch> touches;
-};
-
-// Motion Sensors
-
-// Descriptive categories for sensor devices.
-// We assume that each (SensorType,SensorLocation) pair is unique to the system.
-
-enum SensorType {
-  ACCELEROMETER = 0;
-  GYROSCOPE = 1;
-  MAGNETOMETER = 2;
-  LIGHTMETER = 3;
-};
-
-enum SensorLocation {
-  UNKNOWN = 0;
-  BASE = 1;
-  LID = 2;
-};
-
-// |SensorDescriptor| describes the capabilities of a sensor device.  It does
-// not capture properties that can be changed after initialization, such as the
-// current sampling frequency.
-struct SensorDescriptor {
-  SensorType type;
-  SensorLocation loc;
-
-  // Min and max sampling frequencies for a sensor.
-  uint32 min_sampling_freq;
-  uint32 max_sampling_freq;
-  // Max number of sensor events that could be in hardware FIFO.
-  uint32 fifo_max_event_count;
-
-  // Physical range of a specific sensor.
-  // Accelerometer ranges are given in Gs.
-  // Gyroscope ranges are given in deg/s.
-  // Magnetometer ranges are given in multiples of 1/16 uT.
-  // Light meter ranges can be given in Lux or units not specified.
-  int32 phys_min;
-  int32 phys_max;
-};
-
-// |SensorReport| describes the sensor event delivered from the event stream.
-union SensorReport {
-  array<int16>:3 vector;
-  uint16 scalar;
-};
-
-// |ButtonsReport| describes the buttons event delivered from the event stream.
-union ButtonsReport {
-  // Volume changes +1/-1 for volume up/down, this is a relative value.
-  int8 volume;
-  bool mic_mute;
-};
-
-// Device and Report
-
-struct DeviceInfo {
-  uint32 vendor_id;
-  uint32 product_id;
-  uint32 version;
-  string name;
-};
-
-// |DeviceDescriptor| describes one input device.
-struct DeviceDescriptor {
-  DeviceInfo? device_info;
-  KeyboardDescriptor? keyboard;
-  ButtonsDescriptor? buttons;
-  MouseDescriptor? mouse;
-  StylusDescriptor? stylus;
-  TouchscreenDescriptor? touchscreen;
-  SensorDescriptor? sensor;
-};
-
-// |InputReport| is an input |report| triggered by an input device.
-struct InputReport {
-  // |event_time| is in nanoseconds when the event was recorded.
-  uint64 event_time;
-
-  KeyboardReport? keyboard;
-  ButtonsReport? buttons;
-  MouseReport? mouse;
-  StylusReport? stylus;
-  TouchscreenReport? touchscreen;
-  SensorReport? sensor;
-};
diff --git a/fidl/fuchsia.ui.input/meta.json b/fidl/fuchsia.ui.input/meta.json
deleted file mode 100644
index 7054d90..0000000
--- a/fidl/fuchsia.ui.input/meta.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.ui.input/commands.fidl", 
-    "fidl/fuchsia.ui.input/ime_service.fidl", 
-    "fidl/fuchsia.ui.input/input_connection.fidl", 
-    "fidl/fuchsia.ui.input/input_device_registry.fidl", 
-    "fidl/fuchsia.ui.input/input_dispatcher.fidl", 
-    "fidl/fuchsia.ui.input/input_event_constants.fidl", 
-    "fidl/fuchsia.ui.input/input_events.fidl", 
-    "fidl/fuchsia.ui.input/input_reports.fidl", 
-    "fidl/fuchsia.ui.input/text_editing.fidl", 
-    "fidl/fuchsia.ui.input/text_input.fidl", 
-    "fidl/fuchsia.ui.input/usages.fidl"
-  ], 
-  "name": "fuchsia.ui.input", 
-  "root": "fidl/fuchsia.ui.input", 
-  "sources": [
-    "fidl/fuchsia.ui.input/commands.fidl", 
-    "fidl/fuchsia.ui.input/ime_service.fidl", 
-    "fidl/fuchsia.ui.input/input_connection.fidl", 
-    "fidl/fuchsia.ui.input/input_device_registry.fidl", 
-    "fidl/fuchsia.ui.input/input_dispatcher.fidl", 
-    "fidl/fuchsia.ui.input/input_event_constants.fidl", 
-    "fidl/fuchsia.ui.input/input_events.fidl", 
-    "fidl/fuchsia.ui.input/input_reports.fidl", 
-    "fidl/fuchsia.ui.input/text_editing.fidl", 
-    "fidl/fuchsia.ui.input/text_input.fidl", 
-    "fidl/fuchsia.ui.input/usages.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.input/text_editing.fidl b/fidl/fuchsia.ui.input/text_editing.fidl
deleted file mode 100644
index 73759a1..0000000
--- a/fidl/fuchsia.ui.input/text_editing.fidl
+++ /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.
-
-library fuchsia.ui.input;
-
-// Whether a TextPosition is visually upstream or downstream of its offset.
-//
-// For example, when a text position exists at a line break, a single offset has
-// two visual positions, one prior to the line break (at the end of the first
-// line) and one after the line break (at the start of the second line). A text
-// affinity disambiguates between those cases. (Something similar happens with
-// between runs of bidirectional text.)
-enum TextAffinity {
-  // The position has affinity for the upstream side of the text position.
-  //
-  // For example, if the offset of the text position is a line break, the
-  // position represents the end of the first line.
-  UPSTREAM = 0;
-
-  // The position has affinity for the downstream side of the text position.
-  //
-  // For example, if the offset of the text position is a line break, the
-  // position represents the start of the second line.
-  DOWNSTREAM = 1;
-};
-
-// A range of characters in a string of text.
-struct TextRange {
-  // The index of the first UTF-16 character in the range.
-  //
-  // If |start| and |end| are both -1, the text range is empty.
-  int64 start = -1;
-
-  // The next index after the UTF-16 characters in this range.
-  //
-  // If |start| and |end| are both -1, the text range is empty.
-  int64 end = -1;
-};
-
-// A range of text that represents a selection.
-//
-// Text selection is always directional. Direction should be determined by
-// comparing base and extent.
-struct TextSelection {
-  // The offset at which the selection originates.
-  //
-  // Might be larger than, smaller than, or equal to extent.
-  int64 base;
-
-  // The offset at which the selection terminates.
-  //
-  // When the user uses the arrow keys to adjust the selection, this is the
-  // value that changes. Similarly, if the current theme paints a caret on one
-  // side of the selection, this is the location at which to paint the caret.
-  //
-  // Might be larger than, smaller than, or equal to base.
-  int64 extent;
-
-  // If the the text range is collapsed and has more than one visual location
-  // (e.g., occurs at a line break), which of the two locations to use when
-  // painting the caret.
-  TextAffinity affinity;
-};
diff --git a/fidl/fuchsia.ui.input/text_input.fidl b/fidl/fuchsia.ui.input/text_input.fidl
deleted file mode 100644
index 6d38423..0000000
--- a/fidl/fuchsia.ui.input/text_input.fidl
+++ /dev/null
@@ -1,56 +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.
-
-library fuchsia.ui.input;
-
-enum KeyboardType {
-  TEXT = 0;
-  NUMBER = 1;
-  PHONE = 2;
-  DATETIME = 3;
-};
-
-enum InputMethodAction {
-  UNSPECIFIED = 0;
-  NONE = 1;
-  GO = 2;
-  SEARCH = 3;
-  SEND = 4;
-  NEXT = 5;
-  DONE = 6;
-  PREVIOUS = 7;
-};
-
-// The current text, selection, and composing state for editing a run of text.
-struct TextInputState {
-  // Current state revision to avoid race conditions.
-  uint32 revision;
-
-  // The current text being edited.
-  string text;
-
-  // The range of text that is currently selected.
-  TextSelection selection;
-
-  // The range of text that is still being composed.
-  TextRange composing;
-};
-
-// A interface for interacting with a text input control.
-interface InputMethodEditor {
-  1: SetKeyboardType(KeyboardType keyboard_type);
-  2: SetState(TextInputState state);
-  3: InjectInput(InputEvent event);
-
-  // TODO(TEXT-19): remove these in a later change, after PlatformView has been
-  // switched over to open/close on the input_connection_ instead.
-  4: Show();
-  5: Hide();
-};
-
-// An interface to receive information from |TextInputService|.
-interface InputMethodEditorClient {
-  1: DidUpdateState(TextInputState state, InputEvent? event);
-  2: OnAction(InputMethodAction action);
-};
diff --git a/fidl/fuchsia.ui.input/usages.fidl b/fidl/fuchsia.ui.input/usages.fidl
deleted file mode 100644
index 2fd70e1..0000000
--- a/fidl/fuchsia.ui.input/usages.fidl
+++ /dev/null
@@ -1,18 +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.
-
-library fuchsia.ui.input;
-
-// Common mouse buttons report constants
-const uint32  kMouseButtonPrimary   = 1;
-const uint32  kMouseButtonSecondary = 2;
-const uint32  kMouseButtonTertiary  = 4;
-
-// Common stylus buttons report constants
-const uint32  kStylusBarrel = 1;
-
-// Used as mask bits (2^N) against ButtonDescriptor.buttons.
-const uint32  kVolumeUp             = 1;
-const uint32  kVolumeDown           = 2;
-const uint32  kMicMute              = 4;
diff --git a/fidl/fuchsia.ui.policy/display_usage.fidl b/fidl/fuchsia.ui.policy/display_usage.fidl
deleted file mode 100644
index 79f820f..0000000
--- a/fidl/fuchsia.ui.policy/display_usage.fidl
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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.
-
-library fuchsia.ui.policy;
-
-// Describes the intended usage of the display.
-enum DisplayUsage {
-  kUnknown = 0;
-  // Display is held in one or both hands.
-  kHandheld = 1;
-  // Display is used well within arm's reach.
-  kClose = 2;
-  // Display is used at arm's reach.
-  kNear = 3;
-  // Display is used beyond arm's reach.
-  kMidrange = 4;
-  // Display is used well beyond arm's reach.
-  kFar = 5;
-};
diff --git a/fidl/fuchsia.ui.policy/meta.json b/fidl/fuchsia.ui.policy/meta.json
deleted file mode 100644
index 424455e..0000000
--- a/fidl/fuchsia.ui.policy/meta.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "deps": [
-    "fuchsia.ui.gfx", 
-    "fuchsia.ui.input", 
-    "fuchsia.ui.viewsv1token"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.policy/display_usage.fidl", 
-    "fidl/fuchsia.ui.policy/presentation.fidl", 
-    "fidl/fuchsia.ui.policy/presenter.fidl"
-  ], 
-  "name": "fuchsia.ui.policy", 
-  "root": "fidl/fuchsia.ui.policy", 
-  "sources": [
-    "fidl/fuchsia.ui.policy/display_usage.fidl", 
-    "fidl/fuchsia.ui.policy/presentation.fidl", 
-    "fidl/fuchsia.ui.policy/presenter.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.policy/presentation.fidl b/fidl/fuchsia.ui.policy/presentation.fidl
deleted file mode 100644
index c6d3dcc..0000000
--- a/fidl/fuchsia.ui.policy/presentation.fidl
+++ /dev/null
@@ -1,84 +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.
-
-library fuchsia.ui.policy;
-
-using fuchsia.ui.gfx;
-using fuchsia.ui.input;
-
-// |Presentation.CaptureKeyboardEvent| will consume this listener interface and
-// call |OnEvent| when the registered keyboard event occurs.
-interface KeyboardCaptureListenerHACK {
-  1: OnEvent(fuchsia.ui.input.KeyboardEvent event);
-};
-
-// |Presentation.CapturePointerEvent| will consume this listener interface and
-// call |OnEvent| when a pointer event occurs.
-interface PointerCaptureListenerHACK {
-  1: OnPointerEvent(fuchsia.ui.input.PointerEvent event);
-};
-
-// Allows clients of Presenter.Present() to control a presentation.
-// Experimental.
-[Discoverable]
-interface Presentation {
-  // Enable or disable clipping for the Scenic renderer associated with the
-  // presentation.
-  1: EnableClipping(bool enabled);
-
-  2: UseOrthographicView();
-  3: UsePerspectiveView();
-
-  // Set parameters such as the shadow algorithm used to render the scene.
-  // NOTE: a single param would be better than an array; see TO-529.
-  4: SetRendererParams(vector<fuchsia.ui.gfx.RendererParam> params);
-
-  // Override the intended usage of the display.
-  5: SetDisplayUsage(DisplayUsage usage);
-
-  // Rotates the display.
-  11: SetDisplayRotation(float32 display_rotation_degrees, bool animate);
-
-  // Override the dimensions of the display. Values must be less than the actual
-  // size of the display. If either of the values are 0, then they are ignored
-  // and the actual size of the display is used.
-  7: SetDisplaySizeInMm(float32 width_in_mm, float32 height_in_mm);
-
-  // This call exists so that base shell can capture hotkeys and do special
-  // things with it (e.g., switch a session shell). Phase and modifiers are always
-  // matched, and valid (non-zero) code points are matched. If there is no
-  // valid code point, the filter will match against the hid usage value.
-  // The full KeyboardEvent is supplied to |listener|'s OnEvent.
-  // TODO: Figure out the feasibility of this feature and the best place to put
-  // it.
-  6: CaptureKeyboardEventHACK(fuchsia.ui.input.KeyboardEvent event_to_capture,
-                              KeyboardCaptureListenerHACK listener);
-
-  // This call exists so that base shell can capture pointer events.
-  // TODO: Figure out the feasibility of this feature and the best place to put
-  // it. This call will be replaced by gesture disambiguation system in future.
-  10: CapturePointerEventsHACK(PointerCaptureListenerHACK listener);
-
-  // TODO(SCN-650): Determine better place for PresentationMode API.
-  8: GetPresentationMode() -> (PresentationMode mode);
-  9: SetPresentationModeListener(PresentationModeListener listener);
-};
-
-// Screen modes that can be detected via sensor data.
-// N.B. We use accelerometers to measure gravity when at rest, so detection is
-// limited to earth-relative orientations.
-enum PresentationMode {
-  CLOSED = 0;
-  LAPTOP = 1;
-  TABLET = 2;
-  TENT = 3;
-};
-
-// Tell client that the screen mode has changed, according to sensors.
-// N.B. There can be a race where the actual mode continues to change, after
-// the listener has been notified. The client must call GetPresentationMode(),
-// which will return the latest detected mode.
-interface PresentationModeListener {
-  1: OnModeChanged();
-};
diff --git a/fidl/fuchsia.ui.policy/presenter.fidl b/fidl/fuchsia.ui.policy/presenter.fidl
deleted file mode 100644
index f712643..0000000
--- a/fidl/fuchsia.ui.policy/presenter.fidl
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-library fuchsia.ui.policy;
-
-using fuchsia.ui.gfx;
-using fuchsia.ui.viewsv1token;
-
-// The Presenter service provides a way for applications to ask that a
-// specified view be added to a view tree, leaving any window management
-// concerns up to the discretion of the presenter implementation.
-//
-// TODO(SCN-599): this will be replaced by Presenter2
-[Discoverable]
-interface Presenter {
-    1: Present2(handle<eventpair> view_owner_token, request<Presentation>? presentation_request);
-
-    // Sets new default renderer params and forces them on for the duration of the
-    // presenter's lifetime. Only applies to any subsequent calls to Present().
-    // Used for testing.
-    2: HACK_SetRendererParams(bool enable_clipping, vector<fuchsia.ui.gfx.RendererParam> params);
-
-    // Set the input path. Root presenter will send to ViewManager (legacy) or Scenic.
-    3: HACK_SetInputPath(bool use_legacy);
-
-    // Query the input path. Return true if ViewManager receives input.
-    4: HACK_QueryInputPath() -> (bool use_legacy);
-};
-
-// The Presenter service provides a way for applications to ask that a
-// specified view be added to a view tree, leaving any window management
-// concerns up to the discretion of the presenter implementation.
-//
-// TODO(SCN-595): this is the new presenter interface, which will be renamed
-// to Presenter after the original is deleted.
-[Discoverable]
-interface Presenter2 {
-    // Usage: the client creates a pair of eventpairs and uses one to create a
-    // View in their Scenic session.  The other eventpair is passed to this
-    // method as |view_holder_token|; the Presenter2 service will use this to
-    // create a ViewHolder which is embedded within an appropriate Scenic scene,
-    // such that the client View it will receive input events, etc.
-    1: PresentView(handle<eventpair> view_holder_token, request<Presentation>? presentation_request);
-};
diff --git a/fidl/fuchsia.ui.scenic/commands.fidl b/fidl/fuchsia.ui.scenic/commands.fidl
deleted file mode 100644
index 46c54f3..0000000
--- a/fidl/fuchsia.ui.scenic/commands.fidl
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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.
-
-library fuchsia.ui.scenic;
-
-using fuchsia.ui.gfx;
-using fuchsia.ui.input;
-using fuchsia.ui.vectorial;
-using fuchsia.ui.views;
-
-union Command {
-  fuchsia.ui.gfx.Command gfx;
-  fuchsia.ui.vectorial.Command vectorial;
-  fuchsia.ui.views.Command views;
-  fuchsia.ui.input.Command input;
-};
diff --git a/fidl/fuchsia.ui.scenic/events.fidl b/fidl/fuchsia.ui.scenic/events.fidl
deleted file mode 100644
index f296622..0000000
--- a/fidl/fuchsia.ui.scenic/events.fidl
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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.
-
-library fuchsia.ui.scenic;
-
-using fuchsia.ui.input;
-using fuchsia.ui.gfx;
-
-union Event {
-  fuchsia.ui.gfx.Event gfx;
-  fuchsia.ui.input.InputEvent input;
-  Command unhandled;
-};
diff --git a/fidl/fuchsia.ui.scenic/meta.json b/fidl/fuchsia.ui.scenic/meta.json
deleted file mode 100644
index 26d9f49..0000000
--- a/fidl/fuchsia.ui.scenic/meta.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "deps": [
-    "fuchsia.images", 
-    "fuchsia.ui.gfx", 
-    "fuchsia.ui.input", 
-    "fuchsia.ui.vectorial", 
-    "fuchsia.ui.views", 
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.scenic/commands.fidl", 
-    "fidl/fuchsia.ui.scenic/events.fidl", 
-    "fidl/fuchsia.ui.scenic/scenic.fidl", 
-    "fidl/fuchsia.ui.scenic/session.fidl"
-  ], 
-  "name": "fuchsia.ui.scenic", 
-  "root": "fidl/fuchsia.ui.scenic", 
-  "sources": [
-    "fidl/fuchsia.ui.scenic/commands.fidl", 
-    "fidl/fuchsia.ui.scenic/events.fidl", 
-    "fidl/fuchsia.ui.scenic/scenic.fidl", 
-    "fidl/fuchsia.ui.scenic/session.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.scenic/scenic.fidl b/fidl/fuchsia.ui.scenic/scenic.fidl
deleted file mode 100644
index 74a88cc..0000000
--- a/fidl/fuchsia.ui.scenic/scenic.fidl
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-library fuchsia.ui.scenic;
-
-using fuchsia.images;
-using fuchsia.mem;
-using fuchsia.ui.gfx;
-
-// Scenic.TakeScreenshot() returns a raw BGRA formatted image in this struct.
-struct ScreenshotData {
-  fuchsia.images.ImageInfo info;
-  fuchsia.mem.Buffer data;
-};
-
-[Discoverable]
-interface Scenic {
-  // Create a new Session, which is the primary way to interact with Mozart.
-  1: CreateSession(request<Session> session, SessionListener? listener);
-
-  // Get information about the SceneManager's primary display.
-  // TODO(MZ-453): in the future there will probably be a DisplayManager, and
-  // info about which displays to use will be provided to the SceneManager.
-  2: GetDisplayInfo() -> (fuchsia.ui.gfx.DisplayInfo info);
-  // Gets an event signaled with displayOwnedSignal or displayNotOwnedSignal
-  // when display ownership changes.
-  3: GetDisplayOwnershipEvent() -> (handle<event> ownership_event);
-
-  // Take a screenshot and return the data in |img_data|. |img_data| will
-  // not contain BGRA data if |success| is false.
-  // TODO(SCN-678): The permissions here are too wide (anyone can take a
-  // screenshot), we should narrow them.
-  4: TakeScreenshot() -> (ScreenshotData img_data, bool success);
-};
-
-const uint32 displayOwnedSignal = 0x02000000;
-const uint32 displayNotOwnedSignal = 0x01000000;
diff --git a/fidl/fuchsia.ui.scenic/session.fidl b/fidl/fuchsia.ui.scenic/session.fidl
deleted file mode 100644
index a1dcdbf..0000000
--- a/fidl/fuchsia.ui.scenic/session.fidl
+++ /dev/null
@@ -1,150 +0,0 @@
-// 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.
-
-library fuchsia.ui.scenic;
-
-using fuchsia.images;
-using fuchsia.ui.gfx;
-
-// Client use Sessions to interact with a Mozart instance by enqueuing commands
-// that create or modify resources.
-interface Session {
-    1: Enqueue(vector<Command> cmds);
-
-    // Present all previously enqueued operations.  In order to pipeline the
-    // preparation of the resources required to render the scene, two lists of
-    // fences (implemented as events) are passed.
-    //
-    // SCHEDULING PRESENTATION
-    //
-    // |presentation_time| specifies the time on or after which the
-    // client would like the enqueued operations should take visible effect
-    // (light up pixels on the screen), expressed in nanoseconds in the
-    // |CLOCK_MONOTONIC| timebase.  Desired presentation times must be
-    // monotonically non-decreasing.
-    //
-    // Using a desired presentation time in the present or past (such as 0)
-    // schedules enqueued operations to take visible effect as soon as possible
-    // (during the next frame to be prepared).
-    //
-    // Using a desired presentation time in the future schedules the enqueued
-    // operations to take visible effect as closely as possible to or after
-    // the stated time (but no earlier).
-    //
-    // Each rendered frame has a target presentation time.  Before rendering
-    // a frame, the scene manager applies all enqueued operations associated
-    // with all prior calls to |Present()| whose desired presentation time
-    // is on or before the frame's target presentation time.
-    //
-    // The |Present()| method does not return until the scene manager begins
-    // preparing the first frame which includes its presented content.
-    // Upon return, the |PresentationInfo| provides timing information for the
-    // frame which includes the presented content.
-    //
-    // To present new content on each successive frame, wait for |Present()|
-    // to return before calling |Present()| again with content for the next
-    // frame.
-    //
-    // It is also possible to enqueue and present successive frames of content
-    // all at once with increasing desired presentation times, incrementing by
-    // |PresentationInfo.presentation_interval| for each one.
-    //
-    // Animation updates are also coordinated in terms of presentation time.
-    //
-    // TODO(jeffbrown): Defining presentation time in terms of |CLOCK_MONOTONIC|
-    // simplifies synchronization across subsystems but it might be too simple.
-    // We should consider using a synthetic timebase and describing its relation
-    // to other clocks separately.  That would make it possible to present
-    // content (animations, media, and UI) in "slow mode" simply by varying the
-    // timing relation, assuming clients play along.
-    //
-    // SYNCHRONIZATION
-    //
-    // |acquire_fences| are used by Mozart to wait until all of the session's
-    // resources are ready to render (or to allow downstream components, such as
-    // the Vulkan driver, to wait for these resources).
-    //
-    // For example, Fuchsia's Vulkan driver allows an zx::event to be obtained
-    // from a VkSemaphore.  This allows a Mozart client to submit a Vulkan command
-    // buffer to generate images/meshes/etc., and instructing Vulkan to signal a
-    // VkSemaphore when it is done.  By inserting the zx::event corresponding to
-    // this semaphore into |acquire_fences|, the client allows Mozart to submit work
-    // to the Vulkan driver without waiting on the CPU for the event to be
-    // signalled.
-    //
-    // |release_fences| is a list of events that will be signalled by Mozart when
-    // the updated session state has been fully committed: future frames will be
-    // rendered using this state, and all frames generated using previous session
-    // states have been fully-rendered and presented to the display.
-    //
-    // Together, |acquire_fences| and |release_fences| are intended to allow clients
-    // to implement strategies such as double-buffering.  For example, a client
-    // might do the following in the Scenic subsystem:
-    //   1) create two Image with resource IDs #1 and #2.
-    //   2) create two Materials with resource IDs #3 and #4, which respectively
-    //      use Images #1 and #2 as their texture.
-    //   3) create a tree of Nodes and attach them to the scene.
-    //   4) set one of the nodes above, say #5, to use Material #3.
-    //   5) submit a Vulkan command-buffer which renders into Image #1, and
-    //      will signal a VkSemaphore.
-    //   6) call Present() with one acquire-fence (obtained from the VkSemaphore
-    //      above) and one newly-created release-fence.
-    //
-    // After the steps above, Mozart will use the committed session state to render
-    // frames whenever necessary.  When the client wants to display something
-    // different than Image #1, it would do something similar to steps 4) to 6):
-    //   7) set Node #5 to use Material #4.
-    //   8) submit a Vulkan command-buffer which renders into Image #1, and
-    //      will signal a VkSemaphore.
-    //   9) call Present() with one acquire-fence (obtained from the VkSemaphore
-    //      above) and one newly-created release-fence.
-    //
-    // Finally, to continually draw new content, the client could repeat steps
-    // 4) to 9), with one important difference: step 5) must wait on the event
-    // signalled by step 9).  Otherwise, it might render into Image #1 while that
-    // image is still being used by Mozart to render a frame.  Similarly, step 8)
-    // must wait on the event signalled by step 6).
-    //
-    // The scenario described above uses one acquire-fence and one release-fence,
-    // but it is easy to imagine cases that require more.  For example, in addition
-    // to using Vulkan to render into Images #1 and #2, the client might also
-    // upload other resources to Vulkan on a different VkQueue, which would
-    // would signal a separate semaphore, and therefore require an additional
-    // acquire-fence.
-    //
-    // Note: |acquire_fences| and |release_fences| are only necessary to synchronize
-    // access to memory (and other external resources).  Any modification to
-    // resources made via the Session API are automatically synchronized.
-    //
-    // TODO(MZ-400): document invariants that apply to |presentation_info|.  Is it
-    // strong enough to guarantee that receiving the response means that all
-    // previously-enqueued Commands have been applied?  Or does it need to be stronger,
-    // e.g. that all frames based on previous presentations are completely done,
-    // and subsequent frames will be rendered based on the most recent presented
-    // content?
-    2: Present(uint64 presentation_time,
-               vector<handle<event>> acquire_fences, vector<handle<event>> release_fences)
-           -> (fuchsia.images.PresentationInfo presentation_info);
-
-    // TODO(MZ-422) Remove these methods from the FIDL; they should just be
-    // exposed to View Manager directly using a C++ interface.
-    3: HitTest(uint32 node_id, fuchsia.ui.gfx.vec3 ray_origin, fuchsia.ui.gfx.vec3 ray_direction)
-           -> (vector<fuchsia.ui.gfx.Hit>? hits);
-    4: HitTestDeviceRay(fuchsia.ui.gfx.vec3 ray_origin, fuchsia.ui.gfx.vec3 ray_direction)
-           -> (vector<fuchsia.ui.gfx.Hit>? hits);
-
-    // Set an optional debug name for the session.  The debug name will be
-    // output in things such as logging and trace events.
-    5: SetDebugName(string debug_name);
-};
-
-// Listens for events which occur within the session.
-interface SessionListener {
-    // Called when an error has occurred and the session will be torn down.
-    1: OnScenicError(string error);
-
-    // Called to deliver a batch of one or more events to the listener.
-    // Use |SetEventMaskCmd| to enable event delivery for a resource.
-    2: OnScenicEvent(vector<Event> events);
-};
diff --git a/fidl/fuchsia.ui.vectorial/commands.fidl b/fidl/fuchsia.ui.vectorial/commands.fidl
deleted file mode 100644
index 7067240..0000000
--- a/fidl/fuchsia.ui.vectorial/commands.fidl
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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.
-
-library fuchsia.ui.vectorial;
-
-union Command {
-  bool placeHolder;
-};
diff --git a/fidl/fuchsia.ui.vectorial/events.fidl b/fidl/fuchsia.ui.vectorial/events.fidl
deleted file mode 100644
index 14fddb0..0000000
--- a/fidl/fuchsia.ui.vectorial/events.fidl
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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.
-
-library fuchsia.ui.vectorial;
-
-union Event {
-  bool placeHolder;
-};
diff --git a/fidl/fuchsia.ui.vectorial/meta.json b/fidl/fuchsia.ui.vectorial/meta.json
deleted file mode 100644
index 4bd6fc0..0000000
--- a/fidl/fuchsia.ui.vectorial/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.ui.vectorial/commands.fidl", 
-    "fidl/fuchsia.ui.vectorial/events.fidl"
-  ], 
-  "name": "fuchsia.ui.vectorial", 
-  "root": "fidl/fuchsia.ui.vectorial", 
-  "sources": [
-    "fidl/fuchsia.ui.vectorial/commands.fidl", 
-    "fidl/fuchsia.ui.vectorial/events.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.views/commands.fidl b/fidl/fuchsia.ui.views/commands.fidl
deleted file mode 100644
index f138081..0000000
--- a/fidl/fuchsia.ui.views/commands.fidl
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-library fuchsia.ui.views;
-
-union Command {
-  CreateViewCmd create_view;
-  CreateViewHolderCmd create_view_holder;
-
-  AddChildViewCmd add_child_view;
-  RemoveChildViewCmd remove_child_view;
-};
-
-struct CreateViewCmd {
-  uint32 id;
-  handle<eventpair> token;
-};
-
-struct CreateViewHolderCmd {
-  uint32 id;
-  handle<eventpair> token;
-};
-
-struct AddChildViewCmd {
-  uint32 view_id;
-  uint32 view_holder_id;
-};
-
-struct RemoveChildViewCmd {
-  uint32 view_id;
-  uint32 view_holder_id;
-};
diff --git a/fidl/fuchsia.ui.views/events.fidl b/fidl/fuchsia.ui.views/events.fidl
deleted file mode 100644
index f737e57..0000000
--- a/fidl/fuchsia.ui.views/events.fidl
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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.
-
-library fuchsia.ui.views;
-
-using fuchsia.ui.gfx;
-
-union Event {
-  ChildViewAttachedEvent child_view_attached;
-  ChildViewUnavailableEvent child_view_unavailable;
-};
-
-// Called when a child view is attached.
-struct ChildViewAttachedEvent {
-  uint32 view_holder_id;
-};
-
-// Called when a child view has become unavailable.
-//
-// A child may become unavailable for many reasons such being unregistered
-// by its application, abnormal termination of its application, or
-// cycles being introduced in the view tree.
-//
-// To complete removal of an unavailable child, this view component must
-// call RemoveChild() on its view with |child_key|.
-//
-// The implementation should invoke the callback once the event has
-// been handled.
-struct ChildViewUnavailableEvent {
-  uint32 view_holder_id;
-};
diff --git a/fidl/fuchsia.ui.views/meta.json b/fidl/fuchsia.ui.views/meta.json
deleted file mode 100644
index 2408d9a..0000000
--- a/fidl/fuchsia.ui.views/meta.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "deps": [
-    "fuchsia.sys", 
-    "fuchsia.math", 
-    "fuchsia.ui.gfx", 
-    "fuchsia.ui.input"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.views/commands.fidl", 
-    "fidl/fuchsia.ui.views/events.fidl"
-  ], 
-  "name": "fuchsia.ui.views", 
-  "root": "fidl/fuchsia.ui.views", 
-  "sources": [
-    "fidl/fuchsia.ui.views/commands.fidl", 
-    "fidl/fuchsia.ui.views/events.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl b/fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl
deleted file mode 100644
index 6dc7c77..0000000
--- a/fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.ui.gfx;
-using fuchsia.ui.scenic;
-using fuchsia.math;
-
-// This is a temporary solution to expose hit testing to the accessibility manager before the
-// scenic refactor.
-// TODO(SCN-845) A new hit test API will be exposed after the refactor.
-//
-// DO NOT USE!
-
-[Discoverable]
-interface AccessibilityViewInspector {
-  // Provides a FIDL interface to expose the hit test mechanism from view manager.
-  1: PerformHitTest(ViewTreeToken token, fuchsia.math.Point3F origin,
-                    fuchsia.math.Point3F direction) -> (vector<fuchsia.ui.gfx.Hit> hits);
-};
diff --git a/fidl/fuchsia.ui.viewsv1/meta.json b/fidl/fuchsia.ui.viewsv1/meta.json
deleted file mode 100644
index 8726e16..0000000
--- a/fidl/fuchsia.ui.viewsv1/meta.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "deps": [
-    "fuchsia.math", 
-    "fuchsia.sys", 
-    "fuchsia.ui.gfx", 
-    "fuchsia.ui.scenic", 
-    "fuchsia.ui.viewsv1token", 
-    "fuchsia.mem"
-  ], 
-  "files": [
-    "fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_containers.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_manager.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_properties.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_provider.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_snapshot.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_tree_token.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_trees.fidl", 
-    "fidl/fuchsia.ui.viewsv1/views.fidl"
-  ], 
-  "name": "fuchsia.ui.viewsv1", 
-  "root": "fidl/fuchsia.ui.viewsv1", 
-  "sources": [
-    "fidl/fuchsia.ui.viewsv1/accessibility_view_inspector.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_containers.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_manager.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_properties.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_provider.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_snapshot.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_tree_token.fidl", 
-    "fidl/fuchsia.ui.viewsv1/view_trees.fidl", 
-    "fidl/fuchsia.ui.viewsv1/views.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.viewsv1/view_containers.fidl b/fidl/fuchsia.ui.viewsv1/view_containers.fidl
deleted file mode 100644
index 9c44d8c..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_containers.fidl
+++ /dev/null
@@ -1,202 +0,0 @@
-// 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.mem;
-
-using fuchsia.ui.viewsv1token;
-
-// A view container is an interface exposed by |View| and |ViewTree| to
-// manage their child views.  Although |View| may have any number of children,
-// a |ViewTree| can have at most one (its root view).
-//
-// EMBEDDING
-//
-// The following steps are required to embed another view as a child:
-//
-// 1. Obtain the |ViewOwner| belonging to the view you would like to embed.
-//    The means for doing this is not specified by the view system.
-//    You might create another view of your own to embed or connect to
-//    another application using a mechanism such as |ViewProvider| (or
-//    any suitable agreed-upon protocol) to create the view to embed.
-//
-// 2. Call |AddChild()| to add the view you would like to embed and assign
-//    it a unique key.
-//
-// 3. Call |SetChildProperties()| to provide layout parameters and other
-//    properties for the new child using the same key that was provided
-//    to |AddChild()|.
-//
-// 4. Watch for the child becoming unavailable, as reported by
-//    |OnChildUnavailable()|, which indicates that the child is no longer
-//    in a usable state (perhaps the application which provided it has
-//    stopped).  When this happens, you are still responsible for calling
-//    |RemoveChild()| to remove the child and discard any state that your
-//    view has associated with it.
-//
-// VIEW PROPERTIES AND LAYOUT
-//
-// The container controls the presentation of its children by setting
-// |ViewProperties| for each of them.  View properties include layout
-// information and other parameters the child needs to know to participate
-// in the view hierarchy.
-//
-// The container must set properties for each of its children after adding
-// them, as otherwise the children cannot be rendered (since they lack enough
-// context to know what to draw).
-interface ViewContainer {
-  // Sets the view container listener, or null to remove.
-  1: SetListener(ViewContainerListener? listener);
-
-  // Adds the view referenced by |child_view_owner| as a child and assigns
-  // it the provided |child_key| to identify it among its children.
-  // The container may remove the child later by passing the same |child_key|
-  // to |RemoveChild()|.
-  //
-  // This method takes ownership of the view.
-  //
-  // It is important for the container to choose locally unique values for
-  // |child_key| to ensure that each child can be distinguished even as
-  // more children are added or removed.  We recommend using a simple
-  // counter which is incremented on each (re-)addition.
-  //
-  // If the child becomes unavailable at any time prior to being removed
-  // then an |OnChildUnavailable()| message will be sent.
-  //
-  // If |child_view_owner| refers to a view which is already unavailable or
-  // if adding the view would create a cycle in the view tree then the
-  // call proceeds as if it succeeded but an |OnChildUnavailable()| message
-  // will be sent.
-  //
-  // If |child_view_owner| refers to a view which already has a container or is
-  // the root of a view tree then an |OnChildUnavailable()| message will
-  // be sent to its old container or root and the the view will be
-  // (re-)added to its new container as usual.  This special case also
-  // applies when the specified view is already a child of this view, in which
-  // case the behavior is similar to the view having been transferred to
-  // some other container and then back again.
-  //
-  // Note that an unavailable child will remain in its container's list of
-  // children until its container explicitly calls |RemoveChild()| to remove
-  // it.
-  //
-  // |host_import_token| is an import token which the view manager will
-  // use to import the node to which the child view's content should
-  // be attached.
-  //
-  // To establish the graphical embedding relation, the container view
-  // must create an event pair, bind one endpoint to an |ExportResourceOp|
-  // associated with the node to which the child's content nodes will be
-  // attached as descendants, and pass the other endpoint to this method as
-  // |host_import_token|.
-  //
-  // It is an error to add a view whose |child_key| already appears
-  // in the view's list of children; the connection will be closed.
-  //
-  // It is an error to add more than one child to a |ViewTree|'s container;
-  // it can only have at most one child (its root).
-  //
-  // This method is deprecated in favor of the eventpair-based one below.
-  // TODO(SCN-1018): Remove this.
-  2: AddChild(uint32 child_key,
-      fuchsia.ui.viewsv1token.ViewOwner child_view_owner,
-      handle<eventpair> host_import_token);
-
-  3: AddChild2(uint32 child_key,
-      handle<eventpair> view_holder_token,
-      handle<eventpair> host_import_token);
-
-  // Removes the view referenced by |child_key| from the view's
-  // list of children.
-  //
-  // If |transferred_view_owner| is not null, associates it with the
-  // previously added child to allow it to be transferred elsewhere or
-  // closes the |transferred_view_owner| channel if there was none.
-  //
-  // It is an error to remove a view whose |child_key| does not appear
-  // in the container's list of children; the connection will be closed.
-  //
-  // This method is deprecated in favor of the eventpair-based one below.
-  // TODO(SCN-1018): Remove this.
-  4: RemoveChild(uint32 child_key,
-      request<fuchsia.ui.viewsv1token.ViewOwner>? transferred_view_owner);
-
-  5: RemoveChild2(uint32 child_key,
-      handle<eventpair>? transferred_view_holder_token);
-
-  // Sets view properties for the child, such as layout constraints.
-  //
-  // This method must be called at least once after a child is added to
-  // set the view's properties before it can be rendered.  Rendering for
-  // children without properties is blocked until properties are set.
-  //
-  // The |child_view_properties| specifies the properties for the child, or
-  // null to remove the properties from the child which will cause rendering
-  // of the child's scene to be blocked until new properties are set.
-  //
-  // It is an error to specify a |child_key| that does not appear in
-  // the container's list of children; the connection will be closed.
-  //
-  // It is an error to specify malformed |child_view_properties| such
-  // as invalid layout properties; the connection will be closed.
-  6: SetChildProperties(uint32 child_key, ViewProperties? child_view_properties);
-
-  // WIP API
-  // Sends a hint about a pending size change to the given node and all nodes
-  // below. This is generally sent before an animation.
-  //
-  // |width_change_factor| and |height_change_factor| is how much bigger or smaller
-  // the item is expected to be in the near future. This one number encapsulate
-  // both changes in scale, as well as changes to layout width and height.
-  //
-  // It is an error to specify a |child_key| that does not appear in
-  // the container's list of children; the connection will be closed.
-  //
-  7: SendSizeChangeHintHACK(uint32 child_key, float32 width_change_factor,
-                            float32 height_change_factor);
-
-  // Request the child view to get input focus for key events.
-  8: RequestFocus(uint32 child_key);
-
-  // Request the snapshot of the child view.
-  9: RequestSnapshotHACK(uint32 child_key)-> (fuchsia.mem.Buffer data);
-};
-
-// An interface clients may implement to receive events from a view container.
-interface ViewContainerListener {
-  // Called when a child view is attached along with embedding information.
-  //
-  // This method will be called at most once after the child is added.
-  //
-  // The implementation should invoke the callback once the event has
-  // been handled.
-  1: OnChildAttached(uint32 child_key, ViewInfo child_view_info) -> ();
-
-  // Called when a child view has become unavailable.
-  //
-  // A child may become unavailable for many reasons such being unregistered
-  // by its application, abnormal termination of its application, or
-  // cycles being introduced in the view tree.
-  //
-  // To complete removal of an unavailable child, this view component must
-  // call RemoveChild() on its view with |child_key|.
-  //
-  // The implementation should invoke the callback once the event has
-  // been handled.
-  2: OnChildUnavailable(uint32 child_key) -> ();
-
-  // TODO(jeffbrown): Once we figure out measurement, add a |OnChildResized|
-  // event or similar to allow the container to get the size along with the
-  // scene version.
-};
-
-// Provides embedding information about a view for use by its container.
-//
-// This information is valid until the container removes the view.
-struct ViewInfo {
-  // There is currently no information here but we have preserved the
-  // plumbing for now.  May remove later.
-  uint8 dummy;
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_manager.fidl b/fidl/fuchsia.ui.viewsv1/view_manager.fidl
deleted file mode 100644
index 5013d8b..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_manager.fidl
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.ui.scenic;
-using fuchsia.ui.viewsv1token;
-
-// Maximum length for a view or view tree label.
-const uint32 kLabelMaxLength = 32;
-
-// The view manager manages trees of views which represent user interface
-// components.
-//
-// Applications create views to describe user interface components
-// to present content to the user and support user interaction.
-//
-// The system creates a view tree to hold the root of a view hierarchy
-// containing views from various applications.
-//
-// Refer to |View| and |ViewTree| for more information about these objects.
-[Discoverable]
-interface ViewManager {
-
-  // Gets the scenic instance associated with this view manager.
-  // All graphical content for this view manager's views and view trees
-  // must come from sessions created by this |scenic| instance.
-  1: GetScenic(request<fuchsia.ui.scenic.Scenic> scenic);
-
-  // Creates a view.
-  //
-  // The |view| is used to configure the view and interact with its
-  // local environment.
-  //
-  // The |view_owner| is used as a transferable reference which can
-  // be passed to the view's intended container as part of a request to
-  // add the view as a child.  The view manager itself does not describe
-  // how this interaction should take place, only that ownership should
-  // eventually be passed back through the container's view interface
-  // as an argument to |View.AddChild()|.
-  //
-  // The |view_listener| is used to receive events from the view.
-  //
-  // The |label| is an optional name to associate with the view for
-  // diagnostic purposes.  The label will be truncated if it is longer
-  // than |kLabelMaxLength|.
-  //
-  // |parent_export_token| is an export token which the view manager
-  // will use to export the node to which the view's content should be
-  // attached.
-  //
-  // To present graphical content, the view must obtain a |Session| from
-  // |Mozart|, create an event pair, bind one endpoint to an
-  // |ImportResourceOp| using |ImportSpec.NODE|, attach its content nodes as
-  // descendants of the imported node, and pass the other endpoint of the
-  // event pair to this method as |parent_export_token|.
-  //
-  // To destroy the view and cause it to be removed from the view tree,
-  // simply close the |view|, |view_listener|, or |view_owner| channels.
-  //
-  // This method is deprecated in favor of the eventpair-based one below.
-  // TODO(SCN-1018): Remove this.
-  2: CreateView(request<View> view,
-               request<fuchsia.ui.viewsv1token.ViewOwner> view_owner,
-               ViewListener view_listener,
-               handle<eventpair> parent_export_token,
-               string? label);
-
-  3: CreateView2(request<View> view,
-                handle<eventpair> view_token,
-                ViewListener view_listener,
-                handle<eventpair> parent_export_token,
-                string? label);
-
-  // Creates a view tree.
-  //
-  // The |view_tree| is used to configure the view tree and interact
-  // with the views it contains.
-  //
-  // The |view_tree_listener| is used to receive events from the view tree.
-  //
-  // The |label| is an optional name to associate with the view tree for
-  // diagnostic purposes.  The label will be truncated if it is longer
-  // than |kLabelMaxLength|.
-  //
-  // To destroy the view tree simply close the |view_tree| or
-  // |view_tree_listener| channels.
-  4: CreateViewTree(request<ViewTree> view_tree,
-                   ViewTreeListener view_tree_listener,
-                   string? label);
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_properties.fidl b/fidl/fuchsia.ui.viewsv1/view_properties.fidl
deleted file mode 100644
index 3d106a1..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_properties.fidl
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.math;
-
-// Parameters and contextual information for a view provided by its container.
-//
-// When a container sets properties for its children, any properties which
-// are set to null are inherited from the container's own ancestors.
-struct ViewProperties {
-  ViewLayout? view_layout;
-  CustomFocusBehavior? custom_focus_behavior;
-};
-
-struct CustomFocusBehavior {
-  bool allow_focus = true;
-};
-
-// Provides layout constraints for a view.
-//
-// TODO(jeffbrown): Decide how measurement should be performed.  Perhaps
-// bring back |BoxConstraints| or introduce some other protocol just for
-// measurement.
-struct ViewLayout {
-  // The size of the view in logical pixels.
-  // Must be non-negative.
-  fuchsia.math.SizeF size;
-
-  // The inset of the view in logical pixels.
-  // Must be non-negative.
-  fuchsia.math.InsetF inset;
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_provider.fidl b/fidl/fuchsia.ui.viewsv1/view_provider.fidl
deleted file mode 100644
index 0545653..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_provider.fidl
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.sys;
-using fuchsia.ui.viewsv1token;
-
-// Provides a View upon request.
-//
-// Applications should implement and expose this service so that they can
-// expose views to be embedded into other applications.
-[Discoverable]
-interface ViewProvider {
-  // Creates and registers a view with the view manager and returns its
-  // view owner which may subsequently be passed to |View.AddChild()|
-  // to attach the view to a view hierarchy.
-  //
-  // Implementors of this interface are responsible for creating the view
-  // and forwarding the |view_owner| interface request to
-  // |ViewManager.CreateView()|.
-  //
-  // The caller may request services from the created view via the |services|
-  // service provider.
-  1: CreateView(request<fuchsia.ui.viewsv1token.ViewOwner> view_owner,
-               request<fuchsia.sys.ServiceProvider>? services);
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_snapshot.fidl b/fidl/fuchsia.ui.viewsv1/view_snapshot.fidl
deleted file mode 100644
index a5100d4..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_snapshot.fidl
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.ui.viewsv1token;
-using fuchsia.mem;
-
-// Defines an interface to take view snapshots.
-[Discoverable]
-interface ViewSnapshot {
-  // TODO(SCN-1019): Use zx::eventpair instead of koid.
-  // Takes a snapshot of a view and returns it in a callback.
-  //
-  // The |view_koid| identifies the view whose snapshot needs to be taken.
-  //
-  // The callback is invoked with the VMO buffer containing the snapshot.
-  // If successful, the buffer size is non-zero, otherwise it is 0.
-  1: TakeSnapshot(uint64 view_koid) ->
-                  (fuchsia.mem.Buffer snapshot);
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_tree_token.fidl b/fidl/fuchsia.ui.viewsv1/view_tree_token.fidl
deleted file mode 100644
index 3fb8a7a..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_tree_token.fidl
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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.
-
-library fuchsia.ui.viewsv1;
-
-// A view tree token is an opaque transferable reference to a view tree.
-//
-// The ViewManager provides each view tree with a unique view tree token when
-// it is registered.  The token can subsequently be passed to other
-// applications and used as a way to refer to the tree.
-//
-// View tree tokens should be kept secret and should only be shared with
-// trusted services.
-//
-// TODO(jeffbrown): This implementation is a temporary placeholder until
-// we provide a way to create tokens which cannot be forged.
-struct ViewTreeToken {
-  uint32 value;
-};
diff --git a/fidl/fuchsia.ui.viewsv1/view_trees.fidl b/fidl/fuchsia.ui.viewsv1/view_trees.fidl
deleted file mode 100644
index 7a159bf..0000000
--- a/fidl/fuchsia.ui.viewsv1/view_trees.fidl
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.sys;
-
-// A view tree is a top-level container for a hierarchy of views.
-// Each view is intended to operate independently from others and will
-// generally correspond to discrete interactive spaces such as separate
-// displays or isolated environments in a multi-user system.
-//
-// Within a view tree, certain global invariants may be enforced such as
-// ensuring that only one view has focus at a time.
-//
-// View trees will typically be created by system components responsible
-// for managing the overall user interface rather than end-user applications.
-//
-// LIFECYCLE
-//
-// Use |ViewManager.CreateViewTree()| to create a view tree.  The client
-// uses the |ViewTree| interface to manage the view tree's content
-// and implements the |ViewTreeListener| interface to handle events.
-//
-// To destroy a view tree, simply close the |ViewTree| channel.
-//
-// SETTING A ROOT VIEW
-//
-// Use |GetContainer()| to obtain an interface for manipulating the root view.
-//
-// See |ViewContainer| for more information.
-//
-// GETTING SERVICES
-//
-// The view tree's |fuchsia::sys::ServiceProvider| offers access to many services
-// which are not directly expressed by the |ViewTree| interface itself, such
-// as input, accessiblity, and editing capabilities.
-//
-// For example, perform the following actions to dispatch input events:
-//
-// 1. Call |GetServiceProvider()| to obtain the view's service provider.
-//
-// 2. Ask the service provider for its |InputDispatcher|.
-//
-// 3. Send input events to the dispatcher for delivery to views.
-interface ViewTree {
-  // Gets the view tree's token.
-  1: GetToken() -> (ViewTreeToken token);
-
-  // Gets a service provider to access services which are associated with
-  // the view tree such as input, accessibility and editing capabilities.
-  // The view tree service provider is private to the view tree and should
-  // not be shared with anyone else.
-  //
-  // See |InputDispatcher|.
-  2: GetServiceProvider(request<fuchsia.sys.ServiceProvider> service_provider);
-
-  // Gets an interface for managing the view tree's root.
-  3: GetContainer(request<ViewContainer> container);
-};
-
-// An interface clients may implement to receive events from a view tree.
-interface ViewTreeListener {
-  // There are currently no events defined but we have preserved the
-  // plumbing for the future when ViewContainer will merge into ViewTree
-  // along with its listener.
-};
diff --git a/fidl/fuchsia.ui.viewsv1/views.fidl b/fidl/fuchsia.ui.viewsv1/views.fidl
deleted file mode 100644
index 09cc345..0000000
--- a/fidl/fuchsia.ui.viewsv1/views.fidl
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2015 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.
-
-library fuchsia.ui.viewsv1;
-
-using fuchsia.sys;
-using fuchsia.ui.viewsv1token;
-
-// A view is a graphical user interface component which is responsible
-// for drawing and supporting user interactions in the area of the screen
-// that it occupies.
-//
-// A view may also act as a container for other views (known as the
-// view's children) which it may freely layout and position anywhere
-// within its bounds to form a composite user interface.  The hierarchy
-// of views thus formed is called a view tree.
-//
-// LIFECYCLE
-//
-// Use |ViewManager.CreateView()| to create a view.  The application
-// uses the |View| interface to manage the view's content and implements
-// the |ViewListener| interface to handle events.
-//
-// To destroy a view, simply close the |View| channel.
-//
-// ADDING CHILD VIEWS
-//
-// Use |GetContainer()| to obtain an interface for manipulating child views.
-//
-// See |ViewContainer| for more information.
-//
-// GETTING SERVICES
-//
-// The view's |fuchsia::sys::ServiceProvider| offers access to many services which
-// are not directly expressed by the |View| interface itself, such
-// as input, accessiblity, and editing capabilities.
-//
-// For example, perform the following actions to receive input events:
-//
-// 1. Call |GetServiceProvider()| to obtain the view's service provider.
-//
-// 2. Ask the service provider for its |InputConnection|.
-//
-// 3. Set listeners on the input connection to receive events.
-interface View {
-  // Gets a service provider to access services which are associated with
-  // the view such as input, accessibility and editing capabilities.
-  // The view service provider is private to the view and should not be
-  // shared with anyone else.
-  //
-  // See |InputConnection|.
-  1: GetServiceProvider(request<fuchsia.sys.ServiceProvider> service_provider);
-
-  // This is a way for an app to offer services that are associated with a
-  // particular view. Used to expose services to the compositor
-  //
-  // In particular this should be used to let know which view is implementing
-  // the ability to show an IME
-  //
-  // |service_names| should contain a list of service names as defined with the
-  // FIDL syntax [Discoverable]
-  //
-  // The list of services will be used by the compositor to filter service
-  // providers when looking for a particular service.
-  2: OfferServiceProvider(fuchsia.sys.ServiceProvider service_provider,
-                         vector<string> service_names);
-
-  // Gets an interface for managing the view's children.
-  3: GetContainer(request<ViewContainer> container);
-};
-
-// An interface clients may implement to receive events from a view.
-interface ViewListener {
-  // Called when the view receives new properties from its ancestors.
-  // Initially the view has no properties so this method will be called
-  // as soon as properties first become available and whenever they change
-  // thereafter.
-  1: OnPropertiesChanged(ViewProperties properties) -> ();
-};
diff --git a/fidl/fuchsia.ui.viewsv1token/meta.json b/fidl/fuchsia.ui.viewsv1token/meta.json
deleted file mode 100644
index 37151df..0000000
--- a/fidl/fuchsia.ui.viewsv1token/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.ui.viewsv1token/view_token.fidl"
-  ], 
-  "name": "fuchsia.ui.viewsv1token", 
-  "root": "fidl/fuchsia.ui.viewsv1token", 
-  "sources": [
-    "fidl/fuchsia.ui.viewsv1token/view_token.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.ui.viewsv1token/view_token.fidl b/fidl/fuchsia.ui.viewsv1token/view_token.fidl
deleted file mode 100644
index 005b36b..0000000
--- a/fidl/fuchsia.ui.viewsv1token/view_token.fidl
+++ /dev/null
@@ -1,11 +0,0 @@
-// 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.
-
-library fuchsia.ui.viewsv1token;
-
-// A view owner allows linking its associated view into a view hierarchy.
-//
-// This interface is only intended to be used as a token, analogous to how
-// Scenic View/ViewHolder resources use eventpairs as tokens.
-interface ViewOwner {};
diff --git a/fidl/fuchsia.wlan.minstrel/meta.json b/fidl/fuchsia.wlan.minstrel/meta.json
deleted file mode 100644
index 544ee40..0000000
--- a/fidl/fuchsia.wlan.minstrel/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl"
-  ], 
-  "name": "fuchsia.wlan.minstrel", 
-  "root": "fidl/fuchsia.wlan.minstrel", 
-  "sources": [
-    "fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl b/fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl
deleted file mode 100644
index 7e1cbd1..0000000
--- a/fidl/fuchsia.wlan.minstrel/wlan_minstrel.fidl
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-library fuchsia.wlan.minstrel;
-
-struct Peers {
-    vector<array<uint8>:6> peers;
-};
-
-// LINT.IfChange
-struct StatsEntry {
-    uint16 tx_vector_idx;
-    string tx_vec_desc;
-    uint64 success_cur;
-    uint64 attempts_cur;
-    float32 probability;
-    float32 cur_tp;
-    uint64 success_total;
-    uint64 attempts_total;
-    uint64 probes_total;
-};
-
-struct Peer {
-    array<uint8>:6 mac_addr;
-    uint16 max_tp;
-    uint16 max_probability;
-    uint16 basic_highest;
-    uint16 basic_max_probability;
-    uint64 probes;
-    vector<StatsEntry> entries;
-};
-// LINT.ThenChange(//garnet/drivers/wlan/wlan/minstrel.h)
diff --git a/fidl/fuchsia.wlan.mlme/meta.json b/fidl/fuchsia.wlan.mlme/meta.json
deleted file mode 100644
index 58c5962..0000000
--- a/fidl/fuchsia.wlan.mlme/meta.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "deps": [
-    "fuchsia.wlan.stats", 
-    "fuchsia.wlan.minstrel"
-  ], 
-  "files": [
-    "fidl/fuchsia.wlan.mlme/wlan_mlme.fidl", 
-    "fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl"
-  ], 
-  "name": "fuchsia.wlan.mlme", 
-  "root": "fidl/fuchsia.wlan.mlme", 
-  "sources": [
-    "fidl/fuchsia.wlan.mlme/wlan_mlme.fidl", 
-    "fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.wlan.mlme/wlan_mlme.fidl b/fidl/fuchsia.wlan.mlme/wlan_mlme.fidl
deleted file mode 100644
index 0f731c0..0000000
--- a/fidl/fuchsia.wlan.mlme/wlan_mlme.fidl
+++ /dev/null
@@ -1,934 +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.
-
-library fuchsia.wlan.mlme;
-
-// Stub types for communicating between the wlan service and the MLME drivers. Based on the 802.11
-// MLME SAP interface (IEEE Std 802.11-2016 section 6.3).
-
-// TODO(NET-631): restore the commented out enum aliases
-
-// MLME-SCAN.request (IEEE Std 802.11-2016 6.3.3.2)
-
-enum BSSTypes {
-    INFRASTRUCTURE = 1;
-    PERSONAL = 2;
-    INDEPENDENT = 3;
-    MESH = 4;
-    ANY_BSS = 5;
-    //LAST = ANY_BSS;
-};
-
-enum ScanTypes {
-    ACTIVE = 1;
-    PASSIVE = 2;
-    //LAST = PASSIVE;
-};
-
-// LINT analyzer keyword intended for humans:
-// LINT.IfChange
-
-enum PHY {
-    HR = 1;   // IEEE 802.11b, used for DSSS, HR/DSSS, ERP-DSSS/CCK
-    ERP = 2;  // IEEE 802.11a/g, used for ERP-OFDM
-    HT = 3;   // IEEE 802.11n
-    VHT = 4;  // IEEE 802.11ac
-    HEW = 5;  // IEEE 802.11ax
-};
-
-enum CBW {	// Channel Bandwidth
-    CBW20 = 0;
-    CBW40 = 1;
-    //CBW40ABOVE = CBW40;
-    CBW40BELOW = 2;
-    CBW80 = 3;
-    CBW160 = 4;
-    CBW80P80 = 5;
-
-    CBW_COUNT = 6;
-};
-
-struct WlanChan {
-    uint8 primary;
-    CBW cbw;
-    uint8 secondary80;
-};
-
-enum Band : uint8 {
-    WLAN_BAND_2GHZ = 0;
-    WLAN_BAND_5GHZ = 1;
-    WLAN_BAND_COUNT = 2;
-};
-
-// LINT.ThenChange(//garnet/lib/wlan/protocol/include/wlan/protocol/info.h)
-
-struct ScanRequest {
-    uint64 txn_id;
-    BSSTypes bss_type;
-    array<uint8>:6 bssid;
-    vector<uint8>:32 ssid;
-    ScanTypes scan_type;
-    uint32 probe_delay;  // in TimeUnits
-    vector<uint8>? channel_list;
-    uint32 min_channel_time;  // in TimeUnits
-    uint32 max_channel_time;  // in TimeUnits
-    // RequestInformation
-    vector<vector<uint8>:32>? ssid_list;
-    // ChannelUsage
-    // AccessNetworkType
-    // HESSID
-    // Mesh ID
-    // DiscoveryMode
-    // VendorSpecificInfo
-};
-
-
-// MLME-SCAN.confirm (IEEE Std 802.11-2016 6.3.3.3)
-
-// IEEE Std 802.11-2016, 9.4.1.4
-struct CapabilityInfo {
-    bool ess;
-    bool ibss;
-    bool cf_pollable;
-    bool cf_poll_req;
-    bool privacy;
-    bool short_preamble;
-    bool spectrum_mgmt;
-    bool qos;
-    bool short_slot_time;
-    bool apsd;
-    bool radio_msmt;
-    bool delayed_block_ack;
-    bool immediate_block_ack;
-};
-
-// IEEE Std 802.11-2016, 9.4.2.56
-
-enum ChanWidthSet : uint8 {
-    TWENTY_ONLY = 0;
-    TWENTY_FORTY = 1;
-};
-
-enum SmPowerSave : uint8 {
-    STATIC = 0;
-    DYNAMIC = 1;
-    RESERVED = 2;
-    DISABLED = 3;
-};
-
-enum MaxAmsduLen : uint8 {
-    OCTETS_3839 = 0;
-    OCTETS_7935 = 1;
-};
-
-struct HtCapabilityInfo {
-    bool ldpc_coding_cap;
-    uint8 chan_width_set; // see enum ChanWidthSet
-    uint8 sm_power_save; // see enum SmPowerSave
-    bool greenfield;
-    bool short_gi_20;
-    bool short_gi_40;
-    bool tx_stbc;
-    uint8 rx_stbc;
-    bool delayed_block_ack;
-    uint8 max_amsdu_len; // see enum MaxAmsduLen
-    bool dsss_in_40;
-    bool intolerant_40;
-    bool lsig_txop_protect;
-};
-
-enum MinMpduStartSpacing : uint8 {
-    NO_RESTRICT = 0;
-    QUARTER_USEC = 1;
-    HALF_USEC = 2;
-    ONE_USEC = 3;
-    TWO_USEC = 4;
-    FOUR_USEC = 5;
-    EIGHT_USEC = 6;
-    SIXTEEN_USEC = 7;
-};
-
-struct AmpduParams {
-    uint8 exponent;
-    uint8 min_start_spacing; // see enum MinMpduStartSpacing
-};
-
-// SupportedMcsSet
-// IEEE Std 802.11-2016, 9.4.2.56.4 Table 9-164
-struct SupportedMcsSet {
-    // Names are deviated from //garnet/lib/wlan/common/include/wlan/common/element.h's class SupportedMcsSet
-    uint64 rx_mcs_set; // bitmask indicating MCS 0-63 support
-    // MCS 64-76 not supported
-    uint16 rx_highest_rate; // Mbps
-    bool tx_mcs_set_defined;
-    bool tx_rx_diff;
-    uint8 tx_max_ss; // Actual count, different from IEEE spec
-    bool tx_ueqm; // Transmit Unequal Modulation
-};
-
-// HtExtCapabilities
-// IEEE Std 802.11-2016, 9.4.2.56.5 Table 9-165
-enum PcoTransitionTime : uint8 {
-    PCO_RESERVED = 0;  // Often translated as "No transition".
-    PCO_400_USEC = 1;
-    PCO_1500_USEC = 2;
-    PCO_5000_USEC = 3;
-};
-
-enum McsFeedback : uint8 {
-    MCS_NOFEEDBACK = 0;
-    MCS_RESERVED = 1;
-    MCS_UNSOLICIED = 2;
-    MCS_BOTH = 3;
-};
-
-struct HtExtCapabilities {
-    bool pco;
-    uint8 pco_transition; // see enum PcoTransitionTime
-    uint8 mcs_feedback; // see enum McsFeedback
-    bool htc_ht_support;
-    bool rd_responder;
-};
-
-// TxBfCapability
-// IEEE Std 802.11-2016, 9.4.2.56.6 Table 9-166
-enum Calibration : uint8 {
-    CALIBRATION_NONE = 0;
-    CALIBRATION_RESPOND_NOINITIATE = 1;
-    CALIBRATION_RESERVED = 2;
-    CALIBRATION_RESPOND_INITIATE = 3;
-};
-
-enum Feedback : uint8 {
-    // Shared for csi_feedback, noncomp_feedback, comp_feedback
-    FEEDBACK_NONE = 0;
-    FEEDBACK_DELAYED = 1;
-    FEEDBACK_IMMEDIATE = 2;
-    FEEDBACK_DELAYED_IMMEDIATE = 3;
-};
-
-enum MinGroup : uint8 {
-    MIN_GROUP_ONE = 0;  // Meaning no grouping
-    MIN_GROUP_ONE_TWO = 1;
-    MIN_GROUP_ONE_FOUR = 2;
-    MIN_GROUP_ONE_TWO_FOUR = 3;
-};
-
-struct TxBfCapability {
-    bool implicit_rx;
-    bool rx_stag_sounding;
-    bool tx_stag_sounding;
-    bool rx_ndp;
-    bool tx_ndp;
-    bool implicit;
-    uint8 calibration; // see enum Calibration
-    bool csi; // Explicit CsI Transmit Beamforming
-    bool noncomp_steering; // Explicit Noncompressed Steering
-    bool comp_steering; // Explicit Compressed Steering
-    uint8 csi_feedback; // see enum Feedback
-    uint8 noncomp_feedback; // see enum Feedback
-    uint8 comp_feedback; // see enum Feedback
-    uint8 min_grouping; // see enum MinGroup
-    uint8 csi_antennas;          // Actual count, different from IEEE spec
-    uint8 noncomp_steering_ants; // Actual count, different from IEEE spec
-    uint8 comp_steering_ants;    // Actual count, different from IEEE spec
-    uint8 csi_rows;              // Actual count, different from IEEE spec
-    uint8 chan_estimation;       // Actual count, different from IEEE spec
-};
-
-// IEEE Std 802.11-2016, 9.4.2.56.7 Table 9-167
-struct AselCapability {
-    bool asel;
-    bool csi_feedback_tx_asel; // Explicit CSI Feedback Based Transmit ASEL
-    bool ant_idx_feedback_tx_asel;
-    bool explicit_csi_feedback;
-    bool antenna_idx_feedback;
-    bool rx_asel;
-    bool tx_sounding_ppdu;
-};
-
-struct HtCapabilities {
-    // Note, a minimum granuality of adding fields selectively is
-    // a group of BitField structure, as defined in element.h
-    HtCapabilityInfo ht_cap_info;
-    AmpduParams ampdu_params;
-    SupportedMcsSet mcs_set;
-    HtExtCapabilities ht_ext_cap;
-    TxBfCapability txbf_cap;
-    AselCapability asel_cap;
-};
-
-// HT Operation Element
-// IEEE Std 802.11-2016 9.4.2.57 Table 9-168
-
-// HTOperationInfo
-enum SecChanOffset : uint8 {
-    SECONDARY_NONE = 0;   // No secondary channel
-    SECONDARY_ABOVE = 1;  // Secondary channel is above the primary channel
-    RESERVED = 2;
-    SECONDARY_BELOW = 3;  // Secondary channel is below the primary channel
-};
-
-enum StaChanWidth : uint8 {
-    TWENTY = 0;  // 20 MHz
-    ANY = 1;     // Any in the Supported Channel Width set
-};
-
-enum HtProtect : uint8 {
-    NONE = 0;
-    NONMEMBER = 1;
-    TWENTY_MHZ = 2;
-    NON_HT_MIXED = 3;
-};
-
-struct HTOperationInfo {
-    uint8 secondary_chan_offset; // see enum SecChanOffset
-    uint8 sta_chan_width; // see enum StaChanWidth
-    bool rifs_mode;
-    uint8 ht_protect; // see enum HtProtect
-    bool nongreenfield_present; // Nongreenfield HT STAs present
-    bool obss_non_ht;           // OBSS Non-HT STAs present
-    uint8 center_freq_seg2;    // VHT
-    bool dual_beacon;
-    bool dual_cts_protect;
-    bool stbc_beacon;
-    bool lsig_txop_protect;
-    bool pco_active;
-    bool pco_phase;
-};
-
-struct HtOperation {
-    uint8 primary_chan;                 // Primary 20 MHz channel.
-    HTOperationInfo ht_op_info;
-    SupportedMcsSet basic_mcs_set;
-};
-
-enum MaxMpduLen : uint8 {
-    OCTETS_3895 = 0;
-    OCTETS_7991 = 1;
-    OCTETS_11454 = 2;
-};
-
-enum VhtLinkAdaptation : uint8 {
-    NO_FEEDBACK = 0;
-    // 1 reserved
-    UNSOLICITED = 2;
-    BOTH = 3;
-};
-
-// IEEE Std 802.11-2016, 9.4.2.158.2
-struct VhtCapabilitiesInfo {
-    uint8 max_mpdu_len; // see enum MaxMpduLen
-    uint8 supported_cbw_set;
-    bool rx_ldpc;
-    bool sgi_cbw80;
-    bool sgi_cbw160;
-    bool tx_stbc;
-    uint8 rx_stbc; // number of spatial streams supported. [0, 4] are valid. [5, 7] are reserved.
-    bool su_bfer;
-    bool su_bfee;
-    uint8 bfee_sts; // Maximum number of STS - 1, if su_bfee is true. Reserved otherwise.
-    uint8 num_sounding;
-    bool mu_bfer;
-    bool mu_bfee;
-    bool txop_ps;
-    bool htc_vht;
-    uint8 max_ampdu_exp;
-    uint8 link_adapt; // see enum VhtLinkAdaptation
-    bool rx_ant_pattern;
-    bool tx_ant_pattern;
-    uint8 ext_nss_bw;
-};
-
-enum VhtMcs : uint8 {
-    SET_0_TO_7 = 0;
-    SET_0_TO_8 = 1;
-    SET_0_TO_9 = 2;
-    SET_NONE = 3;
-};
-
-// IEEE Std 802.11-2016 9.4.2.158.3
-struct VhtMcsNss {
-    array<uint8>:8 rx_max_mcs;  // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
-    uint16 rx_max_data_rate;     // Mbps
-    uint8 max_nsts;
-
-    array<uint8>:8 tx_max_mcs; // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
-    uint16 tx_max_data_rate;    // Mbps
-    bool ext_nss_bw;
-};
-
-// IEEE Std 802.11-2016, Figure 9-562
-struct BasicVhtMcsNss {
-    array<uint8>:8 max_mcs; // idx 0 for ss1, .. idx 7 for ss8. See enum VhtMcs
-};
-
-// IEEE Std 802.11-2016 9.5.2.158
-struct VhtCapabilities {
-    VhtCapabilitiesInfo vht_cap_info;
-    VhtMcsNss vht_mcs_nss;
-};
-
-// IEEE Std 802.11-2016 deprecates the use of CBW_160, CBW_80P80
-enum VhtCbw : uint8 {
-    CBW_20_40 = 0;
-    CBW_80_160_80P80 = 1;
-    CBW_160 = 2;
-    CBW_80P80 = 3;
-};
-
-// IEEE Std 802.11-2016 9.5.2.159
-struct VhtOperation {
-    uint8 vht_cbw; // see enum VhtCbw
-    uint8 center_freq_seg0;  // channel number
-    uint8 center_freq_seg1;  // channel number
-    BasicVhtMcsNss basic_mcs;
-};
-
-// IEEE Std 802.11-2016 6.3.3.3.2
-struct BSSDescription {
-    array<uint8>:6 bssid;
-
-    vector<uint8>:32 ssid;
-
-    BSSTypes bss_type;
-    uint16 beacon_period;  // in TU
-    uint8 dtim_period;
-    uint64 timestamp;
-    uint64 local_time;
-
-    CapabilityInfo cap;
-    vector<uint8> basic_rate_set;  // in 0.5 Mbps, valid value: 1-127. See Table 9-78 for 126, 127.
-    vector<uint8> op_rate_set;     // in 0.5 Mbps, valid value: 1-127. See Table 9-78 for 126, 127.
-    vector<uint8>? country;
-
-    // TODO(hahnr): This field represents an IE and should thus be named RSNE.
-    vector<uint8>? rsn;
-
-    int16 rcpi_dbmh; // 0.5 step dBm. Do not use encoding from IEEE Std 802.11-2016 9.4.2.38.
-    int16 rsni_dbh;  // 0.5 step dB.  Do not use encoding from IEEE Std 802.11-2016 9.4.2.41.
-
-    HtCapabilities? ht_cap;
-    HtOperation? ht_op;
-
-    VhtCapabilities? vht_cap;
-    VhtOperation? vht_op;
-
-    // List up non-standard, Fuchsia only parameters
-    WlanChan chan;
-    int8 rssi_dbm;   // dBm
-};
-
-enum ScanResultCodes {
-    SUCCESS = 0;
-    NOT_SUPPORTED = 1;
-    INVALID_ARGS = 2;
-    INTERNAL_ERROR = 3;
-};
-
-struct ScanResult {
-    uint64 txn_id;
-    BSSDescription bss;
-};
-
-struct ScanEnd {
-    uint64 txn_id;
-    ScanResultCodes code;
-};
-
-// MLME-JOIN.request (IEEE Std 802.11-2016, 6.3.4.2)
-
-struct JoinRequest {
-    BSSDescription selected_bss;
-    uint32 join_failure_timeout;
-    uint32 nav_sync_delay;
-    vector<uint16> op_rate_set;
-
-    // Combined with what MLME knows about the device capabilities,
-    // following parameters determine what to be advertised to the peer
-    // (in AssociationRequest). Effectively this way replaces the following
-    // fields originally defined in MLME-JOIN.request
-    // - Capability Information
-    // - HT Capabilities
-    // - VHT Capabilities
-    // - Extended Capabilities
-    PHY phy;
-    CBW cbw;
-};
-
-// MLME-JOIN.confirm (IEEE Std 802.11-2016, 6.3.4.3)
-
-enum JoinResultCodes {
-    SUCCESS = 0;
-    JOIN_FAILURE_TIMEOUT = 1;
-    //LAST = JOIN_FAILURE_TIMEOUT;
-};
-
-struct JoinConfirm {
-    JoinResultCodes result_code;
-};
-
-// MLME-AUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.5.2)
-
-enum AuthenticationTypes {
-    OPEN_SYSTEM = 1;
-    SHARED_KEY = 2;
-    FAST_BSS_TRANSITION = 3;
-    SAE = 4;
-    //LAST = SAE;
-};
-
-struct AuthenticateRequest {
-    array<uint8>:6 peer_sta_address;
-    AuthenticationTypes auth_type;
-    uint32 auth_failure_timeout;
-
-    // etc
-};
-
-// MLME-AUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.5.3)
-
-enum AuthenticateResultCodes {
-    SUCCESS = 0;
-    REFUSED = 1;
-    ANTI_CLOGGING_TOKEN_REQUIRED = 2;
-    FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 3;
-    AUTHENTICATION_REJECTED = 4;
-    AUTH_FAILURE_TIMEOUT = 5;
-    //LAST = AUTH_FAILURE_TIMEOUT;
-};
-
-struct AuthenticateConfirm {
-    array<uint8>:6 peer_sta_address;
-    AuthenticationTypes auth_type;
-    AuthenticateResultCodes result_code;
-
-    // etc
-};
-
-// MLME-AUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.5.4)
-
-struct AuthenticateIndication {
-  array<uint8>:6 peer_sta_address;
-  AuthenticationTypes auth_type;
-
-  // etc
-};
-
-// MLME-AUTHENTICATE.response (IEEE Std 802.11-2016, 6.3.5.5)
-
-struct AuthenticateResponse {
-  array<uint8>:6 peer_sta_address;
-  AuthenticateResultCodes result_code;
-
-  // etc
-};
-
-// MLME-DEAUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.6.2)
-
-// IEEE Std 802.11-2016, 9.4.1.7, Table 9-45
-enum ReasonCode : uint16 {
-    // 0 Reserved
-    UNSPECIFIED_REASON = 1;
-    INVALID_AUTHENTICATION = 2;
-    LEAVING_NETWORK_DEAUTH = 3;
-    REASON_INACTIVITY = 4;
-    NO_MORE_STAS = 5;
-    INVALID_CLASS2_FRAME = 6;
-    INVALID_CLASS3_FRAME = 7;
-    LEAVING_NETWORK_DISASSOC = 8;
-    NOT_AUTHENTICATED = 9;
-    UNACCEPTABLE_POWER_CA = 10;
-    UNACCEPTABLE_SUPPORTED_CHANNELS = 11;
-    BSS_TRANSITION_DISASSOC = 12;
-    REASON_INVALID_ELEMENT = 13;
-    MIC_FAILURE = 14;
-    FOURWAY_HANDSHAKE_TIMEOUT = 15;
-    GK_HANDSHAKE_TIMEOUT = 16;
-    HANDSHAKE_ELEMENT_MISMATCH = 17;
-    REASON_INVALID_GROUP_CIPHER = 18;
-    REASON_INVALID_PAIRWISE_CIPHER = 19;
-    REASON_INVALID_AKMP = 20;
-    UNSUPPORTED_RSNE_VERSION = 21;
-    INVALID_RSNE_CAPABILITIES = 22;
-    IEEE802_1_X_AUTH_FAILED = 23;
-    REASON_CIPHER_OUT_OF_POLICY = 24;
-    TDLS_PEER_UNREACHABLE = 25;
-    TDLS_UNSPECIFIED_REASON = 26;
-    SSP_REQUESTED_DISASSOC = 27;
-    NO_SSP_ROAMING_AGREEMENT = 28;
-    BAD_CIPHER_OR_AKM = 29;
-    NOT_AUTHORIZED_THIS_LOCATION = 30;
-    SERVICE_CHANGE_PRECLUDES_TS = 31;
-    UNSPECIFIED_QOS_REASON = 32;
-    NOT_ENOUGH_BANDWIDTH = 33;
-    MISSING_ACKS = 34;
-    EXCEEDED_TXOP = 35;
-    STA_LEAVING = 36;
-    // Values 37 and 38 are overloaded but should be clear from context.
-    END_TS_BA_DLS = 37;
-    UNKNOWN_TS_BA = 38;
-    TIMEOUT = 39;
-    // 40-44 Reserved
-    PEERKEY_MISMATCH = 45;
-    PEER_INITIATED = 46;
-    AP_INITIATED = 47;
-    REASON_INVALID_FT_ACTION_FRAME_COUNT = 48;
-    REASON_INVALID_PMKID = 49;
-    REASON_INVALID_MDE = 50;
-    REASON_INVALID_FTE = 51;
-    MESH_PEERING_CANCELED = 52;
-    MESH_MAX_PEERS = 53;
-    MESH_CONFIGURATION_POLICY_VIOLATION = 54;
-    MESH_CLOSE_RCVD = 55;
-    MESH_MAX_RETRIES = 56;
-    MESH_CONFIRM_TIMEOUT = 57;
-    MESH_INVALID_GTK = 58;
-    MESH_INCONSISTENT_PARAMETERS = 59;
-    MESH_INVALID_SECURITY_CAPABILITY = 60;
-    MESH_PATH_ERROR_NO_PROXY_INFORMATION = 61;
-    MESH_PATH_ERROR_NO_FORWARDING_INFORMATION = 62;
-    MESH_PATH_ERROR_DESTINATION_UNREACHABLE = 63;
-    MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64;
-    MESH_CHANNEL_SWITCH_REGULATORY_REQUIREMENTS = 65;
-    MESH_CHANNEL_SWITCH_UNSPECIFIED = 66;
-    // 67 - 65535 Reserved
-};
-
-struct DeauthenticateRequest {
-    array <uint8>:6 peer_sta_address;
-    // TODO(tkilbourn): define a ReasonCode enum for FIDL
-    ReasonCode reason_code;
-    // VendorSpecificInfo
-};
-
-// MLME-DEAUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.6.3)
-
-struct DeauthenticateConfirm {
-    array <uint8>:6 peer_sta_address;
-};
-
-// MLME-DEAUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.6.4)
-
-struct DeauthenticateIndication {
-    array<uint8>:6 peer_sta_address;
-    // TODO(tkilbourn): define a ReasonCode enum for FIDL
-    ReasonCode reason_code;
-    // VendorSpecificInfo
-};
-
-// MLME-ASSOCIATE.request (IEEE Std 802.11-2016, 6.3.7.2)
-
-struct AssociateRequest {
-    array<uint8>:6 peer_sta_address;
-    // TODO(hahnr): This field represents an IE and should thus be named RSNE.
-    vector<uint8>? rsn;
-
-    // etc
-};
-
-// MLME-ASSOCIATE.confrm (IEEE Std 802.11-2016, 6.3.7.3)
-
-enum AssociateResultCodes {
-    SUCCESS = 0;
-    REFUSED_REASON_UNSPECIFIED = 1;
-    REFUSED_NOT_AUTHENTICATED = 2;
-    REFUSED_CAPABILITIES_MISMATCH = 3;
-    REFUSED_EXTERNAL_REASON = 4;
-    REFUSED_AP_OUT_OF_MEMORY = 5;
-    REFUSED_BASIC_RATES_MISMATCH = 6;
-    REJECTED_EMERGENCY_SERVICES_NOT_SUPPORTED = 7;
-    REFUSED_TEMPORARILY = 8;
-};
-
-struct AssociateConfirm {
-    AssociateResultCodes result_code;
-    // CapabilityInformation
-    uint16 association_id;
-
-    // etc
-};
-
-// MLME-ASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.7.4)
-
-struct AssociateIndication {
-  array<uint8>:6 peer_sta_address;
-  // CapabilityInformation
-  uint16 listen_interval;
-  vector<uint8>? ssid;
-  // OperationalRateSet
-  // BSSMembershipSelectorSet
-  vector<uint8>? rsn;
-
-  // etc
-};
-
-// MLME-ASSOCIATE.response (IEEE Std 802.11-2016, 6.3.7.5)
-
-struct AssociateResponse {
-  array<uint8>:6 peer_sta_address;
-  AssociateResultCodes result_code;
-  uint16 association_id;
-
-  // etc
-};
-
-// MLME-DISASSOCIATE.request (IEEE Std 802.11-2016, 6.3.9.1)
-
-struct DisassociateRequest {
-    array<uint8>:6 peer_sta_address;
-    // TODO(tkilbourn): define a ReasonCode enum for FIDL
-    uint16 reason_code;
-    // VendorSpecificInfo
-};
-
-// MLME-DISASSOCIATE.confirm (IEEE Std 802.11-2016, 6.3.9.2)
-
-struct DisassociateConfirm {
-    int32 status;
-};
-
-// MLME-DISASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.9.3)
-
-struct DisassociateIndication {
-    array<uint8>:6 peer_sta_address;
-    // TODO(tkilbourn): define a ReasonCode enum for FIDL
-    uint16 reason_code;
-    // VendorSpecificInfo
-};
-
-// MLME-RESET.request (IEEE Std 802.11-2016, 6.3.10.2)
-
-struct ResetRequest {
-    array<uint8>:6 sta_address;
-    bool set_default_mib;
-};
-
-// MLME-START.request (IEEE Std 802.11-2016, 6.3.11.2)
-
-struct StartRequest {
-    vector<uint8>:32 ssid;
-    BSSTypes bss_type;
-    uint16 beacon_period;  // in TU
-    uint8 dtim_period;
-
-    // Temporary field to support AP channel selection until
-    // MLME-CHANNELSWITCH.request is supported.
-    uint8 channel;
-
-    vector<uint8>:32 mesh_id;
-
-    // TODO(hahnr): Add additional elements.
-
-    // Although MLME-START.request is used to start a BSS, IEEE does not include an RSNE in this
-    // primitive. However, IEEE doesn't define any other primitive to configure the RSN after its
-    // BSS was started. The RSNE must be available when the BSS is started, and thus, this is the
-    // right place to transfer the RSNE to the MLME.
-    vector<uint8>? rsne;
-};
-
-// MLME-START.confirm (IEEE Std 802.11-2016, 6.3.11.3)
-
-enum StartResultCodes {
-    SUCCESS = 0;
-    BSS_ALREADY_STARTED_OR_JOINED = 1;
-    RESET_REQUIRED_BEFORE_START = 2;
-    NOT_SUPPORTED = 3;
-    INTERNAL_ERROR = 4;
-};
-
-struct StartConfirm {
-    StartResultCodes result_code;
-};
-
-// MLME-STOP.request (IEEE Std 802.11-2016, 6.3.12.2)
-
-struct StopRequest {
-    vector<uint8>:32 ssid;
-};
-
-// MLME-SETKEYS.request (IEEE Std 802.11-2016 6.3.19.1)
-
-
-enum KeyType {
-    GROUP = 1;
-    PAIRWISE = 2;
-    PEER_KEY = 3;
-    IGTK = 4;
-};
-
-struct SetKeyDescriptor {
-    // Specs specify a bit string, we use byte array.
-    vector<uint8> key;
-    uint16 key_id;
-    KeyType key_type;
-    array<uint8>:6 address;
-    array<uint8>:8 rsc;
-    array<uint8>:3 cipher_suite_oui;
-    uint8 cipher_suite_type;
-};
-
-struct SetKeysRequest {
-    vector<SetKeyDescriptor> keylist;
-};
-
-// MLME-DELETEKEYS.request (IEEE Std 802.11-2016 6.3.20.1)
-
-struct DeleteKeyDescriptor {
-  uint16 key_id;
-  KeyType key_type;
-  array<uint8>:6 address;
-};
-
-struct DeleteKeysRequest {
-  vector<DeleteKeyDescriptor> keylist;
-};
-
-// MLME-EAPOL.request (IEEE Std 802.11-2016 6.3.22.1)
-
-struct EapolRequest {
-    array<uint8>:6 src_addr;
-    array<uint8>:6 dst_addr;
-    vector<uint8> data;
-};
-
-// MLME-EAPOL.confirm (IEEE Std 802.11-2016 6.3.22.2)
-
-enum EapolResultCodes {
-    SUCCESS = 0;
-    TRANSMISSION_FAILURE = 1;
-    //LAST = TRANSMISSION_FAILURE;
-};
-
-struct EapolConfirm {
-    EapolResultCodes result_code;
-};
-
-// IEEE Std 802.11-2016, 9.4.2.98
-struct MeshConfiguration {
-    uint8 active_path_sel_proto_id;
-    uint8 active_path_sel_metric_id;
-    uint8 congest_ctrl_method_id;
-    uint8 sync_method_id;
-    uint8 auth_proto_id;
-    uint8 mesh_formation_info;
-    uint8 mesh_capability;
-};
-
-// Fields that are common between the MPM Open and Confirm actions
-struct MeshPeeringCommon {
-    array<uint8>:6 peer_sta_address;
-    uint16 protocol_id;
-    uint16 local_link_id;
-    vector<uint8>:32 mesh_id;
-    vector<uint8> rates;
-    MeshConfiguration mesh_config;
-    HtCapabilities? ht_cap;
-    HtOperation? ht_op;
-    VhtCapabilities? vht_cap;
-    VhtOperation? vht_op;
-};
-
-// IEEE Std 802.11-2016, 9.6.16.2.2
-struct MeshPeeringOpenAction {
-    MeshPeeringCommon common;
-};
-
-// IEEE Std 802.11-2016, 9.6.16.3.2
-struct MeshPeeringConfirmAction {
-    MeshPeeringCommon common;
-    uint16 aid;
-    uint16 peer_link_id;
-};
-
-// Because these methods rely on an external entity to provide a response, events are used instead
-// of return values.
-interface MLME {
-    // ==== 01xxxx: scanning ====
-    // We deviate from the spec here in order to support incremental scan
-    // results easily. We could stay closer to 802.11ai, but the protocol
-    // that is described there is more difficult to implement correctly.
-
-    // Initiate a scan transaction. The caller is responsible for filling
-    // the `txn_id` field in `req` with a unique number that will be used
-    // to identify the transaction.
-    //
-    // Zero or more `OnScanResult` events with a matching `txn_id` will be sent
-    // in response.
-    //
-    // At the end on the transaction, whether it is successful or not,
-    // a `OnScanEnd` event with a matching `txn_id` is guaranteed to be sent
-    // in response (unless the channel is closed first).
-    //
-    // After `OnScanEnd`, no further events with the same `txn_id` shall be sent.
-    010000: StartScan(ScanRequest req);
-
-    // An incremental scan result containing information about a single BSS.
-    // Only one event per unique BSSID per transaction will be sent.
-    010100: -> OnScanResult(ScanResult result);
-
-    // An event that signals the end of a scan transaction.
-    010200: -> OnScanEnd(ScanEnd end);
-
-    // ====
-
-    3: JoinReq(JoinRequest req);
-    4: -> JoinConf(JoinConfirm resp);
-
-    5: AuthenticateReq(AuthenticateRequest req);
-    6: -> AuthenticateConf(AuthenticateConfirm resp);
-
-    7: -> AuthenticateInd(AuthenticateIndication ind);
-    8: AuthenticateResp(AuthenticateResponse resp);
-
-    9: DeauthenticateReq(DeauthenticateRequest req);
-    10: -> DeauthenticateConf(DeauthenticateConfirm resp);
-
-    11: -> DeauthenticateInd(DeauthenticateIndication ind);
-
-    12: AssociateReq(AssociateRequest req);
-    13: -> AssociateConf(AssociateConfirm resp);
-
-    14: -> AssociateInd(AssociateIndication ind);
-    15: AssociateResp(AssociateResponse resp);
-
-    16: DisassociateReq(DisassociateRequest req);
-    17: -> DisassociateConf(DisassociateConfirm resp);
-
-    18: -> DisassociateInd(DisassociateIndication ind);
-
-    19: ResetReq(ResetRequest req);
-
-    20: StartReq(StartRequest req);
-    21: -> StartConf(StartConfirm resp);
-
-    22: StopReq(StopRequest req);
-    23: -> StopConf();
-
-    24: SetKeysReq(SetKeysRequest req);
-
-    25: DeleteKeysReq(DeleteKeysRequest req);
-
-    26: EapolReq(EapolRequest req);
-    27: -> EapolConf(EapolConfirm resp);
-
-    // ==== 90xxxx: Mesh ===
-    900000: -> IncomingMpOpenAction(MeshPeeringOpenAction action);
-    900100: SendMpOpenAction(MeshPeeringOpenAction action);
-    900300: SendMpConfirmAction(MeshPeeringConfirmAction action);
-
-    // The following are extensions to the 802.11 MLME SAP interface.
-
-    0x1001: -> SignalReport(SignalReportIndication ind);
-
-    0x1002: -> EapolInd(EapolIndication ind);
-
-    0x1003: QueryDeviceInfo() -> (DeviceInfo info);
-
-    0x1005: StatsQueryReq();
-    0x1006: -> StatsQueryResp(StatsQueryResponse resp);
-
-    0x1007: ListMinstrelPeers() -> (MinstrelListResponse resp);
-    0x1008 : GetMinstrelStats(MinstrelStatsRequest req) ->(MinstrelStatsResponse resp);
-};
diff --git a/fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl b/fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl
deleted file mode 100644
index 9dd04dc..0000000
--- a/fidl/fuchsia.wlan.mlme/wlan_mlme_ext.fidl
+++ /dev/null
@@ -1,73 +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.
-
-library fuchsia.wlan.mlme;
-using fuchsia.wlan.stats;
-using fuchsia.wlan.minstrel;
-
-// Custom primitives for communicating between the wlan service and the MLME drivers.
-// The primitives defined here are not part of the official 802.11 MLME SAP interface specification,
-// but follow the same principle for the sake of consistency.
-
-
-// SIGNAL_REPORT.indication
-
-struct SignalReportIndication {
-    int8 rssi_dbm;
-};
-
-// EAPOL.indication
-
-struct EapolIndication {
-    array<uint8>:6 src_addr;
-    array<uint8>:6 dst_addr;
-    vector<uint8> data;
-};
-
-enum MacRole {
-    CLIENT = 1;
-    AP = 2;
-    MESH = 3;
-};
-
-
-// BandInfo groups capabilities defined per band.
-// This grouping is the industry's de factor standard.
-struct BandCapabilities {
-    Band band_id;
-    vector<uint16> basic_rates;
-    uint16 base_frequency;
-    vector<uint8> channels;
-
-    CapabilityInfo cap;
-    HtCapabilities? ht_cap;
-    VhtCapabilities? vht_cap;
-};
-
-struct DeviceInfo {
-    array<uint8>:6 mac_addr;
-    MacRole role;
-    vector<BandCapabilities> bands;
-};
-
-// STATS_QUERY.response
-
-struct StatsQueryResponse {
-    fuchsia.wlan.stats.IfaceStats stats;
-};
-
-struct MinstrelListResponse {
-    fuchsia.wlan.minstrel.Peers peers;
-};
-
-struct MinstrelStatsRequest {
-    array<uint8>:6 mac_addr;
-};
-
-struct MinstrelStatsResponse {
-    fuchsia.wlan.minstrel.Peer? peer;
-};
-
-// Method ordinals are defined in wlan_mlme.fidl to prevent error prone overlaps with official
-// MLME primitives.
diff --git a/fidl/fuchsia.wlan.service/meta.json b/fidl/fuchsia.wlan.service/meta.json
deleted file mode 100644
index ead12c3..0000000
--- a/fidl/fuchsia.wlan.service/meta.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "deps": [
-    "fuchsia.wlan.mlme", 
-    "fuchsia.wlan.stats"
-  ], 
-  "files": [
-    "fidl/fuchsia.wlan.service/wlan_service.fidl"
-  ], 
-  "name": "fuchsia.wlan.service", 
-  "root": "fidl/fuchsia.wlan.service", 
-  "sources": [
-    "fidl/fuchsia.wlan.service/wlan_service.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.wlan.service/wlan_service.fidl b/fidl/fuchsia.wlan.service/wlan_service.fidl
deleted file mode 100644
index ef2de3b..0000000
--- a/fidl/fuchsia.wlan.service/wlan_service.fidl
+++ /dev/null
@@ -1,89 +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.
-
-library fuchsia.wlan.service;
-
-using fuchsia.wlan.mlme;
-using fuchsia.wlan.stats;
-
-enum ErrCode {
-  OK = 0;
-  INTERNAL = 1;
-  NOT_FOUND = 2;
-  NOT_SUPPORTED = 3;
-  INVALID_ARGS = 4;
-};
-
-struct Error {
-  ErrCode code;
-  string description;
-};
-
-struct AP {
-  vector<uint8> bssid;
-  string       ssid; // TODO(NET-698, NET-1474): Make this as vector<uint8:32>
-  int8         rssi_dbm;
-  bool         is_secure;
-  bool         is_compatible; // with respect to Fuchsia
-  fuchsia.wlan.mlme.WlanChan chan;
-};
-
-struct ScanRequest {
-  uint8 timeout; // seconds
-  // TODO: more parameters here
-};
-
-struct ScanResult {
-  Error error;
-  vector<AP>? aps;
-};
-
-struct ConnectConfig {
-  string ssid;
-  string passPhrase;
-  uint8  scanInterval; // seconds
-  string bssid;
-};
-
-enum State {
-  UNKNOWN = 0;
-  BSS = 1;
-  QUERYING = 2;
-  SCANNING = 3;
-  JOINING = 4;
-  AUTHENTICATING = 5;
-  ASSOCIATING = 6;
-  ASSOCIATED = 7;
-};
-
-struct WlanStatus {
-  Error error;
-  State state;
-  AP? current_ap;
-};
-
-struct BssConfig {
-  string ssid;
-  int32 beaconPeriod;
-  int32 dtimPeriod;
-  uint8 channel;
-};
-
-struct WlanStats {
-  Error error;
-  fuchsia.wlan.stats.IfaceStats stats;
-};
-
-// Stub interface; eventually to be replaced by something based on the 802.11
-// SME / MSGCF.
-[Discoverable]
-interface Wlan {
-  1: Scan(ScanRequest req) -> (ScanResult result);
-  2: Connect(ConnectConfig req) -> (Error error);
-  3: Disconnect() -> (Error error);
-  4: Status() -> (WlanStatus status);
-  5: StartBss(BssConfig cfg) -> (Error error);
-  6: StopBss() -> (Error error);
-  7: Stats() -> (WlanStats stats);
-};
diff --git a/fidl/fuchsia.wlan.stats/meta.json b/fidl/fuchsia.wlan.stats/meta.json
deleted file mode 100644
index 26a02ed..0000000
--- a/fidl/fuchsia.wlan.stats/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/fuchsia.wlan.stats/wlan_stats.fidl"
-  ], 
-  "name": "fuchsia.wlan.stats", 
-  "root": "fidl/fuchsia.wlan.stats", 
-  "sources": [
-    "fidl/fuchsia.wlan.stats/wlan_stats.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/fidl/fuchsia.wlan.stats/wlan_stats.fidl b/fidl/fuchsia.wlan.stats/wlan_stats.fidl
deleted file mode 100644
index 0f35b83..0000000
--- a/fidl/fuchsia.wlan.stats/wlan_stats.fidl
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-library fuchsia.wlan.stats;
-
-struct Counter {
-  uint64 count;
-  string name;
-};
-
-struct PacketCounter {
-  Counter in;
-  Counter out;
-  Counter drop;
-  Counter in_bytes;
-  Counter out_bytes;
-  Counter drop_bytes;
-};
-
-// LINT.IfChange
-struct DispatcherStats {
-  PacketCounter any_packet;
-  PacketCounter mgmt_frame;
-  PacketCounter ctrl_frame;
-  PacketCounter data_frame;
-};
-
-const uint8 RSSI_BINS = 129;
-
-// RssiStats count the occurrence of the RSSIs.
-// RSSI value r's occurrence is counted in the bin[-r],
-// where r is defined in [-128, 0] in dBm.
-struct RssiStats {
-  // TODO(alexandrew): Change this to array.
-  vector<uint64>:RSSI_BINS hist;
-};
-
-struct ClientMlmeStats {
-  PacketCounter svc_msg;
-  PacketCounter data_frame;
-  PacketCounter mgmt_frame;
-  PacketCounter tx_frame;
-  PacketCounter rx_frame;
-  RssiStats assoc_data_rssi;
-  RssiStats beacon_rssi;
-};
-
-struct ApMlmeStats {
-  PacketCounter not_used;
-};
-
-// LINT.ThenChange(//garnet/lib/wlan/common/include/wlan/common/stats.h)
-
-union MlmeStats {
-  ClientMlmeStats client_mlme_stats;
-  ApMlmeStats ap_mlme_stats;
-};
-
-struct IfaceStats {
-    DispatcherStats dispatcher_stats;
-    MlmeStats? mlme_stats;
-};
diff --git a/fidl/zircon.ethernet/ethernet.fidl b/fidl/zircon.ethernet/ethernet.fidl
deleted file mode 100644
index 79945e3..0000000
--- a/fidl/zircon.ethernet/ethernet.fidl
+++ /dev/null
@@ -1,141 +0,0 @@
-// 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.
-
-library zircon.ethernet;
-
-using zx;
-
-struct MacAddress {
-    array<uint8>:6 octets;
-};
-
-const uint32 DEFAULT_BUFFER_SIZE = 2048; // bytes
-/// When writing payload to a tx buffer, clients of a Device must skip this many bytes
-/// so that lower-layer drivers can fill in additional headers in that space.
-const uint32 MAC_HDR_MAX_SIZE    = 64;   // bytes, the closest power of 2 larger than 44, which is
-                                         // DataFrameHeader::max_size(36) + LlcHeader::max_size(8)
-
-// Info.features bits
-const uint32 INFO_FEATURE_WLAN = 0x00000001;
-const uint32 INFO_FEATURE_SYNTH = 0x00000002;
-const uint32 INFO_FEATURE_LOOPBACK = 0x00000004;
-
-struct Info {
-    uint32 features;
-    uint32 mtu;
-    MacAddress mac;
-};
-
-struct Fifos {
-    // handles for the rx and tx fifo
-    handle<fifo> rx;
-    handle<fifo> tx;
-
-    // maximum number of items in rx and tx fifo
-    uint32 rx_depth;
-    uint32 tx_depth;
-};
-
-// Signal that is asserted on the RX fifo whenever the Device has a status
-// change.  This is ZX_USER_SIGNAL_0.
-// TODO(teisenbe/kulakowski): find a better way to represent this
-const uint32 SIGNAL_STATUS = 0x01000000;
-
-// device_status bits
-const uint32 DEVICE_STATUS_ONLINE = 0x00000001;
-
-// Max client name length
-const uint32 MAX_CLIENT_NAME_LEN = 15;
-
-// For compatibility with a past revision, allow one extra byte for an optional
-// null-terminator.
-const uint32 SET_CLIENT_NAME_MAX_LEN = 16;
-
-// zircon/device/ethernet.h
-[Layout = "Simple"]
-interface Device {
-    // Obtain information about device
-    1: GetInfo() -> (Info info);
-
-    // Obtain a pair of fifos for queueing tx and rx operations
-    2: GetFifos() -> (zx.status status, Fifos? info);
-
-    // Set the IO Buffer that will provide the data buffers for tx and rx operations
-    3: SetIOBuffer(handle<vmo> h) -> (zx.status status);
-
-    // Start transferring packets
-    // Start will not succeed (ZX_ERR_BAD_STATE) until the fifos have been
-    // obtained and an io buffer vmo has been registered.
-    4: Start() -> (zx.status status);
-
-    // Stop transferring packets
-    5: Stop() -> ();
-
-    // Start listening to the packets that we're transmitting
-    // as well as the packets we're receiving.
-    6: ListenStart() -> (zx.status status);
-
-    // Stop listening to the packets that we're transmitting.
-    7: ListenStop() -> ();
-
-    8: SetClientName(string:SET_CLIENT_NAME_MAX_LEN name) -> (zx.status status);
-
-    // Obtain the device status bits
-    // When these change, the signal SIGNAL_STATUS is asserted on the rx fifo.
-    // When these are read, the signal is deasserted.
-    9: GetStatus() -> (uint32 device_status);
-
-    10: SetPromiscuousMode(bool enabled) -> (zx.status status);
-
-    11: ConfigMulticastAddMac(MacAddress addr) -> (zx.status status);
-    12: ConfigMulticastDeleteMac(MacAddress addr) -> (zx.status status);
-    13: ConfigMulticastSetPromiscuousMode(bool enabled) -> (zx.status status);
-
-    // TODO(teisenbe): We should probably remove these?  They are only used for testing.
-    14: ConfigMulticastTestFilter() -> (zx.status status);
-    15: DumpRegisters() -> (zx.status status);
-};
-
-// Operation
-//
-// Packets are transmitted by writing data into the io_vmo and writing
-// an FifoEntry referencing that data (offset + length) into the tx fifo.
-// When the driver is done accessing the data, a FifoEntry with the same
-// cookie value (opaque to the driver) will be readable from the tx fifo.
-//
-// Packets are received by writing a FifoEntry referencing an available
-// buffer (offset + length) in the io vmo.  When a packet is received,
-// a FifoEntry with the same cookie value (opaque to the driver) will be
-// readable from the rx fifo.  The offset field will be the same as was
-// sent.  The length field will reflect the actual size of the received
-// packet.  The flags field will indicate success or a specific failure
-// condition.
-//
-// IMPORTANT: The driver *will not* buffer response messages.  It is the
-// client's responsibility to ensure that there is space in the reply side
-// of each fifo for each outstanding tx or rx request.  The fifo sizes
-// are returned along with the fifo handles from GetFifos().
-
-// flags values for request messages
-// - none -
-
-// flags values for response messages
-const uint16 FIFO_RX_OK   = 0x00000001; // packet received okay
-const uint16 FIFO_TX_OK   = 0x00000001; // packet transmitted okay
-const uint16 FIFO_INVALID = 0x00000002; // offset+length not within io_vmo bounds
-const uint16 FIFO_RX_TX   = 0x00000004; // received our own tx packet (when Listen enabled)
-
-struct FifoEntry {
-    // offset from start of io vmo to packet data
-    uint32 offset;
-
-    // length of packet data to tx or rx
-    uint16 length;
-
-    // FIFO_* flags as above
-    uint16 flags;
-
-    // opaque cookie
-    uint64 cookie;
-};
diff --git a/fidl/zircon.ethernet/meta.json b/fidl/zircon.ethernet/meta.json
deleted file mode 100644
index fe257e4..0000000
--- a/fidl/zircon.ethernet/meta.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "deps": [], 
-  "files": [
-    "fidl/zircon.ethernet/ethernet.fidl"
-  ], 
-  "name": "zircon.ethernet", 
-  "root": "fidl/zircon.ethernet", 
-  "sources": [
-    "fidl/zircon.ethernet/ethernet.fidl"
-  ], 
-  "type": "fidl_library"
-}
\ No newline at end of file
diff --git a/hash b/hash
deleted file mode 100644
index 2cc223f..0000000
--- a/hash
+++ /dev/null
@@ -1 +0,0 @@
-0e1216b2c3a4a5b141036ebb1800fc9c1202c1ab
\ No newline at end of file
diff --git a/images/fuchsia.zbi-meta.json b/images/fuchsia.zbi-meta.json
deleted file mode 100644
index 28465a1..0000000
--- a/images/fuchsia.zbi-meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "file": {
-    "arm64": "target/arm64/fuchsia.zbi", 
-    "x64": "target/x64/fuchsia.zbi"
-  }, 
-  "name": "fuchsia.zbi", 
-  "root": "images", 
-  "type": "image"
-}
\ No newline at end of file
diff --git a/images/fvm.blk-meta.json b/images/fvm.blk-meta.json
deleted file mode 100644
index fe7dacc..0000000
--- a/images/fvm.blk-meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "file": {
-    "arm64": "target/arm64/fvm.blk", 
-    "x64": "target/x64/fvm.blk"
-  }, 
-  "name": "fvm.blk", 
-  "root": "images", 
-  "type": "image"
-}
\ No newline at end of file
diff --git a/images/fvm.sparse.blk-meta.json b/images/fvm.sparse.blk-meta.json
deleted file mode 100644
index 077397c..0000000
--- a/images/fvm.sparse.blk-meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "file": {
-    "arm64": "target/arm64/fvm.sparse.blk", 
-    "x64": "target/x64/fvm.sparse.blk"
-  }, 
-  "name": "fvm.sparse.blk", 
-  "root": "images", 
-  "type": "image"
-}
\ No newline at end of file
diff --git a/images/local.esp.blk-meta.json b/images/local.esp.blk-meta.json
deleted file mode 100644
index b7644c1..0000000
--- a/images/local.esp.blk-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "file": {
-    "x64": "target/x64/local.esp.blk"
-  },
-  "name": "local.esp.blk",
-  "root": "images",
-  "type": "image"
-}
\ No newline at end of file
diff --git a/images/qemu-kernel.bin-meta.json b/images/qemu-kernel.bin-meta.json
deleted file mode 100644
index a67b5c2..0000000
--- a/images/qemu-kernel.bin-meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "file": {
-    "arm64": "target/arm64/qemu-kernel.bin", 
-    "x64": "target/x64/qemu-kernel.bin"
-  }, 
-  "name": "qemu-kernel.bin", 
-  "root": "images", 
-  "type": "image"
-}
\ No newline at end of file
diff --git a/images/zircon.vboot-meta.json b/images/zircon.vboot-meta.json
deleted file mode 100644
index bfdf16c..0000000
--- a/images/zircon.vboot-meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "file": {
-    "arm64": "target/arm64/zircon.vboot", 
-    "x64": "target/x64/zircon.vboot"
-  }, 
-  "name": "zircon.vboot", 
-  "root": "images", 
-  "type": "image"
-}
\ No newline at end of file
diff --git a/meta/manifest.json b/meta/manifest.json
index c65aeeb..c0fe5e1 100644
--- a/meta/manifest.json
+++ b/meta/manifest.json
@@ -1,92 +1,57 @@
 {
   "arch": {
-    "host": "x86_64-linux-gnu", 
+    "host": "x86_64-linux-gnu",
     "target": [
-      "arm64", 
+      "arm64",
       "x64"
     ]
-  }, 
+  },
+  "id": "",
   "parts": [
-    "docs/low_level.json", 
-    "docs/metadata_schemas.json", 
-    "fidl/fuchsia.bluetooth.gatt/meta.json", 
-    "fidl/fuchsia.bluetooth.le/meta.json", 
-    "fidl/fuchsia.bluetooth/meta.json", 
-    "fidl/fuchsia.developer.tiles/meta.json", 
-    "fidl/fuchsia.fonts/meta.json", 
-    "fidl/fuchsia.images/meta.json", 
-    "fidl/fuchsia.io/meta.json", 
-    "fidl/fuchsia.ldsvc/meta.json", 
-    "fidl/fuchsia.logger/meta.json", 
-    "fidl/fuchsia.math/meta.json", 
-    "fidl/fuchsia.media/meta.json", 
-    "fidl/fuchsia.mediacodec/meta.json", 
-    "fidl/fuchsia.mem/meta.json", 
-    "fidl/fuchsia.net.http/meta.json", 
-    "fidl/fuchsia.net.oldhttp/meta.json", 
-    "fidl/fuchsia.net/meta.json", 
-    "fidl/fuchsia.netstack/meta.json", 
-    "fidl/fuchsia.process/meta.json", 
-    "fidl/fuchsia.simplecamera/meta.json", 
-    "fidl/fuchsia.sys/meta.json", 
-    "fidl/fuchsia.sysinfo/meta.json", 
-    "fidl/fuchsia.ui.app/meta.json", 
-    "fidl/fuchsia.ui.gfx/meta.json", 
-    "fidl/fuchsia.ui.input/meta.json", 
-    "fidl/fuchsia.ui.policy/meta.json", 
-    "fidl/fuchsia.ui.scenic/meta.json", 
-    "fidl/fuchsia.ui.vectorial/meta.json", 
-    "fidl/fuchsia.ui.views/meta.json", 
-    "fidl/fuchsia.ui.viewsv1/meta.json", 
-    "fidl/fuchsia.ui.viewsv1token/meta.json", 
-    "fidl/fuchsia.wlan.minstrel/meta.json", 
-    "fidl/fuchsia.wlan.mlme/meta.json", 
-    "fidl/fuchsia.wlan.service/meta.json", 
-    "fidl/fuchsia.wlan.stats/meta.json", 
-    "fidl/zircon.ethernet/meta.json", 
-    "images/fuchsia.zbi-meta.json", 
-    "images/fvm.blk-meta.json", 
-    "images/fvm.sparse.blk-meta.json", 
-    "images/local.esp.blk-meta.json", 
-    "images/qemu-kernel.bin-meta.json", 
-    "images/zircon.vboot-meta.json", 
-    "pkg/async-default/meta.json", 
-    "pkg/async-loop-cpp/meta.json", 
-    "pkg/async-loop/meta.json", 
-    "pkg/async/meta.json", 
-    "pkg/fdio/meta.json", 
-    "pkg/fidl-async/meta.json", 
-    "pkg/fidl/meta.json", 
-    "pkg/fidl_cpp/meta.json", 
-    "pkg/fidl_cpp_base/meta.json", 
-    "pkg/fidl_cpp_sync/meta.json", 
-    "pkg/fit/meta.json", 
-    "pkg/images_cpp/meta.json", 
-    "pkg/memfs/meta.json", 
-    "pkg/scenic_cpp/meta.json", 
-    "pkg/svc/meta.json", 
-    "pkg/sync/meta.json", 
-    "pkg/syslog/meta.json", 
-    "pkg/sysroot/meta.json", 
-    "pkg/trace-engine/meta.json", 
-    "pkg/vulkan/meta.json", 
-    "pkg/vulkan_layers/meta.json", 
-    "pkg/zx/meta.json", 
-    "tools/bootserver-meta.json", 
-    "tools/far-meta.json", 
-    "tools/fidl-format-meta.json", 
-    "tools/fidlc-meta.json", 
-    "tools/fidlgen-meta.json", 
-    "tools/fvm-meta.json", 
-    "tools/loglistener-meta.json", 
-    "tools/merkleroot-meta.json", 
-    "tools/minfs-meta.json", 
-    "tools/netaddr-meta.json", 
-    "tools/netcp-meta.json", 
-    "tools/netls-meta.json", 
-    "tools/netruncmd-meta.json", 
-    "tools/pm-meta.json", 
-    "tools/zbi-meta.json", 
-    "tools/zxdb-meta.json"
-  ]
+    {
+      "meta": "docs/low_level.json",
+      "type": "documentation"
+    },
+    {
+      "meta": "docs/metadata_schemas.json",
+      "type": "documentation"
+    },
+    {
+      "meta": "docs/musl_license.json",
+      "type": "documentation"
+    },
+    {
+      "meta": "docs/open_source.json",
+      "type": "documentation"
+    },
+    {
+      "meta": "pkg/async-cpp/meta.json",
+      "type": "cc_source_library"
+    },
+    {
+      "meta": "pkg/async/meta.json",
+      "type": "cc_source_library"
+    },
+    {
+      "meta": "pkg/fdio/meta.json",
+      "type": "cc_prebuilt_library"
+    },
+    {
+      "meta": "pkg/fit/meta.json",
+      "type": "cc_source_library"
+    },
+    {
+      "meta": "pkg/sync/meta.json",
+      "type": "cc_prebuilt_library"
+    },
+    {
+      "meta": "pkg/sysroot/meta.json",
+      "type": "sysroot"
+    },
+    {
+      "meta": "pkg/zx/meta.json",
+      "type": "cc_source_library"
+    }
+  ],
+  "schema_version": "1"
 }
\ No newline at end of file
diff --git a/meta/schemas/cc_prebuilt_library.json b/meta/schemas/cc_prebuilt_library.json
index 0a9c83b..9a72c8e 100644
--- a/meta/schemas/cc_prebuilt_library.json
+++ b/meta/schemas/cc_prebuilt_library.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/cc_prebuilt_library.json",
   "description": "A prebuilt C/C++ library",
   "type": "object",
   "allOf": [
@@ -8,16 +10,25 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "cc_prebuilt_library"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "cc_prebuilt_library"
+              ]
+            }
           ]
         },
         "name": {
           "description": "Name of the library",
           "$ref": "common.json#/definitions/cc_library_name"
         },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "type": "string"
+        },
         "format": {
           "description": "The distribution format of the binaries",
           "type": "string",
@@ -41,7 +52,7 @@
           "description": "List of C/C++ libraries this library depends on",
           "type": "array",
           "items": {
-            "$ref": "#/definitions/package_name"
+            "$ref": "common.json#/definitions/cc_library_name"
           }
         },
         "binaries": {
@@ -67,9 +78,13 @@
         "deps",
         "format",
         "headers",
+        "include_dir",
+        "root",
+
         "name",
         "type"
-      ]
+      ],
+      "additionalProperties": false
     }
   ],
   "definitions": {
@@ -85,6 +100,10 @@
           "description": "The version of the library to add to Fuchsia packages",
           "$ref": "common.json#/definitions/file"
         },
+        "dist_path": {
+          "description": "Path where the library should be installed in Fuchsia packages",
+          "$ref": "common.json#/definitions/file"
+        },
         "debug": {
           "description": "The unstripped version of the library",
           "$ref": "common.json#/definitions/file"
diff --git a/meta/schemas/cc_source_library.json b/meta/schemas/cc_source_library.json
index 34733d3..36ceb11 100644
--- a/meta/schemas/cc_source_library.json
+++ b/meta/schemas/cc_source_library.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/cc_source_library.json",
   "description": "A set of C/C++ sources",
   "type": "object",
   "allOf": [
@@ -8,16 +10,25 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "cc_source_library"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "cc_source_library"
+              ]
+            }
           ]
         },
         "name": {
           "description": "Name of the library",
           "$ref": "common.json#/definitions/cc_library_name"
         },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "type": "string"
+        },
         "sources": {
           "description": "List of library sources",
           "type": "array",
@@ -28,6 +39,7 @@
         "headers": {
           "description": "List of public headers",
           "type": "array",
+          "minItems": 1,
           "items": {
             "$ref": "common.json#/definitions/file"
           }
@@ -40,7 +52,7 @@
           "description": "List of C/C++ libraries this library depends on",
           "type": "array",
           "items": {
-            "$ref": "#/definitions/package_name"
+            "$ref": "common.json#/definitions/cc_library_name"
           }
         },
         "fidl_deps": {
@@ -49,17 +61,28 @@
           "items": {
             "$ref": "common.json#/definitions/fidl_library_name"
           }
+        },
+        "banjo_deps": {
+          "description": "List of BANJO libraries this library depends on",
+          "type": "array",
+          "items": {
+            "$ref": "common.json#/definitions/banjo_library_name"
+          }
         }
       },
       "required": [
+        "banjo_deps",
         "deps",
         "fidl_deps",
         "headers",
         "include_dir",
-        "name",
+        "root",
         "sources",
+
+        "name",
         "type"
-      ]
+      ],
+      "additionalProperties": false
     }
   ]
 }
diff --git a/meta/schemas/common.json b/meta/schemas/common.json
index a17c6a5..b02b160 100644
--- a/meta/schemas/common.json
+++ b/meta/schemas/common.json
@@ -1,36 +1,30 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/common.json",
   "definitions": {
     "file": {
       "description": "Path to a file from the root of the SDK",
       "type": "string"
     },
+    "type": {
+      "description": "Represents the type of an SDK element",
+      "type": "string"
+    },
     "sdk_element": {
       "description": "Base type for SDK elements",
       "type": "object",
       "properties": {
         "type": {
           "description": "The type of the element",
-          "type": "string"
+          "$ref": "#/definitions/type"
         },
         "name": {
           "description": "The name of the element",
           "type": "string"
-        },
-        "root": {
-          "description": "The root of the element in the SDK",
-          "type": "string"
-        },
-        "files": {
-          "description": "The list of files pertaining to the element",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/file"
-          }
         }
       },
       "required": [
         "name",
-        "root",
         "type"
       ]
     },
diff --git a/meta/schemas/dart_library.json b/meta/schemas/dart_library.json
index 3d90f91..9a77d08 100644
--- a/meta/schemas/dart_library.json
+++ b/meta/schemas/dart_library.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/dart_library.json",
   "description": "A Dart library",
   "type": "object",
   "allOf": [
@@ -8,19 +10,29 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "dart_library"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "dart_library"
+              ]
+            }
           ]
         },
         "name": {
           "description": "Name of the library",
           "$ref": "#/definitions/package_name"
         },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "$ref": "common.json#/definitions/file"
+        },
         "sources": {
           "description": "List of library sources",
           "type": "array",
+          "minItems": 1,
           "items": {
             "$ref": "common.json#/definitions/file"
           }
@@ -50,11 +62,14 @@
       "required": [
         "deps",
         "fidl_deps",
-        "name",
+        "root",
         "sources",
         "third_party_deps",
+
+        "name",
         "type"
-      ]
+      ],
+      "additionalProperties": false
     }
   ],
   "definitions": {
diff --git a/meta/schemas/data.json b/meta/schemas/data.json
new file mode 100644
index 0000000..1afbddb
--- /dev/null
+++ b/meta/schemas/data.json
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/documentation.json",
+  "description": "A set of data files",
+  "type": "object",
+  "allOf": [
+    {
+      "$ref": "common.json#/definitions/sdk_element"
+    },
+    {
+      "properties": {
+        "type": {
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "config",
+                "license"
+              ]
+            }
+          ]
+        },
+        "name": {
+          "description": "Name of the data set",
+          "type": "string"
+        },
+        "data": {
+          "description": "The list of data files pertaining to the set",
+          "type": "array",
+          "minItems": 1,
+          "items": {
+            "$ref": "common.json#/definitions/file"
+          }
+        }
+      },
+      "required": [
+        "data",
+
+        "name",
+        "type"
+      ],
+      "additionalProperties": false
+    }
+  ]
+}
diff --git a/meta/schemas/device_profile.json b/meta/schemas/device_profile.json
new file mode 100644
index 0000000..48f1c41
--- /dev/null
+++ b/meta/schemas/device_profile.json
@@ -0,0 +1,52 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/device_profile.json",
+  "description": "A supported device configuration for SDK development",
+  "type": "object",
+  "allOf": [
+    {
+      "$ref": "common.json#/definitions/sdk_element"
+    },
+    {
+      "properties": {
+        "type": {
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "device_profile"
+              ]
+            }
+          ]
+        },
+        "name": {
+          "description": "Name of the profile",
+          "type": "string"
+        },
+        "description": {
+          "description": "A description of the device's configuration",
+          "type": "string"
+        },
+        "images_url": {
+          "description": "GCS URL of the archive containing system images",
+          "type": "string"
+        },
+        "packages_url": {
+          "description": "GCS URL of the archive containing a package repository",
+          "type": "string"
+        }
+      },
+      "required": [
+        "description",
+        "images_url",
+        "packages_url",
+
+        "name",
+        "type"
+      ],
+      "additionalProperties": false
+    }
+  ]
+}
diff --git a/meta/schemas/documentation.json b/meta/schemas/documentation.json
index 3362acf..040ccd6 100644
--- a/meta/schemas/documentation.json
+++ b/meta/schemas/documentation.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/documentation.json",
   "description": "A set of documents",
   "type": "object",
   "allOf": [
@@ -8,24 +10,37 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "documentation"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "documentation"
+              ]
+            }
           ]
         },
+        "name": {
+          "description": "Name of the document set",
+          "type": "string"
+        },
         "docs": {
           "description": "The list of documents pertaining to the set",
           "type": "array",
+          "minItems": 1,
           "items": {
             "$ref": "common.json#/definitions/file"
           }
         }
       },
       "required": [
-        "type",
-        "docs"
-      ]
+        "docs",
+
+        "name",
+        "type"
+      ],
+      "additionalProperties": false
     }
   ]
 }
diff --git a/meta/schemas/fidl_library.json b/meta/schemas/fidl_library.json
index abc8291..eec1fe3 100644
--- a/meta/schemas/fidl_library.json
+++ b/meta/schemas/fidl_library.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/fidl_library.json",
   "description": "A FIDL library",
   "type": "object",
   "allOf": [
@@ -8,29 +10,50 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "fidl_library"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "fidl_library"
+              ]
+            }
           ]
         },
         "name": {
           "description": "Name of the library",
           "$ref": "common.json#/definitions/fidl_library_name"
         },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "type": "string"
+        },
         "sources": {
           "description": "List of library sources",
           "type": "array",
+          "minItems": 1,
           "items": {
             "$ref": "common.json#/definitions/file"
           }
+        },
+        "deps": {
+          "description": "List of libraries this library depends on",
+          "type": "array",
+          "items": {
+            "$ref": "common.json#/definitions/fidl_library_name"
+          }
         }
       },
       "required": [
-        "name",
+        "deps",
+        "root",
         "sources",
+
+        "name",
         "type"
-      ]
+      ],
+      "additionalProperties": false
     }
   ]
 }
diff --git a/meta/schemas/host_tool.json b/meta/schemas/host_tool.json
index a6d11fe..97c9cc3 100644
--- a/meta/schemas/host_tool.json
+++ b/meta/schemas/host_tool.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/host_tool.json",
   "description": "A host tool",
   "type": "object",
   "allOf": [
@@ -8,24 +10,63 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "host_tool"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "host_tool"
+              ]
+            }
           ]
         },
+        "name": {
+          "description": "Name of the tool",
+          "type": "string"
+        },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "type": "string"
+        },
         "files": {
           "description": "The list of files pertaining to the element",
-          "type": "array",
-          "items": {
-            "$ref": "common.json#/definitions/file"
-          }
+          "$ref": "#/definitions/fileGroup"
+        },
+        "target_files": {
+          "description": "The target-specific files, per architecture",
+          "type": "object",
+          "properties": {
+            "x64": {
+              "description": "Files for the x64 architecture",
+              "$ref": "#/definitions/fileGroup"
+            },
+            "arm64": {
+              "description": "Files for the arm64 architecture",
+              "$ref": "#/definitions/fileGroup"
+            }
+          },
+          "additionalProperties": false,
+          "minProperties": 1,
+          "maxProperties": 2
         }
       },
       "required": [
-        "type",
-        "files"
-      ]
+        "root",
+
+        "name",
+        "type"
+      ],
+      "additionalProperties": false
     }
-  ]
+  ],
+  "definitions": {
+    "fileGroup": {
+      "description": "A collection of files",
+      "type": "array",
+      "items": {
+        "$ref": "common.json#/definitions/file"
+      }
+    }
+  }
 }
diff --git a/meta/schemas/image.json b/meta/schemas/image.json
deleted file mode 100644
index f9fd1b0..0000000
--- a/meta/schemas/image.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "description": "A target image",
-  "type": "object",
-  "allOf": [
-    {
-      "$ref": "common.json#/definitions/sdk_element"
-    },
-    {
-      "properties": {
-        "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "image"
-          ]
-        },
-        "file": {
-          "description": "The image, per architecture",
-          "type": "object",
-          "properties": {
-            "x64": {
-              "description": "File for the x64 architecture",
-              "$ref": "common.json#/definitions/file"
-            },
-            "arm64": {
-              "description": "File for the arm64 architecture",
-              "$ref": "common.json#/definitions/file"
-            }
-          },
-          "additionalProperties": false,
-          "minProperties": 1,
-          "maxProperties": 2
-        }
-      },
-      "required": [
-        "type",
-        "file"
-      ]
-    }
-  ]
-}
diff --git a/meta/schemas/loadable_module.json b/meta/schemas/loadable_module.json
index ae7361d..308b45c 100644
--- a/meta/schemas/loadable_module.json
+++ b/meta/schemas/loadable_module.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/loadable_module.json",
   "description": "A collection of object files that can be loaded at runtime",
   "type": "object",
   "allOf": [
@@ -8,16 +10,25 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "loadable_module"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "loadable_module"
+              ]
+            }
           ]
         },
         "name": {
           "description": "Name of the module",
           "type": "string"
         },
+        "root": {
+          "description": "The root of the element in the SDK",
+          "type": "string"
+        },
         "resources": {
           "description": "Resource files associated with the module",
           "type": "array",
@@ -45,10 +56,12 @@
       },
       "required": [
         "binaries",
-        "name",
         "resources",
+
+        "name",
         "type"
-      ]
+      ],
+      "additionalProperties": false
     }
   ],
   "definitions": {
diff --git a/meta/schemas/manifest.json b/meta/schemas/manifest.json
index bac0c4a..5c3be80 100644
--- a/meta/schemas/manifest.json
+++ b/meta/schemas/manifest.json
@@ -1,5 +1,7 @@
 {
-  "description": "A target image",
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/manifest.json",
+  "description": "The manifest describing the contents of the SDK",
   "type": "object",
   "properties": {
     "arch": {
@@ -24,17 +26,43 @@
         "target"
       ]
     },
+    "id": {
+      "description": "An opaque identifier for this SDK",
+      "type": "string"
+    },
     "parts": {
-      "description": "The metadata files for elements in the SDK",
+      "description": "The elements in this SDK",
       "type": "array",
+      "minItems": 1,
       "items": {
-        "$ref": "common.json#/definitions/file"
+        "type": "object",
+        "properties": {
+          "type": {
+            "description": "The type of the element",
+            "$ref": "common.json#/definitions/type"
+          },
+          "meta": {
+            "description": "The metadata file for the element",
+            "$ref": "common.json#/definitions/file"
+          }
+        },
+        "required": [
+          "meta",
+          "type"
+        ],
+        "additionalProperties": false
       }
+    },
+    "schema_version": {
+      "description": "An opaque identifier for metadata schemas in the SDK",
+      "type": "string"
     }
   },
-  "additionalProperties": false,
   "required": [
     "arch",
-    "parts"
-  ]
+    "id",
+    "parts",
+    "schema_version"
+  ],
+  "additionalProperties": false
 }
diff --git a/meta/schemas/sysroot.json b/meta/schemas/sysroot.json
index e7e2bc6..9924ce2 100644
--- a/meta/schemas/sysroot.json
+++ b/meta/schemas/sysroot.json
@@ -1,4 +1,6 @@
 {
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://fuchsia.com/schemas/sdk/sysroot.json",
   "description": "The sysroot",
   "type": "object",
   "allOf": [
@@ -8,10 +10,15 @@
     {
       "properties": {
         "type": {
-          "description": "Marker for this type of element",
-          "type": "string",
-          "enum": [
-            "sysroot"
+          "allOf": [
+            {
+              "$ref": "common.json#/definitions/type"
+            },
+            {
+              "enum": [
+                "sysroot"
+              ]
+            }
           ]
         },
         "name": {
@@ -40,10 +47,12 @@
         }
       },
       "required": [
+        "versions",
+
         "name",
-        "type",
-        "versions"
-      ]
+        "type"
+      ],
+      "additionalProperties": false
     }
   ],
   "definitions": {
@@ -62,6 +71,10 @@
             "$ref": "common.json#/definitions/file"
           }
         },
+        "dist_dir": {
+          "description": "Path to the base directory for prebuilt libraries",
+          "$ref": "common.json#/definitions/file"
+        },
         "include_dir": {
           "description": "Path to the base directory for includes",
           "$ref": "common.json#/definitions/file"
@@ -94,8 +107,10 @@
         "include_dir",
         "link_libs",
         "dist_libs",
-        "debug_libs"
-      ]
+        "debug_libs",
+        "dist_dir"
+      ],
+      "additionalProperties": false
     }
   }
 }
diff --git a/pkg/async-cpp/executor.cc b/pkg/async-cpp/executor.cc
new file mode 100644
index 0000000..27b3835
--- /dev/null
+++ b/pkg/async-cpp/executor.cc
@@ -0,0 +1,228 @@
+// Copyright 2019 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.
+
+#include <lib/async/cpp/executor.h>
+
+#include <zircon/assert.h>
+
+namespace async {
+
+Executor::Executor(async_dispatcher_t* dispatcher)
+    : dispatcher_(new DispatcherImpl(dispatcher, this)) {}
+
+Executor::~Executor() {
+    dispatcher_->Shutdown();
+}
+
+void Executor::schedule_task(fit::pending_task task) {
+    ZX_DEBUG_ASSERT(task);
+    dispatcher_->ScheduleTask(std::move(task));
+}
+
+Executor::DispatcherImpl::DispatcherImpl(async_dispatcher_t* dispatcher,
+                                         Executor* executor)
+    : async_task_t{{ASYNC_STATE_INIT}, &DispatcherImpl::Dispatch, 0},
+      dispatcher_(dispatcher), executor_(executor) {
+    ZX_DEBUG_ASSERT(dispatcher_ != nullptr);
+    ZX_DEBUG_ASSERT(executor_ != nullptr);
+}
+
+Executor::DispatcherImpl::~DispatcherImpl() {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    ZX_DEBUG_ASSERT(guarded_.was_shutdown_);
+    ZX_DEBUG_ASSERT(!guarded_.dispatch_pending_);
+    ZX_DEBUG_ASSERT(!guarded_.scheduler_.has_runnable_tasks());
+    ZX_DEBUG_ASSERT(!guarded_.scheduler_.has_suspended_tasks());
+    ZX_DEBUG_ASSERT(!guarded_.scheduler_.has_outstanding_tickets());
+    ZX_DEBUG_ASSERT(guarded_.incoming_tasks_.empty());
+    ZX_DEBUG_ASSERT(!guarded_.task_running_);
+}
+
+// Unfortunately std::unique_lock does not support thread-safety annotations
+void Executor::DispatcherImpl::Shutdown() FIT_NO_THREAD_SAFETY_ANALYSIS {
+    std::unique_lock<std::mutex> lock(guarded_.mutex_);
+    ZX_DEBUG_ASSERT(!guarded_.was_shutdown_);
+    ZX_ASSERT_MSG(!guarded_.task_running_,
+                  "async::Executor must not be destroyed while tasks may "
+                  "be running concurrently on the dispatcher because the "
+                  "task's context holds a pointer to the executor.");
+    guarded_.was_shutdown_ = true;
+    PurgeTasksAndMaybeDeleteSelfLocked(std::move(lock));
+}
+
+void Executor::DispatcherImpl::ScheduleTask(fit::pending_task task) {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    ZX_DEBUG_ASSERT(!guarded_.was_shutdown_);
+
+    // Try to post the task first.
+    // This may fail if the loop is being shut down, in which case we
+    // will let the task be destroyed once it goes out of scope.
+    if (!guarded_.loop_failure_ && ScheduleDispatchLocked()) {
+        guarded_.incoming_tasks_.push(std::move(task));
+    } // else drop the task once the function returns
+}
+
+void Executor::DispatcherImpl::Dispatch(
+    async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status) {
+    DispatcherImpl* self = static_cast<DispatcherImpl*>(task);
+    self->Dispatch(status);
+}
+
+// Unfortunately std::unique_lock does not support thread-safety annotations
+void Executor::DispatcherImpl::Dispatch(zx_status_t status)
+    FIT_NO_THREAD_SAFETY_ANALYSIS {
+    std::unique_lock<std::mutex> lock(guarded_.mutex_);
+    ZX_DEBUG_ASSERT(guarded_.dispatch_pending_);
+    ZX_DEBUG_ASSERT(!guarded_.loop_failure_);
+    ZX_DEBUG_ASSERT(!guarded_.task_running_);
+
+    if (status == ZX_OK) {
+        // Accept incoming tasks only once before entering the loop.
+        //
+        // This ensures that each invocation of |Dispatch()| has a bounded
+        // amount of work to perform.  Specifically, it will only execute
+        // incoming tasks, tasks that are already runnable, and tasks that are
+        // currently suspended but become runnable while the loop is executing.
+        // Once finished, the loop returns control back to the async dispatcher.
+        //
+        // The purpose of this deconstruction is to prevent other units of work
+        // scheduled by the async dispatcher from being starved in the event
+        // that there is a continuous stream of new tasks being scheduled on the
+        // executor.  As an extreme example, we must ensure that the async
+        // dispatcher has an opportunity to process its own quit message and
+        // shut down in that scenario.
+        //
+        // An alternative way to solve this problem would be to not loop at all.
+        // Unfortunately, that would significantly increase the overhead of
+        // processing tasks resumed by other tasks.
+        AcceptIncomingTasksLocked();
+        while (!guarded_.was_shutdown_) {
+            guarded_.scheduler_.take_runnable_tasks(&runnable_tasks_);
+            if (runnable_tasks_.empty()) {
+                guarded_.dispatch_pending_ = false;
+                if (guarded_.incoming_tasks_.empty() ||
+                    ScheduleDispatchLocked()) {
+                    return; // all done
+                }
+                break; // a loop failure occurred, we need to clean up
+            }
+
+            // Drop lock while running tasks then reaquire it.
+            guarded_.task_running_ = true;
+            lock.unlock();
+            do {
+                RunTask(&runnable_tasks_.front());
+                runnable_tasks_.pop(); // the task may be destroyed here if it was not suspended
+            } while (!runnable_tasks_.empty());
+            lock.lock();
+            guarded_.task_running_ = false;
+        }
+    } else {
+        guarded_.loop_failure_ = true;
+    }
+    guarded_.dispatch_pending_ = false;
+    PurgeTasksAndMaybeDeleteSelfLocked(std::move(lock));
+}
+
+void Executor::DispatcherImpl::RunTask(fit::pending_task* task) {
+    ZX_DEBUG_ASSERT(current_task_ticket_ == 0);
+    const bool finished = (*task)(*this);
+    ZX_DEBUG_ASSERT(!*task == finished);
+    if (current_task_ticket_ == 0) {
+        return; // task was not suspended, no ticket was produced
+    }
+
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    guarded_.scheduler_.finalize_ticket(current_task_ticket_, task);
+    current_task_ticket_ = 0;
+}
+
+// Must only be called while |run_task()| is running a task.
+// This happens when the task's continuation calls |context::suspend_task()|
+// upon the context it received as an argument.
+fit::suspended_task Executor::DispatcherImpl::suspend_task() {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    ZX_DEBUG_ASSERT(guarded_.task_running_);
+    if (current_task_ticket_ == 0) {
+        current_task_ticket_ = guarded_.scheduler_.obtain_ticket(
+            2 /*initial_refs*/);
+    } else {
+        guarded_.scheduler_.duplicate_ticket(current_task_ticket_);
+    }
+    return fit::suspended_task(this, current_task_ticket_);
+}
+
+fit::suspended_task::ticket Executor::DispatcherImpl::duplicate_ticket(
+    fit::suspended_task::ticket ticket) {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    guarded_.scheduler_.duplicate_ticket(ticket);
+    return ticket;
+}
+
+// Unfortunately std::unique_lock does not support thread-safety annotations
+void Executor::DispatcherImpl::resolve_ticket(
+    fit::suspended_task::ticket ticket, bool resume_task)
+    FIT_NO_THREAD_SAFETY_ANALYSIS {
+    fit::pending_task abandoned_task; // drop outside of the lock
+    {
+        std::unique_lock<std::mutex> lock(guarded_.mutex_);
+        bool did_resume = false;
+        if (resume_task) {
+            did_resume = guarded_.scheduler_.resume_task_with_ticket(ticket);
+        } else {
+            abandoned_task = guarded_.scheduler_.release_ticket(ticket);
+        }
+        if (!guarded_.was_shutdown_ && !guarded_.loop_failure_ &&
+            (!did_resume || ScheduleDispatchLocked())) {
+            return; // all done
+        }
+        PurgeTasksAndMaybeDeleteSelfLocked(std::move(lock));
+    }
+}
+
+bool Executor::DispatcherImpl::ScheduleDispatchLocked() {
+    ZX_DEBUG_ASSERT(!guarded_.was_shutdown_ && !guarded_.loop_failure_);
+    if (guarded_.dispatch_pending_) {
+        return true; // nothing to do
+    }
+    zx_status_t status = async_post_task(dispatcher_, this);
+    ZX_ASSERT_MSG(status == ZX_OK || status == ZX_ERR_BAD_STATE,
+                  "status=%d", status);
+    if (status == ZX_OK) {
+        guarded_.dispatch_pending_ = true;
+        return true; // everything's ok
+    }
+    guarded_.loop_failure_ = true;
+    return false; // failed
+}
+
+void Executor::DispatcherImpl::AcceptIncomingTasksLocked() {
+    while (!guarded_.incoming_tasks_.empty()) {
+        guarded_.scheduler_.schedule_task(
+            std::move(guarded_.incoming_tasks_.front()));
+        guarded_.incoming_tasks_.pop();
+    }
+}
+
+// Unfortunately std::unique_lock does not support thread-safety annotations
+void Executor::DispatcherImpl::PurgeTasksAndMaybeDeleteSelfLocked(
+    std::unique_lock<std::mutex> lock) FIT_NO_THREAD_SAFETY_ANALYSIS {
+    ZX_DEBUG_ASSERT(lock.owns_lock());
+    ZX_DEBUG_ASSERT(guarded_.was_shutdown_ || guarded_.loop_failure_);
+
+    fit::subtle::scheduler::task_queue tasks;
+    AcceptIncomingTasksLocked();
+    guarded_.scheduler_.take_all_tasks(&tasks);
+    const bool can_delete_self = guarded_.was_shutdown_ &&
+                                 !guarded_.dispatch_pending_ &&
+                                 !guarded_.scheduler_.has_outstanding_tickets();
+
+    lock.unlock();
+
+    if (can_delete_self) {
+        delete this;
+    }
+}
+
+} // namespace async
diff --git a/pkg/async-cpp/include/lib/async/cpp/executor.h b/pkg/async-cpp/include/lib/async/cpp/executor.h
new file mode 100644
index 0000000..00d6a10
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/executor.h
@@ -0,0 +1,174 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ASYNC_CPP_EXECUTOR_H_
+#define LIB_ASYNC_CPP_EXECUTOR_H_
+
+#include <mutex>
+
+#include <lib/async/dispatcher.h>
+#include <lib/async/task.h>
+#include <lib/fit/promise.h>
+#include <lib/fit/scheduler.h>
+#include <lib/fit/thread_safety.h>
+#include <lib/zx/time.h>
+
+namespace async {
+
+// Execution context for an asynchronous task that runs within the scope
+// of an |async_dispatcher_t|'s dispatch loop, such as a |async::Promise|.
+class Context : public fit::context {
+public:
+    // Gets the executor's |async_dispatcher_t|, never null.
+    virtual async_dispatcher_t* dispatcher() const = 0;
+
+protected:
+    virtual ~Context() = default;
+};
+
+// An asynchronous task executor that wraps an |async_dispatcher_t|.
+//
+// This allows asynchronous tasks, such as promises, to be evaluated alongside
+// other asynchronous operations managed by the |async_dispatcher_t|.
+class Executor final : public fit::executor {
+public:
+    // Wraps the specified dispatcher.
+    //
+    // |dispatcher| must not be null and it must outlive the executor itself.
+    explicit Executor(async_dispatcher_t* dispatcher);
+
+    // Destroys the executor along with all of its remaining scheduled tasks
+    // that have yet to complete.
+    ~Executor() override;
+
+    // Gets the executor's |async_dispatcher_t|, never null.
+    async_dispatcher_t* dispatcher() const { return dispatcher_->dispatcher(); }
+
+    // Schedules a task for eventual execution by the executor.
+    //
+    // This method is thread-safe.
+    void schedule_task(fit::pending_task task) override;
+
+    Executor(const Executor&) = delete;
+    Executor(Executor&&) = delete;
+    Executor& operator=(const Executor&) = delete;
+    Executor& operator=(Executor&&) = delete;
+
+private:
+    // The dispatcher runs tasks, provides the suspended task resolver, and
+    // provides the task context.
+    //
+    // The lifetime of this object is somewhat complex since there are pointers
+    // to it from multiple sources which are released in different ways.
+    //
+    // - |Executor| holds a pointer in |dispatcher_| which it releases after
+    //   calling |Shutdown()| to inform the dispatcher of its own demise
+    // - |suspended_task| holds a pointer to the dispatcher's resolver
+    //   interface and the number of outstanding pointers corresponds to the
+    //   number of outstanding suspended task tickets tracked by |scheduler_|.
+    // - |async_dispatcher_t| holds a pointer to the dispatcher's async task
+    //   interface whenever dispatch is pending as indicated by |dispatch_pending_|.
+    //
+    // The dispatcher deletes itself once all pointers have been released.
+    // See also |PurgeTasksAndMaybeDeleteSelfLocked()|.
+    class DispatcherImpl final : public fit::suspended_task::resolver,
+                                 public async::Context,
+                                 public async_task_t {
+    public:
+        DispatcherImpl(async_dispatcher_t* dispatcher,
+                       Executor* executor);
+
+        void Shutdown();
+        void ScheduleTask(fit::pending_task task);
+
+        // |executor()| and |dispatcher()| are presented on the |async::Context|
+        // so they are only accessible while |task_running_| is true which
+        // implies that |executor_| and |dispatcher_| have not been destroyed.
+        Executor* executor() const override { return executor_; }
+        async_dispatcher_t* dispatcher() const override { return dispatcher_; }
+
+        // Suspends the currently running task.  This method is presented
+        // on the |async::Context| so it can only be called while
+        // |task_running_| is true as above.
+        fit::suspended_task suspend_task() override;
+
+        // These methods implement the suspended task token contract.
+        // They may be called on any thread at any time.
+        fit::suspended_task::ticket duplicate_ticket(
+            fit::suspended_task::ticket ticket) override;
+        void resolve_ticket(
+            fit::suspended_task::ticket ticket, bool resume_task) override;
+
+    private:
+        ~DispatcherImpl() override;
+
+        // Callback from |async_dispatcher_t*|.
+        // Invokes |Dispatch()| to run all runnable tasks.
+        static void Dispatch(async_dispatcher_t* dispatcher,
+                             async_task_t* task, zx_status_t status);
+        void Dispatch(zx_status_t status);
+
+        // Runs the specified task.  Called by |Dispatch()|.
+        void RunTask(fit::pending_task* task);
+
+        // Attempts to schedule a call to |Dispatch()| on the async dispatcher.
+        // Returns true if a dispatch is pending.
+        bool ScheduleDispatchLocked() FIT_REQUIRES(guarded_.mutex_);
+
+        // Moves all tasks from |incoming_tasks_| to the |scheduler_| runnable queue.
+        void AcceptIncomingTasksLocked() FIT_REQUIRES(guarded_.mutex_);
+
+        // When |was_shutdown_| or |loop_failure_| is true, purges any tasks
+        // that remain and deletes the dispatcher if all outstanding references
+        // to it have gone away.  Should be called at points where one of these
+        // conditions changes.  Takes ownership of the lock and drops it.
+        void PurgeTasksAndMaybeDeleteSelfLocked(
+            std::unique_lock<std::mutex> lock) FIT_REQUIRES(guarded_.mutex_);
+
+        async_dispatcher_t* const dispatcher_;
+        Executor* const executor_;
+
+        // The queue of runnable tasks.
+        // Only accessed by |RunTask()| and |suspend_task()| which happens
+        // on the dispatch thread.
+        fit::subtle::scheduler::task_queue runnable_tasks_;
+
+        // The current suspended task ticket or 0 if none.
+        // Only accessed by |RunTask()| and |suspend_task()| which happens
+        // on the dispatch thread.
+        fit::suspended_task::ticket current_task_ticket_ = 0;
+
+        // A bunch of state that is guarded by a mutex.
+        struct {
+            std::mutex mutex_;
+
+            // True if the executor is about to be destroyed.
+            bool was_shutdown_ FIT_GUARDED(mutex_) = false;
+
+            // True if the underlying async_dispatcher_t reported an error.
+            bool loop_failure_ FIT_GUARDED(mutex_) = false;
+
+            // True if a call to |Dispatch()| is pending.
+            bool dispatch_pending_ FIT_GUARDED(mutex_) = false;
+
+            // True while |RunTask| is running a task.
+            bool task_running_ FIT_GUARDED(mutex_) = false;
+
+            // Holds tasks that have been scheduled on this dispatcher.
+            fit::subtle::scheduler scheduler_ FIT_GUARDED(mutex_);
+
+            // Newly scheduled tasks which have yet to be added to the
+            // runnable queue.  This allows the dispatch to distinguish between
+            // newly scheduled tasks and resumed tasks so it can manage them
+            // separately.  See comments in |Dispatch()|.
+            fit::subtle::scheduler::task_queue incoming_tasks_ FIT_GUARDED(mutex_);
+        } guarded_;
+    };
+
+    DispatcherImpl* dispatcher_;
+};
+
+} // namespace async
+
+#endif // LIB_ASYNC_CPP_EXECUTOR_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/irq.h b/pkg/async-cpp/include/lib/async/cpp/irq.h
new file mode 100644
index 0000000..ec1e2b7
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/irq.h
@@ -0,0 +1,144 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ASYNC_CPP_irq_H_
+#define LIB_ASYNC_CPP_irq_H_
+
+#include <lib/async/irq.h>
+#include <lib/fit/function.h>
+
+#include <utility>
+
+namespace async {
+
+// Holds context for an irq and its handler, with RAII semantics.
+// Automatically unbinds the irq when it goes out of scope.
+//
+// This class must only be used with single-threaded asynchronous dispatchers
+// and must only be accessed on the dispatch thread since it lacks internal
+// synchronization of its state.
+//
+// Concrete implementations: |async::Irq|, |async::IrqMethod|.
+// Please do not create subclasses of IrqBase outside of this library.
+class IrqBase {
+ protected:
+  explicit IrqBase(zx_handle_t object, zx_signals_t trigger, uint32_t options,
+                   async_irq_handler_t* handler);
+  ~IrqBase();
+
+  IrqBase(const IrqBase&) = delete;
+  IrqBase(IrqBase&&) = delete;
+  IrqBase& operator=(const IrqBase&) = delete;
+  IrqBase& operator=(IrqBase&&) = delete;
+
+ public:
+  // Gets or sets the interrupt object.
+  zx_handle_t object() const { return irq_.object; }
+  void set_object(zx_handle_t object) { irq_.object = object; }
+
+  // Begins asynchronously waiting for the object to receive one or more of
+  // the trigger signals.  Invokes the handler when the irq is triggered.
+  //
+  // Returns |ZX_OK| if the irq was successfully begun.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Begin(async_dispatcher_t* dispatcher);
+
+  // Cancels the irq.
+  //
+  // If successful, the irq's handler will not run.
+  //
+  // Returns |ZX_OK| if the irq was pending and it has been successfully
+  // canceled; its handler will not run again and can be released immediately.
+  // Returns |ZX_ERR_NOT_FOUND| if there was no pending irq either because it
+  // already completed, or had not been started.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Cancel();
+
+ protected:
+  template <typename T>
+  static T* Dispatch(async_irq* irq) {
+    static_assert(offsetof(IrqBase, irq_) == 0, "");
+    auto self = reinterpret_cast<IrqBase*>(irq);
+    return static_cast<T*>(self);
+  }
+
+ private:
+  async_irq_t irq_;
+  async_dispatcher_t* dispatcher_ = nullptr;
+};
+
+// An asynchronous IRQ whose handler is bound to a |async::irq::Handler| function.
+//
+// Prefer using |async::IrqMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class Irq final : public IrqBase {
+ public:
+  // Handles completion of asynchronous irq operations.
+  //
+  // The |status| is |ZX_OK| if the irq was satisfied and |signal| is non-null.
+  // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
+  // the task's handler ran or the task was canceled.
+  using Handler = fit::function<void(async_dispatcher_t* dispatcher, async::Irq* irq,
+                                     zx_status_t status, const zx_packet_interrupt_t* interrupt)>;
+
+  // Creates a irq with options == 0.
+  explicit Irq(zx_handle_t object = ZX_HANDLE_INVALID, zx_signals_t trigger = ZX_SIGNAL_NONE,
+               Handler handler = nullptr)
+      : Irq(object, trigger, 0, std::move(handler)) {}
+
+  // Creates a irq with the provided |options|.
+  explicit Irq(zx_handle_t object, zx_signals_t trigger, uint32_t options,
+               Handler handler = nullptr);
+
+  ~Irq();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_irq_t* irq, zx_status_t status,
+                          const zx_packet_interrupt_t* signal);
+
+  Handler handler_;
+};
+
+// An asynchronous irq whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle(async_dispatcher_t* dispatcher, async::IrqBase* irq, zx_status_t status,
+//                 const zx_packet_interrupt_t* interrupt) { ... }
+//     async::IrqMethod<Foo, &Foo::Handle> irq_{this};
+// };
+template <class Class,
+          void (Class::*method)(async_dispatcher_t* dispatcher, async::IrqBase* irq,
+                                zx_status_t status, const zx_packet_interrupt_t* interrupt)>
+class IrqMethod final : public IrqBase {
+ public:
+  // Creates a irqMethod with options == 0.
+  explicit IrqMethod(Class* instance, zx_handle_t object = ZX_HANDLE_INVALID,
+                     zx_signals_t trigger = ZX_SIGNAL_NONE)
+      : IrqMethod(instance, object, trigger, 0) {}
+
+  // Creates a IrqMethod with the provided |options|.
+  explicit IrqMethod(Class* instance, zx_handle_t object, zx_signals_t trigger, uint32_t options)
+      : IrqBase(object, trigger, options, &IrqMethod::CallHandler), instance_(instance) {}
+
+  ~IrqMethod() = default;
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_irq_t* irq, zx_status_t status,
+                          const zx_packet_interrupt_t* interrupt) {
+    auto self = Dispatch<IrqMethod>(irq);
+    (self->instance_->*method)(dispatcher, self, status, interrupt);
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_irq_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/paged_vmo.h b/pkg/async-cpp/include/lib/async/cpp/paged_vmo.h
new file mode 100644
index 0000000..e337ccc
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/paged_vmo.h
@@ -0,0 +1,127 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ASYNC_CPP_PAGED_VMO_H_
+#define LIB_ASYNC_CPP_PAGED_VMO_H_
+
+#include <lib/async/paged_vmo.h>
+#include <lib/fit/function.h>
+#include <lib/zx/pager.h>
+#include <lib/zx/vmo.h>
+
+namespace async {
+
+// Holds content for a paged vmo packet receiver and its handler.
+//
+// After successfully binding the port, the client is responsible for
+// retaining the structure in memory (and unmodified) until all packets have
+// been received by the handler or the dispatcher shuts down.
+//
+// Concrete implementations: |async::PagedVmo|, |async::PagedVmoMethod|.
+// Please do not create subclasses of PagedVmoBase outside of this library.
+class PagedVmoBase {
+ protected:
+  explicit PagedVmoBase(async_paged_vmo_handler_t* handler);
+  ~PagedVmoBase();
+
+  PagedVmoBase(const PagedVmoBase&) = delete;
+  PagedVmoBase(PagedVmoBase&&) = delete;
+  PagedVmoBase& operator=(const PagedVmoBase&) = delete;
+  PagedVmoBase& operator=(PagedVmoBase&&) = delete;
+
+  template <typename T>
+  static T* Dispatch(async_paged_vmo_t* paged_vmo, zx_status_t status) {
+    static_assert(offsetof(PagedVmoBase, paged_vmo_) == 0, "Non-castable offset");
+    auto self = reinterpret_cast<PagedVmoBase*>(paged_vmo);
+    if (status != ZX_OK) {
+      self->dispatcher_ = nullptr;
+    }
+    return static_cast<T*>(self);
+  }
+
+ public:
+  // Return true if this object is bound to a VMO.
+  bool is_bound() const { return dispatcher_ != nullptr; }
+
+  // Creates a paged VMO registered with |pager|, which will receive notifications on the
+  // receiver provided in the constructor of |PagedVmoBase|.
+  //
+  // Returns |ZX_ERR_ALREADY_EXISTS| if this object is already associated with a VMO.
+  // May return any error from |async_create_paged_vmo()|.
+  zx_status_t CreateVmo(async_dispatcher_t* dispatcher, zx::unowned_pager pager, uint32_t options,
+                        uint64_t vmo_size, zx::vmo* vmo_out);
+
+  // Detach the paged VMO from the underlying port.
+  //
+  // Returns |ZX_OK| if the VMO is successfully detached.
+  // Returns |ZX_ERR_NOT_FOUND| if this object is not bound.
+  // May return any error from |async_detach_paged_vmo()|.
+  zx_status_t Detach();
+
+ private:
+  async_paged_vmo_t paged_vmo_ = {};
+  async_dispatcher_t* dispatcher_ = nullptr;
+};
+
+// A receiver whose handler is bound to a |async::PagedVmo::Handler| function.
+//
+// Prefer using |async::PagedVmoMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class PagedVmo final : public PagedVmoBase {
+ public:
+  // Handles receipt of packets containing page requests.
+  //
+  // The |status| is |ZX_OK| if the packet was successfully delivered and |page_request|
+  // contains the information from the packet, otherwise |page_request| is null.
+  using Handler =
+      fit::function<void(async_dispatcher_t* dispatcher, async::PagedVmo* paged_vmo,
+                         zx_status_t status, const zx_packet_page_request_t* page_request)>;
+
+  explicit PagedVmo(Handler handler = nullptr);
+  ~PagedVmo();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                          zx_status_t status, const zx_packet_page_request_t* page_request);
+
+  Handler handler_;
+};
+
+// A receiver whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//   void Handle(async_dispatcher_t* dispatcher,
+//               async::PagedVmoBase* paged_vmo,
+//               zx_status_t status,
+//               const zx_packet_page_request_t* page_request) {
+//     ...
+//   }
+//   async::PagedVmoMethod<Foo, &Foo::Handle> paged_vmo_{this};
+// };
+template <class Class,
+          void (Class::*method)(async_dispatcher_t* dispatcher, async::PagedVmoBase* receiver,
+                                zx_status_t status, const zx_packet_page_request_t* page_request)>
+class PagedVmoMethod final : public PagedVmoBase {
+ public:
+  explicit PagedVmoMethod(Class* instance)
+      : PagedVmoBase(&PagedVmoMethod::CallHandler), instance_(instance) {}
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                          zx_status_t status, const zx_packet_page_request_t* page_request) {
+    auto self = Dispatch<PagedVmoMethod>(paged_vmo, status);
+    (self->instance_->*method)(dispatcher, self, status, page_request);
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_PAGED_VMO_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/receiver.h b/pkg/async-cpp/include/lib/async/cpp/receiver.h
new file mode 100644
index 0000000..273049f
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/receiver.h
@@ -0,0 +1,115 @@
+// 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.
+
+#ifndef LIB_ASYNC_CPP_RECEIVER_H_
+#define LIB_ASYNC_CPP_RECEIVER_H_
+
+#include <lib/async/receiver.h>
+#include <lib/fit/function.h>
+
+#include <utility>
+
+namespace async {
+
+// Holds content for a packet receiver and its handler.
+//
+// After successfully queuing packets to the receiver, the client is responsible
+// for retaining the structure in memory (and unmodified) until all packets have
+// been received by the handler or the dispatcher shuts down.  There is no way
+// to cancel a packet which has been queued.
+//
+// Multiple packets may be delivered to the same receiver concurrently.
+//
+// Concrete implementations: |async::Receiver|, |async::ReceiverMethod|.
+// Please do not create subclasses of ReceiverBase outside of this library.
+class ReceiverBase {
+ protected:
+  explicit ReceiverBase(async_receiver_handler_t* handler);
+  ~ReceiverBase();
+
+  ReceiverBase(const ReceiverBase&) = delete;
+  ReceiverBase(ReceiverBase&&) = delete;
+  ReceiverBase& operator=(const ReceiverBase&) = delete;
+  ReceiverBase& operator=(ReceiverBase&&) = delete;
+
+ public:
+  // Enqueues a packet of data for delivery to a receiver.
+  //
+  // The |data| will be copied into the packet.  May be NULL to create a
+  // zero-initialized packet payload.
+  //
+  // Returns |ZX_OK| if the packet was successfully enqueued.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t QueuePacket(async_dispatcher_t* dispatcher, const zx_packet_user_t* data = nullptr);
+
+ protected:
+  template <typename T>
+  static T* Dispatch(async_receiver_t* receiver) {
+    static_assert(offsetof(ReceiverBase, receiver_) == 0, "");
+    auto self = reinterpret_cast<ReceiverBase*>(receiver);
+    return static_cast<T*>(self);
+  }
+
+ private:
+  async_receiver_t receiver_;
+};
+
+// A receiver whose handler is bound to a |async::Task::Handler| function.
+//
+// Prefer using |async::ReceiverMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class Receiver final : public ReceiverBase {
+ public:
+  // Handles receipt of packets containing user supplied data.
+  //
+  // The |status| is |ZX_OK| if the packet was successfully delivered and |data|
+  // contains the information from the packet, otherwise |data| is null.
+  using Handler = fit::function<void(async_dispatcher_t* dispatcher, async::Receiver* receiver,
+                                     zx_status_t status, const zx_packet_user_t* data)>;
+
+  explicit Receiver(Handler handler = nullptr);
+  ~Receiver();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
+                          zx_status_t status, const zx_packet_user_t* data);
+
+  Handler handler_;
+};
+
+// A receiver whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle(async_dispatcher_t* dispatcher, async::ReceiverBase* receiver, zx_status_t
+//     status,
+//                 const zx_packet_user_t* data) { ... }
+//     async::ReceiverMethod<Foo, &Foo::Handle> receiver_{this};
+// };
+template <class Class,
+          void (Class::*method)(async_dispatcher_t* dispatcher, async::ReceiverBase* receiver,
+                                zx_status_t status, const zx_packet_user_t* data)>
+class ReceiverMethod final : public ReceiverBase {
+ public:
+  explicit ReceiverMethod(Class* instance)
+      : ReceiverBase(&ReceiverMethod::CallHandler), instance_(instance) {}
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
+                          zx_status_t status, const zx_packet_user_t* data) {
+    auto self = Dispatch<ReceiverMethod>(receiver);
+    (self->instance_->*method)(dispatcher, self, status, data);
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_RECEIVER_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/task.h b/pkg/async-cpp/include/lib/async/cpp/task.h
new file mode 100644
index 0000000..0343919
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/task.h
@@ -0,0 +1,231 @@
+// 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.
+
+#ifndef LIB_ASYNC_CPP_TASK_H_
+#define LIB_ASYNC_CPP_TASK_H_
+
+#include <lib/async/task.h>
+#include <lib/fit/function.h>
+#include <lib/zx/time.h>
+
+#include <utility>
+
+namespace async {
+
+// Posts a task to invoke |handler| with a deadline of now.
+//
+// The handler will not run if the dispatcher shuts down before it comes due.
+//
+// Returns |ZX_OK| if the task was successfully posted.
+// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+zx_status_t PostTask(async_dispatcher_t* dispatcher, fit::closure handler);
+
+// Posts a task to invoke |handler| with a deadline expressed as a |delay| from now.
+//
+// The handler will not run if the dispatcher shuts down before it comes due.
+//
+// Returns |ZX_OK| if the task was successfully posted.
+// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+zx_status_t PostDelayedTask(async_dispatcher_t* dispatcher, fit::closure handler,
+                            zx::duration delay);
+
+// Posts a task to invoke |handler| with the specified |deadline|.
+//
+// The handler will not run if the dispatcher shuts down before it comes due.
+//
+// Returns |ZX_OK| if the task was successfully posted.
+// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+zx_status_t PostTaskForTime(async_dispatcher_t* dispatcher, fit::closure handler,
+                            zx::time deadline);
+
+// Holds context for a task and its handler, with RAII semantics.
+// Automatically cancels the task when it goes out of scope.
+//
+// After successfully posting the task, the client is responsible for retaining
+// the structure in memory (and unmodified) until the task's handler runs, the task
+// is successfully canceled, or the dispatcher shuts down.  Thereafter, the task
+// may be posted again or destroyed.
+//
+// This class must only be used with single-threaded asynchronous dispatchers
+// and must only be accessed on the dispatch thread since it lacks internal
+// synchronization of its state.
+//
+// Concrete implementations: |async::Task|, |async::TaskMethod|,
+//   |async::TaskClosure|, |async::TaskClosureMethod|.
+// Please do not create subclasses of TaskBase outside of this library.
+class TaskBase {
+ protected:
+  explicit TaskBase(async_task_handler_t* handler);
+  ~TaskBase();
+
+  TaskBase(const TaskBase&) = delete;
+  TaskBase(TaskBase&&) = delete;
+  TaskBase& operator=(const TaskBase&) = delete;
+  TaskBase& operator=(TaskBase&&) = delete;
+
+ public:
+  // Returns true if the task has been posted and has not yet executed or been canceled.
+  bool is_pending() const { return dispatcher_ != nullptr; }
+
+  // The last deadline with which the task was posted, or |zx::time::infinite()|
+  // if it has never been posted.
+  zx::time last_deadline() const { return zx::time(task_.deadline); }
+
+  // Posts a task to invoke the handler with a deadline of now.
+  //
+  // Returns |ZX_OK| if the task was successfully posted.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_ALREADY_EXISTS| if the task is already pending.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Post(async_dispatcher_t* dispatcher);
+
+  // Posts a task to invoke the handler with a deadline expressed as a |delay| from now.
+  //
+  // Returns |ZX_OK| if the task was successfully posted.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_ALREADY_EXISTS| if the task is already pending.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t PostDelayed(async_dispatcher_t* dispatcher, zx::duration delay);
+
+  // Posts a task to invoke the handler with the specified |deadline|.
+  //
+  // The |deadline| must be expressed in the time base used by the asynchronous
+  // dispatcher (usually |ZX_CLOCK_MONOTONIC| except in unit tests).
+  // See |async_now()| for details.
+  //
+  // Returns |ZX_OK| if the task was successfully posted.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_ALREADY_EXISTS| if the task is already pending.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t PostForTime(async_dispatcher_t* dispatcher, zx::time deadline);
+
+  // Cancels the task.
+  //
+  // If successful, the task's handler will not run.
+  //
+  // Returns |ZX_OK| if the task was pending and it has been successfully
+  // canceled; its handler will not run again and can be released immediately.
+  // Returns |ZX_ERR_NOT_FOUND| if task was not pending either because its
+  // handler already ran, or the task had not been posted.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Cancel();
+
+ protected:
+  template <typename T>
+  static T* Dispatch(async_task_t* task) {
+    static_assert(offsetof(TaskBase, task_) == 0, "");
+    auto self = reinterpret_cast<TaskBase*>(task);
+    self->dispatcher_ = nullptr;
+    return static_cast<T*>(self);
+  }
+
+ private:
+  async_task_t task_;
+  async_dispatcher_t* dispatcher_ = nullptr;
+};
+
+// A task whose handler is bound to a |async::Task::Handler| function.
+//
+// Prefer using |async::TaskMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class Task final : public TaskBase {
+ public:
+  // Handles execution of a posted task.
+  //
+  // The |status| is |ZX_OK| if the task's deadline elapsed and the task should run.
+  // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
+  // the task's handler ran or the task was canceled.
+  using Handler =
+      fit::function<void(async_dispatcher_t* dispatcher, async::Task* task, zx_status_t status)>;
+
+  explicit Task(Handler handler = nullptr);
+  ~Task();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status);
+
+  Handler handler_;
+};
+
+// A task whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle(async_dispatcher_t* dispatcher, async::TaskBase* task, zx_status_t status) { ...
+//     } async::TaskMethod<Foo, &Foo::Handle> task_{this};
+// };
+template <class Class, void (Class::*method)(async_dispatcher_t* dispatcher, async::TaskBase* task,
+                                             zx_status_t status)>
+class TaskMethod final : public TaskBase {
+ public:
+  explicit TaskMethod(Class* instance) : TaskBase(&TaskMethod::CallHandler), instance_(instance) {}
+  ~TaskMethod() = default;
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status) {
+    auto self = Dispatch<TaskMethod>(task);
+    (self->instance_->*method)(dispatcher, self, status);
+  }
+
+  Class* const instance_;
+};
+
+// A task whose handler is bound to a |fit::closure| function with no arguments.
+// The closure is not invoked when errors occur since it doesn't have a |zx_status_t|
+// argument.
+//
+// Prefer using |async::TaskClosureMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class TaskClosure final : public TaskBase {
+ public:
+  explicit TaskClosure(fit::closure handler = nullptr);
+  ~TaskClosure();
+
+  void set_handler(fit::closure handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status);
+
+  fit::closure handler_;
+};
+
+// A task whose handler is bound to a fixed class member function with no arguments.
+// The closure is not invoked when errors occur since it doesn't have a |zx_status_t|
+// argument.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle() { ... }
+//     async::TaskClosureMethod<Foo, &Foo::Handle> trap_{this};
+// };
+template <class Class, void (Class::*method)()>
+class TaskClosureMethod final : public TaskBase {
+ public:
+  explicit TaskClosureMethod(Class* instance)
+      : TaskBase(&TaskClosureMethod::CallHandler), instance_(instance) {}
+  ~TaskClosureMethod() = default;
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status) {
+    auto self = Dispatch<TaskClosureMethod>(task);  // must do this if status is not ok
+    if (status == ZX_OK) {
+      (self->instance_->*method)();
+    }
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_TASK_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/time.h b/pkg/async-cpp/include/lib/async/cpp/time.h
new file mode 100644
index 0000000..df7950e
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/time.h
@@ -0,0 +1,20 @@
+// 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.
+
+#ifndef LIB_ASYNC_CPP_TIME_H_
+#define LIB_ASYNC_CPP_TIME_H_
+
+#include <lib/async/time.h>
+#include <lib/zx/time.h>
+
+namespace async {
+
+// Returns the current time in the dispatcher's timebase.
+// For most loops, this is generally obtained from |ZX_CLOCK_MONOTONIC|
+// but certain loops may use a different timebase, notably for testing.
+inline zx::time Now(async_dispatcher_t* dispatcher) { return zx::time(async_now(dispatcher)); }
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_TIME_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/trap.h b/pkg/async-cpp/include/lib/async/cpp/trap.h
new file mode 100644
index 0000000..35f06ec
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/trap.h
@@ -0,0 +1,123 @@
+// 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.
+
+#ifndef LIB_ASYNC_CPP_TRAP_H_
+#define LIB_ASYNC_CPP_TRAP_H_
+
+#include <lib/async/trap.h>
+#include <lib/fit/function.h>
+#include <lib/zx/guest.h>
+
+#include <utility>
+
+namespace async {
+
+// Holds context for a bell trap and its handler.
+//
+// After successfully posting setting the trap, the client is responsible for retaining
+// the structure in memory (and unmodified) until the guest has been destroyed or the
+// dispatcher shuts down.  There is no way to cancel a trap which has been set.
+//
+// Concrete implementations: |async::GuestBellTrap|, |async::GuestBellTrapMethod|.
+// Please do not create subclasses of GuestBellTrapBase outside of this library.
+class GuestBellTrapBase {
+ protected:
+  explicit GuestBellTrapBase(async_guest_bell_trap_handler_t* handler);
+  ~GuestBellTrapBase();
+
+  GuestBellTrapBase(const GuestBellTrapBase&) = delete;
+  GuestBellTrapBase(GuestBellTrapBase&&) = delete;
+  GuestBellTrapBase& operator=(const GuestBellTrapBase&) = delete;
+  GuestBellTrapBase& operator=(GuestBellTrapBase&&) = delete;
+
+ public:
+  // Sets a bell trap in the guest to be handled asynchronously via a handler.
+  //
+  // |guest| is the handle of the guest the trap will be set on.
+  // |addr| is the base address for the trap in the guest's physical address space.
+  // |length| is the size of the trap in the guest's physical address space.
+  //
+  // Returns |ZX_OK| if the trap was successfully set.
+  // Returns |ZX_ERR_ACCESS_DENIED| if the guest does not have |ZX_RIGHT_WRITE|.
+  // Returns |ZX_ERR_ALREADY_EXISTS| if a bell trap with the same |addr| exists.
+  // Returns |ZX_ERR_INVALID_ARGS| if |addr| or |length| are invalid.
+  // Returns |ZX_ERR_OUT_OF_RANGE| if |addr| or |length| are out of range of the
+  // address space.
+  // Returns |ZX_ERR_WRONG_TYPE| if |guest| is not a handle to a guest.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  //
+  // This operation is thread-safe.
+  zx_status_t SetTrap(async_dispatcher_t* dispatcher, const zx::guest& guest, zx_vaddr_t addr,
+                      size_t length);
+
+ protected:
+  template <typename T>
+  static T* Dispatch(async_guest_bell_trap_t* trap) {
+    static_assert(offsetof(GuestBellTrapBase, trap_) == 0, "");
+    auto self = reinterpret_cast<GuestBellTrapBase*>(trap);
+    return static_cast<T*>(self);
+  }
+
+ private:
+  async_guest_bell_trap_t trap_;
+};
+
+// A bell trap whose handler is bound to a |async::Task::Handler| function.
+//
+// Prefer using |async::GuestBellTrapMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class GuestBellTrap final : public GuestBellTrapBase {
+ public:
+  // Handles an asynchronous trap access.
+  //
+  // The |status| is |ZX_OK| if the bell was received and |bell| contains the
+  // information from the packet, otherwise |bell| is null.
+  using Handler = fit::function<void(async_dispatcher_t* dispatcher, async::GuestBellTrap* trap,
+                                     zx_status_t status, const zx_packet_guest_bell_t* bell)>;
+
+  explicit GuestBellTrap(Handler handler = nullptr);
+  ~GuestBellTrap();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
+                          zx_status_t status, const zx_packet_guest_bell_t* bell);
+
+  Handler handler_;
+};
+
+// A bell trap whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle(async_dispatcher_t* dispatcher, async::GuestBellTrapBase* trap, zx_status_t
+//     status,
+//                 const zx_packet_guest_bell_t* bell) { ... }
+//     async::GuestBellTrapMethod<Foo, &Foo::Handle> trap_{this};
+// };
+template <class Class,
+          void (Class::*method)(async_dispatcher_t* dispatcher, async::GuestBellTrapBase* trap,
+                                zx_status_t status, const zx_packet_guest_bell_t* bell)>
+class GuestBellTrapMethod final : public GuestBellTrapBase {
+ public:
+  explicit GuestBellTrapMethod(Class* instance)
+      : GuestBellTrapBase(&GuestBellTrapMethod::CallHandler), instance_(instance) {}
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
+                          zx_status_t status, const zx_packet_guest_bell_t* bell) {
+    auto self = Dispatch<GuestBellTrapMethod>(trap);
+    (self->instance_->*method)(dispatcher, self, status, bell);
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_TRAP_H_
diff --git a/pkg/async-cpp/include/lib/async/cpp/wait.h b/pkg/async-cpp/include/lib/async/cpp/wait.h
new file mode 100644
index 0000000..0f0d88d
--- /dev/null
+++ b/pkg/async-cpp/include/lib/async/cpp/wait.h
@@ -0,0 +1,200 @@
+// 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.
+
+#ifndef LIB_ASYNC_CPP_WAIT_H_
+#define LIB_ASYNC_CPP_WAIT_H_
+
+#include <lib/async/wait.h>
+#include <lib/fit/function.h>
+
+#include <utility>
+
+namespace async {
+
+// Holds context for an asynchronous wait and its handler, with RAII semantics.
+// Automatically cancels the wait when it goes out of scope.
+//
+// After successfully beginning the wait, the client is responsible for retaining
+// the structure in memory (and unmodified) until the wait's handler runs, the wait
+// is successfully canceled, or the dispatcher shuts down.  Thereafter, the wait
+// may be begun again or destroyed.
+//
+// This class must only be used with single-threaded asynchronous dispatchers
+// and must only be accessed on the dispatch thread since it lacks internal
+// synchronization of its state.
+//
+// Concrete implementations: |async::Wait|, |async::WaitMethod|.
+// Please do not create subclasses of WaitBase outside of this library.
+class WaitBase {
+ protected:
+  explicit WaitBase(zx_handle_t object, zx_signals_t trigger, uint32_t options,
+                    async_wait_handler_t* handler);
+  ~WaitBase();
+
+  WaitBase(const WaitBase&) = delete;
+  WaitBase(WaitBase&&) = delete;
+  WaitBase& operator=(const WaitBase&) = delete;
+  WaitBase& operator=(WaitBase&&) = delete;
+
+ public:
+  // Gets or sets the object to wait for signals on.
+  zx_handle_t object() const { return wait_.object; }
+  void set_object(zx_handle_t object) { wait_.object = object; }
+
+  // Gets or sets the signals to wait for.
+  zx_signals_t trigger() const { return wait_.trigger; }
+  void set_trigger(zx_signals_t trigger) { wait_.trigger = trigger; }
+
+  // Gets or sets the options to wait with. See zx_object_wait_async().
+  uint32_t options() const { return wait_.options; }
+  void set_options(uint32_t options) { wait_.options = options; }
+
+  // Returns true if the wait has begun and not yet completed or been canceled.
+  bool is_pending() const { return dispatcher_ != nullptr; }
+
+  // Begins asynchronously waiting for the object to receive one or more of
+  // the trigger signals.  Invokes the handler when the wait completes.
+  //
+  // The wait's handler will be invoked exactly once unless the wait is canceled.
+  // When the dispatcher is shutting down (being destroyed), the handlers of
+  // all remaining waits will be invoked with a status of |ZX_ERR_CANCELED|.
+  //
+  // Returns |ZX_OK| if the wait was successfully begun.
+  // Returns |ZX_ERR_ACCESS_DENIED| if the object does not have |ZX_RIGHT_WAIT|.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Begin(async_dispatcher_t* dispatcher);
+
+  // Cancels the wait.
+  //
+  // If successful, the wait's handler will not run.
+  //
+  // Returns |ZX_OK| if the wait was pending and it has been successfully
+  // canceled; its handler will not run again and can be released immediately.
+  // Returns |ZX_ERR_NOT_FOUND| if there was no pending wait either because it
+  // already completed, or had not been started.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Cancel();
+
+ protected:
+  template <typename T>
+  static T* Dispatch(async_wait* wait) {
+    static_assert(offsetof(WaitBase, wait_) == 0, "");
+    auto self = reinterpret_cast<WaitBase*>(wait);
+    self->dispatcher_ = nullptr;
+    return static_cast<T*>(self);
+  }
+
+ private:
+  async_wait_t wait_;
+  async_dispatcher_t* dispatcher_ = nullptr;
+};
+
+// An asynchronous wait whose handler is bound to a |async::Wait::Handler| function.
+//
+// Prefer using |async::WaitMethod| instead for binding to a fixed class member
+// function since it is more efficient to dispatch.
+class Wait final : public WaitBase {
+ public:
+  // Handles completion of asynchronous wait operations.
+  //
+  // The |status| is |ZX_OK| if the wait was satisfied and |signal| is non-null.
+  // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
+  // the task's handler ran or the task was canceled.
+  using Handler = fit::function<void(async_dispatcher_t* dispatcher, async::Wait* wait,
+                                     zx_status_t status, const zx_packet_signal_t* signal)>;
+
+  explicit Wait(zx_handle_t object = ZX_HANDLE_INVALID, zx_signals_t trigger = ZX_SIGNAL_NONE,
+                uint32_t options = 0, Handler handler = nullptr);
+
+  ~Wait();
+
+  void set_handler(Handler handler) { handler_ = std::move(handler); }
+  bool has_handler() const { return !!handler_; }
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
+                          const zx_packet_signal_t* signal);
+
+  Handler handler_;
+};
+
+// An asynchronous wait whose handler is bound to a |async::WaitOnce::Handler| function, but that
+// handler can only be called once, at which point the handler is destroyed.
+//
+// This type of wait is particularly useful for handlers that will delete the wait object itself
+// since the handler will be moved to the stack prior to being called.
+class WaitOnce final : public WaitBase {
+ public:
+  // Handles completion of asynchronous wait operations.
+  //
+  // The |status| is |ZX_OK| if the wait was satisfied and |signal| is non-null.
+  // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
+  // the task's handler ran or the task was canceled.
+  using Handler = fit::function<void(async_dispatcher_t* dispatcher, async::WaitOnce* wait,
+                                     zx_status_t status, const zx_packet_signal_t* signal)>;
+
+  explicit WaitOnce(zx_handle_t object = ZX_HANDLE_INVALID, zx_signals_t trigger = ZX_SIGNAL_NONE,
+                    uint32_t options = 0);
+
+  ~WaitOnce();
+
+  // Begins asynchronously waiting for the object to receive one or more of
+  // the trigger signals.  Invokes the handler when the wait completes.
+  //
+  // The wait's handler will be invoked exactly once unless the wait is canceled.
+  // When the dispatcher is shutting down (being destroyed), the handlers of
+  // all remaining waits will be invoked with a status of |ZX_ERR_CANCELED|.
+  //
+  // As the handler is destroyed on each invocation, a new handler must be supplied at each call
+  // to Begin().
+  //
+  // Returns |ZX_OK| if the wait was successfully begun.
+  // Returns |ZX_ERR_ACCESS_DENIED| if the object does not have |ZX_RIGHT_WAIT|.
+  // Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+  // Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+  zx_status_t Begin(async_dispatcher_t* dispatcher, Handler handler);
+
+ private:
+  // Hide the base Begin() signature in favor of the one that requires a handler.
+  using WaitBase::Begin;
+
+  static void CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
+                          const zx_packet_signal_t* signal);
+
+  Handler handler_;
+};
+
+// An asynchronous wait whose handler is bound to a fixed class member function.
+//
+// Usage:
+//
+// class Foo {
+//     void Handle(async_dispatcher_t* dispatcher, async::WaitBase* wait, zx_status_t status,
+//                 const zx_packet_signal_t* signal) { ... }
+//     async::WaitMethod<Foo, &Foo::Handle> wait_{this};
+// };
+template <class Class, void (Class::*method)(async_dispatcher_t* dispatcher, async::WaitBase* wait,
+                                             zx_status_t status, const zx_packet_signal_t* signal)>
+class WaitMethod final : public WaitBase {
+ public:
+  explicit WaitMethod(Class* instance, zx_handle_t object = ZX_HANDLE_INVALID,
+                      zx_signals_t trigger = ZX_SIGNAL_NONE, uint32_t options = 0)
+      : WaitBase(object, trigger, options, &WaitMethod::CallHandler), instance_(instance) {}
+
+  ~WaitMethod() = default;
+
+ private:
+  static void CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
+                          const zx_packet_signal_t* signal) {
+    auto self = Dispatch<WaitMethod>(wait);
+    (self->instance_->*method)(dispatcher, self, status, signal);
+  }
+
+  Class* const instance_;
+};
+
+}  // namespace async
+
+#endif  // LIB_ASYNC_CPP_WAIT_H_
diff --git a/pkg/async-cpp/irq.cc b/pkg/async-cpp/irq.cc
new file mode 100644
index 0000000..d4cc9af
--- /dev/null
+++ b/pkg/async-cpp/irq.cc
@@ -0,0 +1,64 @@
+// Copyright 2019 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.
+
+#include <lib/async/cpp/irq.h>
+#include <zircon/assert.h>
+
+#include <utility>
+
+namespace async {
+
+IrqBase::IrqBase(zx_handle_t object, zx_signals_t trigger, uint32_t options,
+                 async_irq_handler_t* handler)
+    : irq_{{ASYNC_STATE_INIT}, handler, object} {}
+
+IrqBase::~IrqBase() {
+  if (dispatcher_) {
+    // Failure to cancel here may result in a dangling pointer...
+    zx_status_t status = async_unbind_irq(dispatcher_, &irq_);
+    ZX_ASSERT_MSG(status == ZX_OK, "status=%d", status);
+  }
+}
+
+zx_status_t IrqBase::Begin(async_dispatcher_t* dispatcher) {
+  if (dispatcher_)
+    return ZX_ERR_ALREADY_EXISTS;
+
+  dispatcher_ = dispatcher;
+  zx_status_t status = async_bind_irq(dispatcher, &irq_);
+  if (status != ZX_OK) {
+    dispatcher_ = nullptr;
+  }
+  return status;
+}
+
+zx_status_t IrqBase::Cancel() {
+  if (!dispatcher_)
+    return ZX_ERR_NOT_FOUND;
+
+  async_dispatcher_t* dispatcher = dispatcher_;
+  dispatcher_ = nullptr;
+
+  zx_status_t status = async_unbind_irq(dispatcher, &irq_);
+  // |dispatcher| is required to be single-threaded, Cancel() is
+  // only supposed to be called on |dispatcher|'s thread, and
+  // we verified that the wait was pending before calling
+  // async_cancel_wait(). Assuming that |dispatcher| never queues
+  // a wait, |wait_| must have been pending with |dispatcher|.
+  ZX_DEBUG_ASSERT(status != ZX_ERR_NOT_FOUND);
+  return status;
+}
+
+Irq::Irq(zx_handle_t object, zx_signals_t trigger, uint32_t options, Handler handler)
+    : IrqBase(object, trigger, options, &Irq::CallHandler), handler_(std::move(handler)) {}
+
+Irq::~Irq() = default;
+
+void Irq::CallHandler(async_dispatcher_t* dispatcher, async_irq_t* irq, zx_status_t status,
+                      const zx_packet_interrupt_t* signal) {
+  auto self = Dispatch<Irq>(irq);
+  self->handler_(dispatcher, self, status, signal);
+}
+
+}  // namespace async
diff --git a/pkg/async-cpp/meta.json b/pkg/async-cpp/meta.json
new file mode 100644
index 0000000..78302af
--- /dev/null
+++ b/pkg/async-cpp/meta.json
@@ -0,0 +1,32 @@
+{
+  "banjo_deps": [],
+  "deps": [
+    "async",
+    "fit",
+    "zx"
+  ],
+  "fidl_deps": [],
+  "headers": [
+    "pkg/async-cpp/include/lib/async/cpp/executor.h",
+    "pkg/async-cpp/include/lib/async/cpp/irq.h",
+    "pkg/async-cpp/include/lib/async/cpp/paged_vmo.h",
+    "pkg/async-cpp/include/lib/async/cpp/receiver.h",
+    "pkg/async-cpp/include/lib/async/cpp/task.h",
+    "pkg/async-cpp/include/lib/async/cpp/time.h",
+    "pkg/async-cpp/include/lib/async/cpp/trap.h",
+    "pkg/async-cpp/include/lib/async/cpp/wait.h"
+  ],
+  "include_dir": "pkg/async-cpp/include",
+  "name": "async-cpp",
+  "root": "pkg/async-cpp",
+  "sources": [
+    "pkg/async-cpp/executor.cc",
+    "pkg/async-cpp/irq.cc",
+    "pkg/async-cpp/paged_vmo.cc",
+    "pkg/async-cpp/receiver.cc",
+    "pkg/async-cpp/task.cc",
+    "pkg/async-cpp/trap.cc",
+    "pkg/async-cpp/wait.cc"
+  ],
+  "type": "cc_source_library"
+}
\ No newline at end of file
diff --git a/pkg/async-cpp/paged_vmo.cc b/pkg/async-cpp/paged_vmo.cc
new file mode 100644
index 0000000..6e4be85
--- /dev/null
+++ b/pkg/async-cpp/paged_vmo.cc
@@ -0,0 +1,63 @@
+// Copyright 2019 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.
+
+#include <lib/async/cpp/paged_vmo.h>
+#include <zircon/assert.h>
+
+#include <utility>
+
+namespace async {
+
+PagedVmoBase::PagedVmoBase(async_paged_vmo_handler_t* handler)
+    : paged_vmo_{{ASYNC_STATE_INIT}, handler, ZX_HANDLE_INVALID, ZX_HANDLE_INVALID} {
+  ZX_DEBUG_ASSERT(handler);
+}
+
+PagedVmoBase::~PagedVmoBase() { Detach(); }
+
+zx_status_t PagedVmoBase::CreateVmo(async_dispatcher_t* dispatcher, zx::unowned_pager pager,
+                                    uint32_t options, uint64_t vmo_size, zx::vmo* vmo_out) {
+  if (dispatcher_) {
+    return ZX_ERR_ALREADY_EXISTS;
+  }
+
+  zx_status_t status = async_create_paged_vmo(dispatcher, &paged_vmo_, options, pager->get(),
+                                              vmo_size, vmo_out->reset_and_get_address());
+  if (status != ZX_OK) {
+    return status;
+  }
+  dispatcher_ = dispatcher;
+  paged_vmo_.pager = pager->get();
+  paged_vmo_.vmo = vmo_out->get();
+  return ZX_OK;
+}
+
+zx_status_t PagedVmoBase::Detach() {
+  if (!dispatcher_) {
+    return ZX_ERR_NOT_FOUND;
+  }
+
+  auto dispatcher = dispatcher_;
+  dispatcher_ = nullptr;
+
+  zx_status_t status = async_detach_paged_vmo(dispatcher, &paged_vmo_);
+  // |dispatcher| is required to be single-threaded, Detach() is only supposed to be called on
+  // |dispatcher|'s thread, and we verified that the port was bound before calling
+  // async_detach_paged_vmo().
+  ZX_DEBUG_ASSERT(status != ZX_ERR_NOT_FOUND);
+  return status;
+}
+
+PagedVmo::PagedVmo(Handler handler)
+    : PagedVmoBase(&PagedVmo::CallHandler), handler_(std::move(handler)) {}
+
+PagedVmo::~PagedVmo() = default;
+
+void PagedVmo::CallHandler(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                           zx_status_t status, const zx_packet_page_request_t* request) {
+  auto self = Dispatch<PagedVmo>(paged_vmo, status);
+  self->handler_(dispatcher, self, status, request);
+}
+
+}  // namespace async
diff --git a/pkg/async-cpp/receiver.cc b/pkg/async-cpp/receiver.cc
new file mode 100644
index 0000000..f1077b9
--- /dev/null
+++ b/pkg/async-cpp/receiver.cc
@@ -0,0 +1,32 @@
+// 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.
+
+#include <lib/async/cpp/receiver.h>
+
+#include <utility>
+
+namespace async {
+
+ReceiverBase::ReceiverBase(async_receiver_handler_t* handler)
+    : receiver_{{ASYNC_STATE_INIT}, handler} {}
+
+ReceiverBase::~ReceiverBase() = default;
+
+zx_status_t ReceiverBase::QueuePacket(async_dispatcher_t* dispatcher,
+                                      const zx_packet_user_t* data) {
+  return async_queue_packet(dispatcher, &receiver_, data);
+}
+
+Receiver::Receiver(Handler handler)
+    : ReceiverBase(&Receiver::CallHandler), handler_(std::move(handler)) {}
+
+Receiver::~Receiver() = default;
+
+void Receiver::CallHandler(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
+                           zx_status_t status, const zx_packet_user_t* data) {
+  auto self = Dispatch<Receiver>(receiver);
+  self->handler_(dispatcher, self, status, data);
+}
+
+}  // namespace async
diff --git a/pkg/async-cpp/task.cc b/pkg/async-cpp/task.cc
new file mode 100644
index 0000000..9f2937d
--- /dev/null
+++ b/pkg/async-cpp/task.cc
@@ -0,0 +1,123 @@
+// 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.
+
+#include <lib/async/cpp/task.h>
+
+#include <lib/async/cpp/time.h>
+#include <zircon/assert.h>
+
+#include <utility>
+
+namespace async {
+namespace internal {
+
+struct RetainedTask : public async_task_t {
+  RetainedTask(fit::closure handler, zx::time deadline)
+      : async_task_t{{ASYNC_STATE_INIT}, &RetainedTask::Handler, deadline.get()},
+        handler(static_cast<fit::closure&&>(handler)) {}
+
+  fit::closure handler;
+
+  static void Handler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status) {
+    auto self = static_cast<RetainedTask*>(task);
+    if (status == ZX_OK)
+      self->handler();
+    delete self;
+  }
+};
+
+}  // namespace internal
+
+zx_status_t PostTask(async_dispatcher_t* dispatcher, fit::closure handler) {
+  return PostTaskForTime(dispatcher, static_cast<fit::closure&&>(handler), async::Now(dispatcher));
+}
+
+zx_status_t PostDelayedTask(async_dispatcher_t* dispatcher, fit::closure handler,
+                            zx::duration delay) {
+  return PostTaskForTime(dispatcher, static_cast<fit::closure&&>(handler),
+                         async::Now(dispatcher) + delay);
+}
+
+zx_status_t PostTaskForTime(async_dispatcher_t* dispatcher, fit::closure handler,
+                            zx::time deadline) {
+  auto* task = new internal::RetainedTask(static_cast<fit::closure&&>(handler), deadline);
+  zx_status_t status = async_post_task(dispatcher, task);
+  if (status != ZX_OK)
+    delete task;
+  return status;
+}
+
+TaskBase::TaskBase(async_task_handler_t* handler)
+    : task_{{ASYNC_STATE_INIT}, handler, ZX_TIME_INFINITE} {}
+
+TaskBase::~TaskBase() {
+  if (dispatcher_) {
+    // Failure to cancel here may result in a dangling pointer...
+    zx_status_t status = async_cancel_task(dispatcher_, &task_);
+    ZX_ASSERT_MSG(status == ZX_OK, "status=%d", status);
+  }
+}
+
+zx_status_t TaskBase::Post(async_dispatcher_t* dispatcher) {
+  return PostForTime(dispatcher, async::Now(dispatcher));
+}
+
+zx_status_t TaskBase::PostDelayed(async_dispatcher_t* dispatcher, zx::duration delay) {
+  return PostForTime(dispatcher, async::Now(dispatcher) + delay);
+}
+
+zx_status_t TaskBase::PostForTime(async_dispatcher_t* dispatcher, zx::time deadline) {
+  if (dispatcher_)
+    return ZX_ERR_ALREADY_EXISTS;
+
+  dispatcher_ = dispatcher;
+  task_.deadline = deadline.get();
+  zx_status_t status = async_post_task(dispatcher, &task_);
+  if (status != ZX_OK) {
+    dispatcher_ = nullptr;
+  }
+  return status;
+}
+
+zx_status_t TaskBase::Cancel() {
+  if (!dispatcher_)
+    return ZX_ERR_NOT_FOUND;
+
+  async_dispatcher_t* dispatcher = dispatcher_;
+  dispatcher_ = nullptr;
+
+  zx_status_t status = async_cancel_task(dispatcher, &task_);
+  // |dispatcher| is required to be single-threaded, Cancel() is
+  // only supposed to be called on |dispatcher|'s thread, and we
+  // verified that the task was pending before calling
+  // async_cancel_task(). Assuming that |dispatcher| does not yield
+  // between removing the task and invoking the task's handler,
+  // |task_| must have been pending with |dispatcher|.
+  ZX_DEBUG_ASSERT(status != ZX_ERR_NOT_FOUND);
+  return status;
+}
+
+Task::Task(Handler handler) : TaskBase(&Task::CallHandler), handler_(std::move(handler)) {}
+
+Task::~Task() = default;
+
+void Task::CallHandler(async_dispatcher_t* dispatcher, async_task_t* task, zx_status_t status) {
+  auto self = Dispatch<Task>(task);
+  self->handler_(dispatcher, self, status);
+}
+
+TaskClosure::TaskClosure(fit::closure handler)
+    : TaskBase(&TaskClosure::CallHandler), handler_(std::move(handler)) {}
+
+TaskClosure::~TaskClosure() = default;
+
+void TaskClosure::CallHandler(async_dispatcher_t* dispatcher, async_task_t* task,
+                              zx_status_t status) {
+  auto self = Dispatch<TaskClosure>(task);  // must do this if status is not ok
+  if (status == ZX_OK) {
+    self->handler_();
+  }
+}
+
+}  // namespace async
diff --git a/pkg/async-cpp/trap.cc b/pkg/async-cpp/trap.cc
new file mode 100644
index 0000000..dc3781f
--- /dev/null
+++ b/pkg/async-cpp/trap.cc
@@ -0,0 +1,32 @@
+// 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.
+
+#include <lib/async/cpp/trap.h>
+
+#include <utility>
+
+namespace async {
+
+GuestBellTrapBase::GuestBellTrapBase(async_guest_bell_trap_handler_t* handler)
+    : trap_{{ASYNC_STATE_INIT}, handler} {}
+
+GuestBellTrapBase::~GuestBellTrapBase() = default;
+
+zx_status_t GuestBellTrapBase::SetTrap(async_dispatcher_t* dispatcher, const zx::guest& guest,
+                                       zx_vaddr_t addr, size_t length) {
+  return async_set_guest_bell_trap(dispatcher, &trap_, guest.get(), addr, length);
+}
+
+GuestBellTrap::GuestBellTrap(Handler handler)
+    : GuestBellTrapBase(&GuestBellTrap::CallHandler), handler_(std::move(handler)) {}
+
+GuestBellTrap::~GuestBellTrap() = default;
+
+void GuestBellTrap::CallHandler(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
+                                zx_status_t status, const zx_packet_guest_bell_t* bell) {
+  auto self = Dispatch<GuestBellTrap>(trap);
+  self->handler_(dispatcher, self, status, bell);
+}
+
+}  // namespace async
diff --git a/pkg/async-cpp/wait.cc b/pkg/async-cpp/wait.cc
new file mode 100644
index 0000000..955c203
--- /dev/null
+++ b/pkg/async-cpp/wait.cc
@@ -0,0 +1,82 @@
+// 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.
+
+#include <lib/async/cpp/wait.h>
+#include <zircon/assert.h>
+
+#include <utility>
+
+namespace async {
+
+WaitBase::WaitBase(zx_handle_t object, zx_signals_t trigger, uint32_t options,
+                   async_wait_handler_t* handler)
+    : wait_{{ASYNC_STATE_INIT}, handler, object, trigger, options} {}
+
+WaitBase::~WaitBase() {
+  if (dispatcher_) {
+    // Failure to cancel here may result in a dangling pointer...
+    zx_status_t status = async_cancel_wait(dispatcher_, &wait_);
+    ZX_ASSERT_MSG(status == ZX_OK, "status=%d", status);
+  }
+}
+
+zx_status_t WaitBase::Begin(async_dispatcher_t* dispatcher) {
+  if (dispatcher_)
+    return ZX_ERR_ALREADY_EXISTS;
+
+  dispatcher_ = dispatcher;
+  zx_status_t status = async_begin_wait(dispatcher, &wait_);
+  if (status != ZX_OK) {
+    dispatcher_ = nullptr;
+  }
+  return status;
+}
+
+zx_status_t WaitBase::Cancel() {
+  if (!dispatcher_)
+    return ZX_ERR_NOT_FOUND;
+
+  async_dispatcher_t* dispatcher = dispatcher_;
+  dispatcher_ = nullptr;
+
+  zx_status_t status = async_cancel_wait(dispatcher, &wait_);
+  // |dispatcher| is required to be single-threaded, Cancel() is
+  // only supposed to be called on |dispatcher|'s thread, and
+  // we verified that the wait was pending before calling
+  // async_cancel_wait(). Assuming that |dispatcher| never queues
+  // a wait, |wait_| must have been pending with |dispatcher|.
+  ZX_DEBUG_ASSERT(status != ZX_ERR_NOT_FOUND);
+  return status;
+}
+
+Wait::Wait(zx_handle_t object, zx_signals_t trigger, uint32_t options, Handler handler)
+    : WaitBase(object, trigger, options, &Wait::CallHandler), handler_(std::move(handler)) {}
+
+Wait::~Wait() = default;
+
+void Wait::CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
+                       const zx_packet_signal_t* signal) {
+  auto self = Dispatch<Wait>(wait);
+  self->handler_(dispatcher, self, status, signal);
+}
+
+WaitOnce::WaitOnce(zx_handle_t object, zx_signals_t trigger, uint32_t options)
+    : WaitBase(object, trigger, options, &WaitOnce::CallHandler) {}
+
+WaitOnce::~WaitOnce() = default;
+
+zx_status_t WaitOnce::Begin(async_dispatcher_t* dispatcher, WaitOnce::Handler handler) {
+  handler_ = std::move(handler);
+  return WaitBase::Begin(dispatcher);
+}
+
+void WaitOnce::CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait, zx_status_t status,
+                           const zx_packet_signal_t* signal) {
+  auto self = Dispatch<WaitOnce>(wait);
+  // Move the handler to the stack prior to calling.
+  auto handler = std::move(self->handler_);
+  handler(dispatcher, self, status, signal);
+}
+
+}  // namespace async
diff --git a/pkg/async-default/include/lib/async/default.h b/pkg/async-default/include/lib/async/default.h
deleted file mode 100644
index b171058..0000000
--- a/pkg/async-default/include/lib/async/default.h
+++ /dev/null
@@ -1,23 +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.
-
-#ifndef LIB_ASYNC_DEFAULT_H_
-#define LIB_ASYNC_DEFAULT_H_
-
-#include <lib/async/dispatcher.h>
-#include <zircon/compiler.h>
-
-__BEGIN_CDECLS
-
-// Gets the current thread's default asynchronous dispatcher interface.
-// Returns |NULL| if none.
-__EXPORT async_dispatcher_t* async_get_default_dispatcher(void);
-
-// Sets the current thread's default asynchronous dispatcher interface.
-// May be set to |NULL| if this thread doesn't have a default dispatcher.
-__EXPORT void async_set_default_dispatcher(async_dispatcher_t* dispatcher);
-
-__END_CDECLS
-
-#endif  // LIB_ASYNC_DEFAULT_H_
diff --git a/pkg/async-default/meta.json b/pkg/async-default/meta.json
deleted file mode 100644
index 2394825..0000000
--- a/pkg/async-default/meta.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/48/624ebaefd10ab212943f16760a00f469ec307e.debug", 
-      "dist": "arch/arm64/dist/libasync-default.so", 
-      "link": "arch/arm64/lib/libasync-default.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/5e/3c55aea09e8943ae76d3603cc8c0b1ba27bfb7.debug", 
-      "dist": "arch/x64/dist/libasync-default.so", 
-      "link": "arch/x64/lib/libasync-default.so"
-    }
-  }, 
-  "deps": [], 
-  "format": "shared", 
-  "headers": [
-    "pkg/async-default/include/lib/async/default.h"
-  ], 
-  "include_dir": "pkg/async-default/include", 
-  "name": "async-default", 
-  "root": "pkg/async-default", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/async-loop-cpp/include/lib/async-loop/cpp/loop.h b/pkg/async-loop-cpp/include/lib/async-loop/cpp/loop.h
deleted file mode 100644
index 6168aba..0000000
--- a/pkg/async-loop-cpp/include/lib/async-loop/cpp/loop.h
+++ /dev/null
@@ -1,121 +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.
-
-#pragma once
-
-#include <lib/async-loop/loop.h>
-#include <lib/async/default.h>
-#include <lib/zx/time.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <threads.h>
-#include <zircon/compiler.h>
-
-namespace async {
-
-// C++ wrapper for an asynchronous dispatch loop.
-//
-// This class is thread-safe.
-class Loop {
-public:
-    // Creates a message loop.
-    // All operations on the message loop are thread-safe (except destroy).
-    //
-    // Note that it's ok to run the loop on a different thread from the one
-    // upon which it was created.
-    //
-    // |config| provides configuration for the message loop.  Must not be null.
-    //
-    // See also |kAsyncLoopConfigAttachToThread| and |kAsyncLoopConfigNoAttachToThread|.
-    explicit Loop(const async_loop_config_t* config);
-
-    Loop(const Loop&) = delete;
-    Loop(Loop&&) = delete;
-    Loop& operator=(const Loop&) = delete;
-    Loop& operator=(Loop&&) = delete;
-
-    // Destroys the message loop.
-    // Implicitly calls |Shutdown()|.
-    ~Loop();
-
-    // Gets the underlying message loop structure.
-    async_loop_t* loop() const { return loop_; }
-
-    // Gets the loop's asynchronous dispatch interface.
-    async_dispatcher_t* dispatcher() const { return async_loop_get_dispatcher(loop_); }
-
-    // Shuts down the message loop, notifies handlers which asked to handle shutdown.
-    // The message loop must not currently be running on any threads other than
-    // those started by |StartThread()| which this function will join.
-    //
-    // Does nothing if already shutting down.
-    void Shutdown();
-
-    // Runs the message loop on the current thread.
-    // This function can be called on multiple threads to setup a multi-threaded
-    // dispatcher.
-    //
-    // Dispatches events until the |deadline| expires or the loop is quitted.
-    // Use |ZX_TIME_INFINITE| to dispatch events indefinitely.
-    //
-    // If |once| is true, performs a single unit of work then returns.
-    //
-    // Returns |ZX_OK| if the dispatcher returns after one cycle.
-    // Returns |ZX_ERR_TIMED_OUT| if the deadline expired.
-    // Returns |ZX_ERR_CANCELED| if the loop quitted.
-    // Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |Shutdown()|.
-    zx_status_t Run(zx::time deadline = zx::time::infinite(), bool once = false);
-
-    // Dispatches events until there are none remaining, and then returns
-    // without waiting. This is useful for unit testing, because the behavior
-    // doesn't depend on time.
-    //
-    // Returns |ZX_OK| if the dispatcher reaches an idle state.
-    // Returns |ZX_ERR_CANCELED| if the loop quitted.
-    // Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |Shutdown()|.
-    zx_status_t RunUntilIdle();
-
-    // Quits the message loop.
-    // Active invocations of |Run()| and threads started using |StartThread()|
-    // will eventually terminate upon completion of their current unit of work.
-    //
-    // Subsequent calls to |Run()| or |StartThread()| will return immediately
-    // until |ResetQuit()| is called.
-    void Quit();
-
-    // Resets the quit state of the message loop so that it can be restarted
-    // using |Run()| or |StartThread()|.
-    //
-    // This function must only be called when the message loop is not running.
-    // The caller must ensure all active invocations of |Run()| and threads
-    // started using |StartThread()| have terminated before resetting the quit state.
-    //
-    // Returns |ZX_OK| if the loop's state was |ASYNC_LOOP_RUNNABLE| or |ASYNC_LOOP_QUIT|.
-    // Returns |ZX_ERR_BAD_STATE| if the loop's state was |ASYNC_LOOP_SHUTDOWN| or if
-    // the message loop is currently active on one or more threads.
-    zx_status_t ResetQuit();
-
-    // Returns the current state of the message loop.
-    async_loop_state_t GetState() const;
-
-    // Starts a message loop running on a new thread.
-    // The thread will run until the loop quits.
-    //
-    // |name| is the desired name for the new thread, may be NULL.
-    // If |out_thread| is not NULL, it is set to the new thread identifier.
-    //
-    // Returns |ZX_OK| on success.
-    // Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |async_loop_shutdown()|.
-    // Returns |ZX_ERR_NO_MEMORY| if allocation or thread creation failed.
-    zx_status_t StartThread(const char* name = nullptr, thrd_t* out_thread = nullptr);
-
-    // Blocks until all dispatch threads started with |StartThread()|
-    // have terminated.
-    void JoinThreads();
-
-private:
-    async_loop_t* loop_;
-};
-
-} // namespace async
diff --git a/pkg/async-loop-cpp/loop_wrapper.cpp b/pkg/async-loop-cpp/loop_wrapper.cpp
deleted file mode 100644
index cc866ec..0000000
--- a/pkg/async-loop-cpp/loop_wrapper.cpp
+++ /dev/null
@@ -1,52 +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.
-
-#include <lib/async-loop/cpp/loop.h>
-
-#include <zircon/assert.h>
-
-namespace async {
-
-Loop::Loop(const async_loop_config_t* config) {
-    zx_status_t status = async_loop_create(config, &loop_);
-    ZX_ASSERT_MSG(status == ZX_OK, "status=%d", status);
-}
-
-Loop::~Loop() {
-    async_loop_destroy(loop_);
-}
-
-void Loop::Shutdown() {
-    async_loop_shutdown(loop_);
-}
-
-zx_status_t Loop::Run(zx::time deadline, bool once) {
-    return async_loop_run(loop_, deadline.get(), once);
-}
-
-zx_status_t Loop::RunUntilIdle() {
-    return async_loop_run_until_idle(loop_);
-}
-
-void Loop::Quit() {
-    async_loop_quit(loop_);
-}
-
-zx_status_t Loop::ResetQuit() {
-    return async_loop_reset_quit(loop_);
-}
-
-async_loop_state_t Loop::GetState() const {
-    return async_loop_get_state(loop_);
-}
-
-zx_status_t Loop::StartThread(const char* name, thrd_t* out_thread) {
-    return async_loop_start_thread(loop_, name, out_thread);
-}
-
-void Loop::JoinThreads() {
-    async_loop_join_threads(loop_);
-}
-
-} // namespace async
diff --git a/pkg/async-loop-cpp/meta.json b/pkg/async-loop-cpp/meta.json
deleted file mode 100644
index 950712f..0000000
--- a/pkg/async-loop-cpp/meta.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "banjo_deps": [], 
-  "deps": [
-    "async", 
-    "async-default", 
-    "async-loop", 
-    "zx"
-  ], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/async-loop-cpp/loop_wrapper.cpp", 
-    "pkg/async-loop-cpp/include/lib/async-loop/cpp/loop.h"
-  ], 
-  "headers": [
-    "pkg/async-loop-cpp/include/lib/async-loop/cpp/loop.h"
-  ], 
-  "include_dir": "pkg/async-loop-cpp/include", 
-  "name": "async-loop-cpp", 
-  "root": "pkg/async-loop-cpp", 
-  "sources": [
-    "pkg/async-loop-cpp/loop_wrapper.cpp"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/async-loop/include/lib/async-loop/loop.h b/pkg/async-loop/include/lib/async-loop/loop.h
deleted file mode 100644
index 1335cdb..0000000
--- a/pkg/async-loop/include/lib/async-loop/loop.h
+++ /dev/null
@@ -1,177 +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.
-
-//
-// Provides an implementation of a simple thread-safe asynchronous
-// dispatcher based on a Zircon completion port.  The implementation
-// is designed to avoid most dynamic memory allocation except for that
-// which is required to create the loop in the first place or to manage
-// the list of running threads.
-//
-// See README.md for example usage.
-//
-
-#ifndef LIB_ASYNC_LOOP_LOOP_H_
-#define LIB_ASYNC_LOOP_LOOP_H_
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <threads.h>
-
-#include <zircon/compiler.h>
-
-#include <lib/async/dispatcher.h>
-
-__BEGIN_CDECLS
-
-// Pointer to a message loop created using |async_loop_create()|.
-typedef struct async_loop async_loop_t;
-
-// Message loop configuration structure.
-typedef void(async_loop_callback_t)(async_loop_t* loop, void* data);
-typedef struct async_loop_config {
-    // If true, the loop will automatically register itself as the default
-    // dispatcher for the thread upon which it was created and will
-    // automatically unregister itself when destroyed (which must occur on
-    // the same thread).
-    //
-    // If false, the loop will not do this.  The loop's creator is then
-    // resposible for retrieving the loop's dispatcher using |async_loop_get_dispatcher()|
-    // and passing it around explicitly or calling |async_set_default_dispatcher()| as needed.
-    //
-    // Note that the loop can be used even without setting it as the current
-    // thread's default.
-    bool make_default_for_current_thread;
-
-    // A function to call before the dispatcher invokes each handler, or NULL if none.
-    async_loop_callback_t* prologue;
-
-    // A function to call after the dispatcher invokes each handler, or NULL if none.
-    async_loop_callback_t* epilogue;
-
-    // Data to pass to the callback functions.
-    void* data;
-} async_loop_config_t;
-
-// Simple config that when passed to async_loop_create will create a loop
-// that will automatically register itself as the default
-// dispatcher for the thread upon which it was created and will
-// automatically unregister itself when destroyed (which must occur on
-// the same thread).
-extern const async_loop_config_t kAsyncLoopConfigAttachToThread;
-
-// Simple config that when passed to async_loop_create will create a loop
-// that is not registered to the current thread.
-extern const async_loop_config_t kAsyncLoopConfigNoAttachToThread;
-
-// Creates a message loop and returns a pointer to it in |out_loop|.
-// All operations on the message loop are thread-safe (except destroy).
-//
-// Note that it's ok to run the loop on a different thread from the one
-// upon which it was created.
-//
-// |config| provides configuration for the message loop. Must not be null.
-//
-// Returns |ZX_OK| on success.
-// Returns |ZX_ERR_NO_MEMORY| if allocation failed.
-// May return other errors if the necessary internal handles could not be created.
-//
-// See also |kAsyncLoopConfigAttachToThread| and |kAsyncLoopConfigNoAttachToThread|.
-zx_status_t async_loop_create(const async_loop_config_t* config,
-                              async_loop_t** out_loop);
-
-// Gets the the message loop's asynchronous dispatch interface.
-async_dispatcher_t* async_loop_get_dispatcher(async_loop_t* loop);
-
-// Gets the message loop associated with the specified asynchronous dispatch interface
-//
-// This function assumes the dispatcher is backed by an |async_loop_t| which was created
-// using |async_loop_create()|.  Its behavior is undefined if used with other dispatcher
-// implementations.
-async_loop_t* async_loop_from_dispatcher(async_dispatcher_t* dispatcher);
-
-// Shuts down the message loop, notifies handlers which asked to handle shutdown.
-// The message loop must not currently be running on any threads other than
-// those started by |async_loop_start_thread()| which this function will join.
-//
-// Does nothing if already shutting down.
-void async_loop_shutdown(async_loop_t* loop);
-
-// Destroys the message loop.
-// Implicitly calls |async_loop_shutdown()| and joins all threads started
-// using |async_loop_start_thread()| before destroying the loop itself.
-void async_loop_destroy(async_loop_t* loop);
-
-// Runs the message loop on the current thread.
-// This function can be called on multiple threads to setup a multi-threaded
-// dispatcher.
-//
-// Dispatches events until the |deadline| expires or the loop is quitted.
-// Use |ZX_TIME_INFINITE| to dispatch events indefinitely.
-//
-// If |once| is true, performs a single unit of work then returns.
-//
-// Returns |ZX_OK| if the dispatcher returns after one cycle.
-// Returns |ZX_ERR_TIMED_OUT| if the deadline expired.
-// Returns |ZX_ERR_CANCELED| if the loop quitted.
-// Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |async_loop_shutdown()|.
-zx_status_t async_loop_run(async_loop_t* loop, zx_time_t deadline, bool once);
-
-// Dispatches events until there are none remaining, and then returns without
-// waiting. This is useful for unit testing, because the behavior doesn't depend
-// on time.
-//
-// Returns |ZX_OK| if the dispatcher reaches an idle state.
-// Returns |ZX_ERR_CANCELED| if the loop quitted.
-// Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |async_loop_shutdown()|.
-zx_status_t async_loop_run_until_idle(async_loop_t* loop);
-
-// Quits the message loop.
-// Active invocations of |async_loop_run()| and threads started using
-// |async_loop_start_thread()| will eventually terminate upon completion of their
-// current unit of work.
-//
-// Subsequent calls to |async_loop_run()| or |async_loop_start_thread()|
-// will return immediately until |async_loop_reset_quit()| is called.
-void async_loop_quit(async_loop_t* loop);
-
-// Resets the quit state of the message loop so that it can be restarted
-// using |async_loop_run()| or |async_loop_start_thread()|.
-//
-// This function must only be called when the message loop is not running.
-// The caller must ensure all active invocations of |async_loop_run()| and
-// threads started using |async_loop_start_thread()| have terminated before
-// resetting the quit state.
-//
-// Returns |ZX_OK| if the loop's state was |ASYNC_LOOP_RUNNABLE| or |ASYNC_LOOP_QUIT|.
-// Returns |ZX_ERR_BAD_STATE| if the loop's state was |ASYNC_LOOP_SHUTDOWN| or if
-// the message loop is currently active on one or more threads.
-zx_status_t async_loop_reset_quit(async_loop_t* loop);
-
-// Returns the current state of the message loop.
-typedef uint32_t async_loop_state_t;
-#define ASYNC_LOOP_RUNNABLE ((async_loop_state_t) 0)
-#define ASYNC_LOOP_QUIT ((async_loop_state_t) 1)
-#define ASYNC_LOOP_SHUTDOWN ((async_loop_state_t) 2)
-async_loop_state_t async_loop_get_state(async_loop_t* loop);
-
-// Starts a message loop running on a new thread.
-// The thread will run until the loop quits.
-//
-// |name| is the desired name for the new thread, may be NULL.
-// If |out_thread| is not NULL, it is set to the new thread identifier.
-//
-// Returns |ZX_OK| on success.
-// Returns |ZX_ERR_BAD_STATE| if the loop was shut down with |async_loop_shutdown()|.
-// Returns |ZX_ERR_NO_MEMORY| if allocation or thread creation failed.
-zx_status_t async_loop_start_thread(async_loop_t* loop, const char* name,
-                                    thrd_t* out_thread);
-
-// Blocks until all dispatch threads started with |async_loop_start_thread()|
-// have terminated.
-void async_loop_join_threads(async_loop_t* loop);
-
-__END_CDECLS
-
-#endif  // LIB_ASYNC_LOOP_LOOP_H_
\ No newline at end of file
diff --git a/pkg/async-loop/loop.c b/pkg/async-loop/loop.c
deleted file mode 100644
index e70627a..0000000
--- a/pkg/async-loop/loop.c
+++ /dev/null
@@ -1,797 +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.
-
-#ifndef _ALL_SOURCE
-#define _ALL_SOURCE // Enables thrd_create_with_name in <threads.h>.
-#endif
-#include <lib/async-loop/loop.h>
-
-#include <assert.h>
-#include <stdatomic.h>
-#include <stdlib.h>
-
-#include <zircon/assert.h>
-#include <zircon/listnode.h>
-#include <zircon/syscalls.h>
-#include <zircon/syscalls/hypervisor.h>
-
-#include <lib/async/default.h>
-#include <lib/async/exception.h>
-#include <lib/async/receiver.h>
-#include <lib/async/task.h>
-#include <lib/async/trap.h>
-#include <lib/async/wait.h>
-
-// The port wait key associated with the dispatcher's control messages.
-#define KEY_CONTROL (0u)
-
-static zx_time_t async_loop_now(async_dispatcher_t* dispatcher);
-static zx_status_t async_loop_begin_wait(async_dispatcher_t* dispatcher, async_wait_t* wait);
-static zx_status_t async_loop_cancel_wait(async_dispatcher_t* dispatcher, async_wait_t* wait);
-static zx_status_t async_loop_post_task(async_dispatcher_t* dispatcher, async_task_t* task);
-static zx_status_t async_loop_cancel_task(async_dispatcher_t* dispatcher, async_task_t* task);
-static zx_status_t async_loop_queue_packet(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
-                                           const zx_packet_user_t* data);
-static zx_status_t async_loop_set_guest_bell_trap(
-    async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
-    zx_handle_t guest, zx_vaddr_t addr, size_t length);
-static zx_status_t async_loop_bind_exception_port(async_dispatcher_t* async,
-                                                  async_exception_t* exception);
-static zx_status_t async_loop_unbind_exception_port(async_dispatcher_t* async,
-                                                    async_exception_t* exception);
-static zx_status_t async_loop_resume_from_exception(async_dispatcher_t* async,
-                                                    async_exception_t* exception,
-                                                    zx_handle_t task,
-                                                    uint32_t options);
-
-static const async_ops_t async_loop_ops = {
-    .version = ASYNC_OPS_V2,
-    .reserved = 0,
-    .v1 = {
-        .now = async_loop_now,
-        .begin_wait = async_loop_begin_wait,
-        .cancel_wait = async_loop_cancel_wait,
-        .post_task = async_loop_post_task,
-        .cancel_task = async_loop_cancel_task,
-        .queue_packet = async_loop_queue_packet,
-        .set_guest_bell_trap = async_loop_set_guest_bell_trap,
-    },
-    .v2 = {
-        .bind_exception_port = async_loop_bind_exception_port,
-        .unbind_exception_port = async_loop_unbind_exception_port,
-        .resume_from_exception = async_loop_resume_from_exception,
-    },
-};
-
-typedef struct thread_record {
-    list_node_t node;
-    thrd_t thread;
-} thread_record_t;
-
-const async_loop_config_t kAsyncLoopConfigAttachToThread = {
-    .make_default_for_current_thread = true};
-const async_loop_config_t kAsyncLoopConfigNoAttachToThread = {
-    .make_default_for_current_thread = false};
-
-typedef struct async_loop {
-    async_dispatcher_t dispatcher; // must be first (the loop inherits from async_dispatcher_t)
-    async_loop_config_t config; // immutable
-    zx_handle_t port; // immutable
-    zx_handle_t timer; // immutable
-
-    _Atomic async_loop_state_t state;
-    atomic_uint active_threads; // number of active dispatch threads
-
-    mtx_t lock; // guards the lists and the dispatching tasks flag
-    bool dispatching_tasks; // true while the loop is busy dispatching tasks
-    list_node_t wait_list; // most recently added first
-    list_node_t task_list; // pending tasks, earliest deadline first
-    list_node_t due_list; // due tasks, earliest deadline first
-    list_node_t thread_list; // earliest created thread first
-    list_node_t exception_list; // most recently added first
-} async_loop_t;
-
-static zx_status_t async_loop_run_once(async_loop_t* loop, zx_time_t deadline);
-static zx_status_t async_loop_dispatch_wait(async_loop_t* loop, async_wait_t* wait,
-                                            zx_status_t status, const zx_packet_signal_t* signal);
-static zx_status_t async_loop_dispatch_tasks(async_loop_t* loop);
-static void async_loop_dispatch_task(async_loop_t* loop, async_task_t* task,
-                                     zx_status_t status);
-static zx_status_t async_loop_dispatch_packet(async_loop_t* loop, async_receiver_t* receiver,
-                                              zx_status_t status, const zx_packet_user_t* data);
-static zx_status_t async_loop_dispatch_guest_bell_trap(async_loop_t* loop,
-                                                       async_guest_bell_trap_t* trap,
-                                                       zx_status_t status,
-                                                       const zx_packet_guest_bell_t* bell);
-static zx_status_t async_loop_dispatch_exception(async_loop_t* loop,
-                                                 async_exception_t* exception,
-                                                 zx_status_t status,
-                                                 const zx_port_packet_t* report);
-static void async_loop_wake_threads(async_loop_t* loop);
-static void async_loop_insert_task_locked(async_loop_t* loop, async_task_t* task);
-static void async_loop_restart_timer_locked(async_loop_t* loop);
-static void async_loop_invoke_prologue(async_loop_t* loop);
-static void async_loop_invoke_epilogue(async_loop_t* loop);
-
-static_assert(sizeof(list_node_t) <= sizeof(async_state_t),
-              "async_state_t too small");
-
-#define TO_NODE(type, ptr) ((list_node_t*)&ptr->state)
-#define FROM_NODE(type, ptr) ((type*)((char*)(ptr)-offsetof(type, state)))
-
-static inline list_node_t* wait_to_node(async_wait_t* wait) {
-    return TO_NODE(async_wait_t, wait);
-}
-
-static inline async_wait_t* node_to_wait(list_node_t* node) {
-    return FROM_NODE(async_wait_t, node);
-}
-
-static inline list_node_t* task_to_node(async_task_t* task) {
-    return TO_NODE(async_task_t, task);
-}
-
-static inline async_task_t* node_to_task(list_node_t* node) {
-    return FROM_NODE(async_task_t, node);
-}
-
-static inline list_node_t* exception_to_node(async_exception_t* exception) {
-    return TO_NODE(async_exception_t, exception);
-}
-
-static inline async_exception_t* node_to_exception(list_node_t* node) {
-    return FROM_NODE(async_exception_t, node);
-}
-
-zx_status_t async_loop_create(const async_loop_config_t* config, async_loop_t** out_loop) {
-    ZX_DEBUG_ASSERT(out_loop);
-    ZX_DEBUG_ASSERT(config != NULL);
-
-    async_loop_t* loop = calloc(1u, sizeof(async_loop_t));
-    if (!loop)
-        return ZX_ERR_NO_MEMORY;
-    atomic_init(&loop->state, ASYNC_LOOP_RUNNABLE);
-    atomic_init(&loop->active_threads, 0u);
-
-    loop->dispatcher.ops = &async_loop_ops;
-    loop->config = *config;
-    mtx_init(&loop->lock, mtx_plain);
-    list_initialize(&loop->wait_list);
-    list_initialize(&loop->task_list);
-    list_initialize(&loop->due_list);
-    list_initialize(&loop->thread_list);
-    list_initialize(&loop->exception_list);
-
-    zx_status_t status = zx_port_create(0u, &loop->port);
-    if (status == ZX_OK)
-        status = zx_timer_create(0u, ZX_CLOCK_MONOTONIC, &loop->timer);
-    if (status == ZX_OK) {
-        status = zx_object_wait_async(loop->timer, loop->port, KEY_CONTROL,
-                                      ZX_TIMER_SIGNALED,
-                                      ZX_WAIT_ASYNC_REPEATING);
-    }
-    if (status == ZX_OK) {
-        *out_loop = loop;
-        if (loop->config.make_default_for_current_thread) {
-            ZX_DEBUG_ASSERT(async_get_default_dispatcher() == NULL);
-            async_set_default_dispatcher(&loop->dispatcher);
-        }
-    } else {
-        loop->config.make_default_for_current_thread = false;
-        async_loop_destroy(loop);
-    }
-    return status;
-}
-
-void async_loop_destroy(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    async_loop_shutdown(loop);
-
-    zx_handle_close(loop->port);
-    zx_handle_close(loop->timer);
-    mtx_destroy(&loop->lock);
-    free(loop);
-}
-
-void async_loop_shutdown(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    async_loop_state_t prior_state =
-        atomic_exchange_explicit(&loop->state, ASYNC_LOOP_SHUTDOWN,
-                                 memory_order_acq_rel);
-    if (prior_state == ASYNC_LOOP_SHUTDOWN)
-        return;
-
-    async_loop_wake_threads(loop);
-    async_loop_join_threads(loop);
-
-    list_node_t* node;
-    while ((node = list_remove_head(&loop->wait_list))) {
-        async_wait_t* wait = node_to_wait(node);
-        async_loop_dispatch_wait(loop, wait, ZX_ERR_CANCELED, NULL);
-    }
-    while ((node = list_remove_head(&loop->due_list))) {
-        async_task_t* task = node_to_task(node);
-        async_loop_dispatch_task(loop, task, ZX_ERR_CANCELED);
-    }
-    while ((node = list_remove_head(&loop->task_list))) {
-        async_task_t* task = node_to_task(node);
-        async_loop_dispatch_task(loop, task, ZX_ERR_CANCELED);
-    }
-    while ((node = list_remove_head(&loop->exception_list))) {
-        async_exception_t* exception = node_to_exception(node);
-        async_loop_dispatch_exception(loop, exception, ZX_ERR_CANCELED, NULL);
-    }
-
-    if (loop->config.make_default_for_current_thread) {
-        ZX_DEBUG_ASSERT(async_get_default_dispatcher() == &loop->dispatcher);
-        async_set_default_dispatcher(NULL);
-    }
-}
-
-zx_status_t async_loop_run(async_loop_t* loop, zx_time_t deadline, bool once) {
-    ZX_DEBUG_ASSERT(loop);
-
-    zx_status_t status;
-    atomic_fetch_add_explicit(&loop->active_threads, 1u, memory_order_acq_rel);
-    do {
-        status = async_loop_run_once(loop, deadline);
-    } while (status == ZX_OK && !once);
-    atomic_fetch_sub_explicit(&loop->active_threads, 1u, memory_order_acq_rel);
-    return status;
-}
-
-zx_status_t async_loop_run_until_idle(async_loop_t* loop) {
-    zx_status_t status = async_loop_run(loop, 0, false);
-    if (status == ZX_ERR_TIMED_OUT) {
-        status = ZX_OK;
-    }
-    return status;
-}
-
-static zx_status_t async_loop_run_once(async_loop_t* loop, zx_time_t deadline) {
-    async_loop_state_t state = atomic_load_explicit(&loop->state, memory_order_acquire);
-    if (state == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-    if (state != ASYNC_LOOP_RUNNABLE)
-        return ZX_ERR_CANCELED;
-
-    zx_port_packet_t packet;
-    zx_status_t status = zx_port_wait(loop->port, deadline, &packet);
-    if (status != ZX_OK)
-        return status;
-
-    if (packet.key == KEY_CONTROL) {
-        // Handle wake-up packets.
-        if (packet.type == ZX_PKT_TYPE_USER)
-            return ZX_OK;
-
-        // Handle task timer expirations.
-        if (packet.type == ZX_PKT_TYPE_SIGNAL_REP &&
-            packet.signal.observed & ZX_TIMER_SIGNALED) {
-            return async_loop_dispatch_tasks(loop);
-        }
-    } else {
-        // Handle wait completion packets.
-        if (packet.type == ZX_PKT_TYPE_SIGNAL_ONE) {
-            async_wait_t* wait = (void*)(uintptr_t)packet.key;
-            mtx_lock(&loop->lock);
-            list_delete(wait_to_node(wait));
-            mtx_unlock(&loop->lock);
-            return async_loop_dispatch_wait(loop, wait, packet.status, &packet.signal);
-        }
-
-        // Handle queued user packets.
-        if (packet.type == ZX_PKT_TYPE_USER) {
-            async_receiver_t* receiver = (void*)(uintptr_t)packet.key;
-            return async_loop_dispatch_packet(loop, receiver, packet.status, &packet.user);
-        }
-
-        // Handle guest bell trap packets.
-        if (packet.type == ZX_PKT_TYPE_GUEST_BELL) {
-            async_guest_bell_trap_t* trap = (void*)(uintptr_t)packet.key;
-            return async_loop_dispatch_guest_bell_trap(
-                loop, trap, packet.status, &packet.guest_bell);
-        }
-
-        // Handle exception packets.
-        if (ZX_PKT_IS_EXCEPTION(packet.type)) {
-            async_exception_t* exception = (void*)(uintptr_t)packet.key;
-            return async_loop_dispatch_exception(loop, exception, packet.status,
-                                                 &packet);
-        }
-    }
-
-    ZX_DEBUG_ASSERT(false);
-    return ZX_ERR_INTERNAL;
-}
-
-async_dispatcher_t* async_loop_get_dispatcher(async_loop_t* loop) {
-    // Note: The loop's implementation inherits from async_t so we can upcast to it.
-    return (async_dispatcher_t*)loop;
-}
-
-async_loop_t* async_loop_from_dispatcher(async_dispatcher_t* async) {
-    return (async_loop_t*)async;
-}
-
-static zx_status_t async_loop_dispatch_guest_bell_trap(async_loop_t* loop,
-                                                       async_guest_bell_trap_t* trap,
-                                                       zx_status_t status,
-                                                       const zx_packet_guest_bell_t* bell) {
-    async_loop_invoke_prologue(loop);
-    trap->handler((async_dispatcher_t*)loop, trap, status, bell);
-    async_loop_invoke_epilogue(loop);
-    return ZX_OK;
-}
-
-static zx_status_t async_loop_dispatch_wait(async_loop_t* loop, async_wait_t* wait,
-                                            zx_status_t status, const zx_packet_signal_t* signal) {
-    async_loop_invoke_prologue(loop);
-    wait->handler((async_dispatcher_t*)loop, wait, status, signal);
-    async_loop_invoke_epilogue(loop);
-    return ZX_OK;
-}
-
-static zx_status_t async_loop_dispatch_tasks(async_loop_t* loop) {
-    // Dequeue and dispatch one task at a time in case an earlier task wants
-    // to cancel a later task which has also come due.  At most one thread
-    // can dispatch tasks at any given moment (to preserve serial ordering).
-    // Timer restarts are suppressed until we run out of tasks to dispatch.
-    mtx_lock(&loop->lock);
-    if (!loop->dispatching_tasks) {
-        loop->dispatching_tasks = true;
-
-        // Extract all of the tasks that are due into |due_list| for dispatch
-        // unless we already have some waiting from a previous iteration which
-        // we would like to process in order.
-        list_node_t* node;
-        if (list_is_empty(&loop->due_list)) {
-            zx_time_t due_time = async_loop_now((async_dispatcher_t*)loop);
-            list_node_t* tail = NULL;
-            list_for_every(&loop->task_list, node) {
-                if (node_to_task(node)->deadline > due_time)
-                    break;
-                tail = node;
-            }
-            if (tail) {
-                list_node_t* head = loop->task_list.next;
-                loop->task_list.next = tail->next;
-                tail->next->prev = &loop->task_list;
-                loop->due_list.next = head;
-                head->prev = &loop->due_list;
-                loop->due_list.prev = tail;
-                tail->next = &loop->due_list;
-            }
-        }
-
-        // Dispatch all due tasks.  Note that they might be canceled concurrently
-        // so we need to grab the lock during each iteration to fetch the next
-        // item from the list.
-        while ((node = list_remove_head(&loop->due_list))) {
-            mtx_unlock(&loop->lock);
-
-            // Invoke the handler.  Note that it might destroy itself.
-            async_task_t* task = node_to_task(node);
-            async_loop_dispatch_task(loop, task, ZX_OK);
-
-            mtx_lock(&loop->lock);
-            async_loop_state_t state = atomic_load_explicit(&loop->state, memory_order_acquire);
-            if (state != ASYNC_LOOP_RUNNABLE)
-                break;
-        }
-
-        loop->dispatching_tasks = false;
-        async_loop_restart_timer_locked(loop);
-    }
-    mtx_unlock(&loop->lock);
-    return ZX_OK;
-}
-
-static void async_loop_dispatch_task(async_loop_t* loop,
-                                     async_task_t* task,
-                                     zx_status_t status) {
-    // Invoke the handler.  Note that it might destroy itself.
-    async_loop_invoke_prologue(loop);
-    task->handler((async_dispatcher_t*)loop, task, status);
-    async_loop_invoke_epilogue(loop);
-}
-
-static zx_status_t async_loop_dispatch_packet(async_loop_t* loop, async_receiver_t* receiver,
-                                              zx_status_t status, const zx_packet_user_t* data) {
-    // Invoke the handler.  Note that it might destroy itself.
-    async_loop_invoke_prologue(loop);
-    receiver->handler((async_dispatcher_t*)loop, receiver, status, data);
-    async_loop_invoke_epilogue(loop);
-    return ZX_OK;
-}
-
-static zx_status_t async_loop_dispatch_exception(async_loop_t* loop,
-                                                 async_exception_t* exception,
-                                                 zx_status_t status,
-                                                 const zx_port_packet_t* report) {
-    // Invoke the handler.  Note that it might destroy itself.
-    async_loop_invoke_prologue(loop);
-    exception->handler((async_dispatcher_t*)loop, exception, status, report);
-    async_loop_invoke_epilogue(loop);
-    return ZX_OK;
-}
-
-void async_loop_quit(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    async_loop_state_t expected_state = ASYNC_LOOP_RUNNABLE;
-    if (!atomic_compare_exchange_strong_explicit(&loop->state, &expected_state,
-                                                 ASYNC_LOOP_QUIT,
-                                                 memory_order_acq_rel, memory_order_acquire))
-        return;
-
-    async_loop_wake_threads(loop);
-}
-
-static void async_loop_wake_threads(async_loop_t* loop) {
-    // Queue enough packets to awaken all active threads.
-    // This is safe because any new threads which join the pool first increment the
-    // active thread count then check the loop state, so the count we observe here
-    // cannot be less than the number of threads which might be blocked in |port_wait|.
-    // Issuing too many packets is also harmless.
-    uint32_t n = atomic_load_explicit(&loop->active_threads, memory_order_acquire);
-    for (uint32_t i = 0u; i < n; i++) {
-        zx_port_packet_t packet = {
-            .key = KEY_CONTROL,
-            .type = ZX_PKT_TYPE_USER,
-            .status = ZX_OK};
-        zx_status_t status = zx_port_queue(loop->port, &packet);
-        ZX_ASSERT_MSG(status == ZX_OK, "zx_port_queue: status=%d", status);
-    }
-}
-
-zx_status_t async_loop_reset_quit(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    // Ensure that there are no active threads before resetting the quit state.
-    // This check is inherently racy but not dangerously so.  It's mainly a
-    // sanity check for client code so we can make a stronger statement about
-    // how |async_loop_reset_quit()| is supposed to be used.
-    uint32_t n = atomic_load_explicit(&loop->active_threads, memory_order_acquire);
-    if (n != 0)
-        return ZX_ERR_BAD_STATE;
-
-    async_loop_state_t expected_state = ASYNC_LOOP_QUIT;
-    if (atomic_compare_exchange_strong_explicit(&loop->state, &expected_state,
-                                                ASYNC_LOOP_RUNNABLE,
-                                                memory_order_acq_rel, memory_order_acquire)) {
-        return ZX_OK;
-    }
-
-    async_loop_state_t state = atomic_load_explicit(&loop->state, memory_order_acquire);
-    if (state == ASYNC_LOOP_RUNNABLE)
-        return ZX_OK;
-    return ZX_ERR_BAD_STATE;
-}
-
-async_loop_state_t async_loop_get_state(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    return atomic_load_explicit(&loop->state, memory_order_acquire);
-}
-
-zx_time_t async_loop_now(async_dispatcher_t* dispatcher) {
-    return zx_clock_get_monotonic();
-}
-
-static zx_status_t async_loop_begin_wait(async_dispatcher_t* async, async_wait_t* wait) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(wait);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    mtx_lock(&loop->lock);
-
-    zx_status_t status = zx_object_wait_async(
-        wait->object, loop->port, (uintptr_t)wait, wait->trigger, ZX_WAIT_ASYNC_ONCE);
-    if (status == ZX_OK) {
-        list_add_head(&loop->wait_list, wait_to_node(wait));
-    } else {
-        ZX_ASSERT_MSG(status == ZX_ERR_ACCESS_DENIED,
-                      "zx_object_wait_async: status=%d", status);
-    }
-
-    mtx_unlock(&loop->lock);
-    return status;
-}
-
-static zx_status_t async_loop_cancel_wait(async_dispatcher_t* async, async_wait_t* wait) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(wait);
-
-    // Note: We need to process cancelations even while the loop is being
-    // destroyed in case the client is counting on the handler not being
-    // invoked again past this point.
-
-    mtx_lock(&loop->lock);
-
-    // First, confirm that the wait is actually pending.
-    list_node_t* node = wait_to_node(wait);
-    if (!list_in_list(node)) {
-        mtx_unlock(&loop->lock);
-        return ZX_ERR_NOT_FOUND;
-    }
-
-    // Next, cancel the wait.  This may be racing with another thread that
-    // has read the wait's packet but not yet dispatched it.  So if we fail
-    // to cancel then we assume we lost the race.
-    zx_status_t status = zx_port_cancel(loop->port, wait->object,
-                                        (uintptr_t)wait);
-    if (status == ZX_OK) {
-        list_delete(node);
-    } else {
-        ZX_ASSERT_MSG(status == ZX_ERR_NOT_FOUND,
-                      "zx_port_cancel: status=%d", status);
-    }
-
-    mtx_unlock(&loop->lock);
-    return status;
-}
-
-static zx_status_t async_loop_post_task(async_dispatcher_t* async, async_task_t* task) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(task);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    mtx_lock(&loop->lock);
-
-    async_loop_insert_task_locked(loop, task);
-    if (!loop->dispatching_tasks &&
-        task_to_node(task)->prev == &loop->task_list) {
-        // Task inserted at head.  Earliest deadline changed.
-        async_loop_restart_timer_locked(loop);
-    }
-
-    mtx_unlock(&loop->lock);
-    return ZX_OK;
-}
-
-static zx_status_t async_loop_cancel_task(async_dispatcher_t* async, async_task_t* task) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(task);
-
-    // Note: We need to process cancelations even while the loop is being
-    // destroyed in case the client is counting on the handler not being
-    // invoked again past this point.  Also, the task we're removing here
-    // might be present in the dispatcher's |due_list| if it is pending
-    // dispatch instead of in the loop's |task_list| as usual.  The same
-    // logic works in both cases.
-
-    mtx_lock(&loop->lock);
-    list_node_t* node = task_to_node(task);
-    if (!list_in_list(node)) {
-        mtx_unlock(&loop->lock);
-        return ZX_ERR_NOT_FOUND;
-    }
-
-    // Determine whether the head task was canceled and following task has
-    // a later deadline.  If so, we will bump the timer along to that deadline.
-    bool must_restart = !loop->dispatching_tasks &&
-                        node->prev == &loop->task_list &&
-                        node->next != &loop->task_list &&
-                        node_to_task(node->next)->deadline > task->deadline;
-    list_delete(node);
-    if (must_restart)
-        async_loop_restart_timer_locked(loop);
-
-    mtx_unlock(&loop->lock);
-    return ZX_OK;
-}
-
-static zx_status_t async_loop_queue_packet(async_dispatcher_t* async, async_receiver_t* receiver,
-                                           const zx_packet_user_t* data) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(receiver);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    zx_port_packet_t packet = {
-        .key = (uintptr_t)receiver,
-        .type = ZX_PKT_TYPE_USER,
-        .status = ZX_OK};
-    if (data)
-        packet.user = *data;
-    return zx_port_queue(loop->port, &packet);
-}
-
-static zx_status_t async_loop_set_guest_bell_trap(
-    async_dispatcher_t* async, async_guest_bell_trap_t* trap,
-    zx_handle_t guest, zx_vaddr_t addr, size_t length) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(trap);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    zx_status_t status = zx_guest_set_trap(guest, ZX_GUEST_TRAP_BELL, addr,
-                                           length, loop->port, (uintptr_t)trap);
-    if (status != ZX_OK) {
-        ZX_ASSERT_MSG(status == ZX_ERR_ACCESS_DENIED ||
-                          status == ZX_ERR_ALREADY_EXISTS ||
-                          status == ZX_ERR_INVALID_ARGS ||
-                          status == ZX_ERR_OUT_OF_RANGE ||
-                          status == ZX_ERR_WRONG_TYPE,
-                      "zx_guest_set_trap: status=%d", status);
-    }
-    return status;
-}
-
-static zx_status_t async_loop_bind_exception_port(async_dispatcher_t* async,
-                                                  async_exception_t* exception) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(exception);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    mtx_lock(&loop->lock);
-
-    uint64_t key = (uintptr_t)(void*) exception;
-    zx_status_t status = zx_task_bind_exception_port(exception->task, loop->port,
-                                                     key, exception->options);
-    if (status == ZX_OK) {
-        list_add_head(&loop->exception_list, exception_to_node(exception));
-    }
-
-    mtx_unlock(&loop->lock);
-    return status;
-}
-
-static zx_status_t async_loop_unbind_exception_port(async_dispatcher_t* async,
-                                                    async_exception_t* exception) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(exception);
-
-    // Note: We need to process unbindings even while the loop is being
-    // destroyed in case the client is counting on the handler not being
-    // invoked again past this point.
-
-    mtx_lock(&loop->lock);
-
-    // First, confirm that the port is actually bound.
-    list_node_t* node = exception_to_node(exception);
-    if (!list_in_list(node)) {
-        mtx_unlock(&loop->lock);
-        return ZX_ERR_NOT_FOUND;
-    }
-
-    uint64_t key = (uintptr_t)(void*) exception;
-    zx_status_t status = zx_task_bind_exception_port(exception->task,
-                                                     ZX_HANDLE_INVALID, key, 0);
-
-    if (status == ZX_OK) {
-        list_delete(node);
-    }
-
-    mtx_unlock(&loop->lock);
-    return status;
-}
-
-static zx_status_t async_loop_resume_from_exception(async_dispatcher_t* async,
-                                                    async_exception_t* exception,
-                                                    zx_handle_t task,
-                                                    uint32_t options) {
-    async_loop_t* loop = (async_loop_t*)async;
-    ZX_DEBUG_ASSERT(loop);
-    ZX_DEBUG_ASSERT(exception);
-
-    if (atomic_load_explicit(&loop->state, memory_order_acquire) == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    return zx_task_resume_from_exception(task, loop->port, options);
-}
-
-static void async_loop_insert_task_locked(async_loop_t* loop, async_task_t* task) {
-    // TODO(ZX-976): We assume that tasks are inserted in quasi-monotonic order and
-    // that insertion into the task queue will typically take no more than a few steps.
-    // If this assumption proves false and the cost of insertion becomes a problem, we
-    // should consider using a more efficient representation for maintaining order.
-    list_node_t* node;
-    for (node = loop->task_list.prev; node != &loop->task_list; node = node->prev) {
-        if (task->deadline >= node_to_task(node)->deadline)
-            break;
-    }
-    list_add_after(node, task_to_node(task));
-}
-
-static void async_loop_restart_timer_locked(async_loop_t* loop) {
-    zx_time_t deadline;
-    if (list_is_empty(&loop->due_list)) {
-        list_node_t* head = list_peek_head(&loop->task_list);
-        if (!head)
-            return;
-        async_task_t* task = node_to_task(head);
-        deadline = task->deadline;
-        if (deadline == ZX_TIME_INFINITE)
-            return;
-    } else {
-        // Fire now.
-        deadline = 0ULL;
-    }
-
-    zx_status_t status = zx_timer_set(loop->timer, deadline, 0);
-    ZX_ASSERT_MSG(status == ZX_OK, "zx_timer_set: status=%d", status);
-}
-
-static void async_loop_invoke_prologue(async_loop_t* loop) {
-    if (loop->config.prologue)
-        loop->config.prologue(loop, loop->config.data);
-}
-
-static void async_loop_invoke_epilogue(async_loop_t* loop) {
-    if (loop->config.epilogue)
-        loop->config.epilogue(loop, loop->config.data);
-}
-
-static int async_loop_run_thread(void* data) {
-    async_loop_t* loop = (async_loop_t*)data;
-    async_set_default_dispatcher(&loop->dispatcher);
-    async_loop_run(loop, ZX_TIME_INFINITE, false);
-    return 0;
-}
-
-zx_status_t async_loop_start_thread(async_loop_t* loop, const char* name, thrd_t* out_thread) {
-    ZX_DEBUG_ASSERT(loop);
-
-    // This check is inherently racy.  The client should not be racing shutdown
-    // with attemps to start new threads.  This is mainly a sanity check.
-    async_loop_state_t state = atomic_load_explicit(&loop->state, memory_order_acquire);
-    if (state == ASYNC_LOOP_SHUTDOWN)
-        return ZX_ERR_BAD_STATE;
-
-    thread_record_t* rec = calloc(1u, sizeof(thread_record_t));
-    if (!rec)
-        return ZX_ERR_NO_MEMORY;
-
-    if (thrd_create_with_name(&rec->thread, async_loop_run_thread, loop, name) != thrd_success) {
-        free(rec);
-        return ZX_ERR_NO_MEMORY;
-    }
-
-    mtx_lock(&loop->lock);
-    list_add_tail(&loop->thread_list, &rec->node);
-    mtx_unlock(&loop->lock);
-
-    if (out_thread)
-        *out_thread = rec->thread;
-    return ZX_OK;
-}
-
-void async_loop_join_threads(async_loop_t* loop) {
-    ZX_DEBUG_ASSERT(loop);
-
-    mtx_lock(&loop->lock);
-    for (;;) {
-        thread_record_t* rec = (thread_record_t*)list_remove_head(&loop->thread_list);
-        if (!rec)
-            break;
-
-        mtx_unlock(&loop->lock);
-        thrd_t thread = rec->thread;
-        free(rec);
-        int result = thrd_join(thread, NULL);
-        ZX_DEBUG_ASSERT(result == thrd_success);
-        mtx_lock(&loop->lock);
-    }
-    mtx_unlock(&loop->lock);
-}
diff --git a/pkg/async-loop/meta.json b/pkg/async-loop/meta.json
deleted file mode 100644
index 8a1eef7..0000000
--- a/pkg/async-loop/meta.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "banjo_deps": [], 
-  "deps": [
-    "async", 
-    "async-default"
-  ], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/async-loop/loop.c", 
-    "pkg/async-loop/include/lib/async-loop/loop.h"
-  ], 
-  "headers": [
-    "pkg/async-loop/include/lib/async-loop/loop.h"
-  ], 
-  "include_dir": "pkg/async-loop/include", 
-  "name": "async-loop", 
-  "root": "pkg/async-loop", 
-  "sources": [
-    "pkg/async-loop/loop.c"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/async/include/lib/async/dispatcher.h b/pkg/async/include/lib/async/dispatcher.h
index ff9b760..8542435 100644
--- a/pkg/async/include/lib/async/dispatcher.h
+++ b/pkg/async/include/lib/async/dispatcher.h
@@ -20,7 +20,8 @@
 typedef struct async_wait async_wait_t;
 typedef struct async_task async_task_t;
 typedef struct async_receiver async_receiver_t;
-typedef struct async_exception async_exception_t;
+typedef struct async_irq async_irq_t;
+typedef struct async_paged_vmo async_paged_vmo_t;
 
 // Private state owned by the asynchronous dispatcher.
 // This allows the dispatcher to associate a small amount of state with pending
@@ -30,11 +31,11 @@
 // Clients must initialize the contents of this structure to zero using
 // |ASYNC_STATE_INIT| or with calloc, memset, or a similar means.
 typedef struct {
-    uintptr_t reserved[2];
+  uintptr_t reserved[2];
 } async_state_t;
 
 #define ASYNC_STATE_INIT \
-    { 0u, 0u }
+  { 0u, 0u }
 
 // Asynchronous dispatcher interface.
 //
@@ -50,7 +51,6 @@
 // - Posting tasks: |post_task|, |cancel_task|
 // - Queuing packets: |queue_packet|
 // - Virtual machine operations: |set_guest_bell_trap|
-// - Exception handling: |bind_exception_port|, |unbind_exception_port|
 //
 // To preserve binary compatibility, each successive version of this interface
 // is guaranteed to be backwards-compatible with clients of earlier versions.
@@ -70,54 +70,48 @@
 // the whole interface to ensure broad compatibility.
 typedef uint32_t async_ops_version_t;
 
-#define ASYNC_OPS_V1 ((async_ops_version_t) 1)
-#define ASYNC_OPS_V2 ((async_ops_version_t) 2)
+#define ASYNC_OPS_V1 ((async_ops_version_t)1)
+#define ASYNC_OPS_V2 ((async_ops_version_t)2)
 
 typedef struct async_ops {
-    // The interface version number, e.g. |ASYNC_OPS_V2|.
-    async_ops_version_t version;
+  // The interface version number, e.g. |ASYNC_OPS_V1|.
+  async_ops_version_t version;
 
-    // Reserved for future expansion, set to zero.
-    uint32_t reserved;
+  // Reserved for future expansion, set to zero.
+  uint32_t reserved;
 
-    // Operations supported by |ASYNC_OPS_V1|.
-    struct v1 {
-        // See |async_now()| for details.
-        zx_time_t (*now)(async_dispatcher_t* dispatcher);
-        // See |async_begin_wait()| for details.
-        zx_status_t (*begin_wait)(async_dispatcher_t* dispatcher, async_wait_t* wait);
-        // See |async_cancel_wait()| for details.
-        zx_status_t (*cancel_wait)(async_dispatcher_t* dispatcher, async_wait_t* wait);
-        // See |async_post_task()| for details.
-        zx_status_t (*post_task)(async_dispatcher_t* dispatcher, async_task_t* task);
-        // See |async_cancel_task()| for details.
-        zx_status_t (*cancel_task)(async_dispatcher_t* dispatcher, async_task_t* task);
-        // See |async_queue_packet()| for details.
-        zx_status_t (*queue_packet)(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
-                                    const zx_packet_user_t* data);
-        // See |async_set_guest_bell_trap()| for details.
-        zx_status_t (*set_guest_bell_trap)(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
-                                           zx_handle_t guest, zx_vaddr_t addr, size_t length);
-    } v1;
-
-    // Operations supported by |ASYNC_OPS_V2|, in addition to those in V1.
-    struct v2 {
-        // See |async_bind_exception_port()| for details.
-        zx_status_t (*bind_exception_port)(async_dispatcher_t* dispatcher,
-                                           async_exception_t* exception);
-        // See |async_unbind_exception_port()| for details.
-        zx_status_t (*unbind_exception_port)(async_dispatcher_t* dispatcher,
-                                             async_exception_t* exception);
-        // See |async_resume_from_exception()| for details.
-        zx_status_t (*resume_from_exception)(async_dispatcher_t* dispatcher,
-                                             async_exception_t* exception,
-                                             zx_handle_t task,
-                                             uint32_t options);
-    } v2;
+  // Operations supported by |ASYNC_OPS_V1|.
+  struct v1 {
+    // See |async_now()| for details.
+    zx_time_t (*now)(async_dispatcher_t* dispatcher);
+    // See |async_begin_wait()| for details.
+    zx_status_t (*begin_wait)(async_dispatcher_t* dispatcher, async_wait_t* wait);
+    // See |async_cancel_wait()| for details.
+    zx_status_t (*cancel_wait)(async_dispatcher_t* dispatcher, async_wait_t* wait);
+    // See |async_post_task()| for details.
+    zx_status_t (*post_task)(async_dispatcher_t* dispatcher, async_task_t* task);
+    // See |async_cancel_task()| for details.
+    zx_status_t (*cancel_task)(async_dispatcher_t* dispatcher, async_task_t* task);
+    // See |async_queue_packet()| for details.
+    zx_status_t (*queue_packet)(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
+                                const zx_packet_user_t* data);
+    // See |async_set_guest_bell_trap()| for details.
+    zx_status_t (*set_guest_bell_trap)(async_dispatcher_t* dispatcher,
+                                       async_guest_bell_trap_t* trap, zx_handle_t guest,
+                                       zx_vaddr_t addr, size_t length);
+  } v1;
+  struct v2 {
+    zx_status_t (*bind_irq)(async_dispatcher_t* dispatcher, async_irq_t* irq);
+    zx_status_t (*unbind_irq)(async_dispatcher_t* dispatcher, async_irq_t* irq);
+    zx_status_t (*create_paged_vmo)(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                                    uint32_t options, zx_handle_t pager, uint64_t vmo_size,
+                                    zx_handle_t* vmo_out);
+    zx_status_t (*detach_paged_vmo)(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo);
+  } v2;
 } async_ops_t;
 
 struct async_dispatcher {
-    const async_ops_t* ops;
+  const async_ops_t* ops;
 };
 
 __END_CDECLS
diff --git a/pkg/async/include/lib/async/exception.h b/pkg/async/include/lib/async/exception.h
deleted file mode 100644
index 654a294..0000000
--- a/pkg/async/include/lib/async/exception.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// 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.
-
-#ifndef LIB_ASYNC_EXCEPTION_H_
-#define LIB_ASYNC_EXCEPTION_H_
-
-#include <lib/async/dispatcher.h>
-
-__BEGIN_CDECLS
-
-// Handles receipt of packets containing exception reports.
-//
-// The |status| is |ZX_OK| if the packet was successfully delivered and |data|
-// contains the information from the packet, otherwise |data| is null.
-// The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down.
-typedef void(async_exception_handler_t)(async_dispatcher_t* dispatcher,
-                                        async_exception_t* exception,
-                                        zx_status_t status,
-                                        const zx_port_packet_t* report);
-
-// Holds content for an exception packet receiver and its handler.
-//
-// The client is responsible for retaining the structure in memory
-// (and unmodified) until all packets have been received by the handler or the
-// dispatcher shuts down.
-//
-// Multiple packets may be delivered to the same receiver concurrently.
-struct async_exception {
-    // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
-    async_state_t state;
-
-    // The handler to invoke when a packet is received.
-    async_exception_handler_t* handler;
-
-    // The task we're watching.
-    zx_handle_t task;
-
-    // The options to pass to zx_task_bind_exception_port().
-    uint32_t options;
-};
-
-// Bind the async port to the task's exception port.
-//
-// Returns |ZX_OK| if task's exception port was successfully bound to.
-// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
-// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
-// Other error values are possible. See the documentation for
-// |zx_task_bind_exception_port()|.
-//
-// This operation is thread-safe.
-zx_status_t async_bind_exception_port(async_dispatcher_t* dispatcher,
-                                      async_exception_t* exception);
-
-// Unbind the async port from |task|'s exception port.
-//
-// Returns |ZX_OK| if the task's exception port was successfully unbound.
-// Returns |ZX_ERR_NOT_FOUND| if the port is not bound.
-// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
-// Other error values are possible. See the documentation for
-// |zx_task_bind_exception_port()|.
-//
-// This operation is thread-safe.
-zx_status_t async_unbind_exception_port(async_dispatcher_t* dispatcher,
-                                        async_exception_t* exception);
-
-// Resume |task| after having processed an exception for it.
-// |options| is passed to |zx_task_resume_from_exception()|.
-//
-// Returns |ZX_OK| if the task was resumed.
-// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
-// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
-// Other error values are possible. See the documentation for
-// |zx_task_resume_from_exception()|.
-//
-// This operation is thread-safe.
-zx_status_t async_resume_from_exception(async_dispatcher_t* dispatcher,
-                                        async_exception_t* exception,
-                                        zx_handle_t task,
-                                        uint32_t options);
-
-__END_CDECLS
-
-#endif  // LIB_ASYNC_EXCEPTION_H_
diff --git a/pkg/async/include/lib/async/irq.h b/pkg/async/include/lib/async/irq.h
new file mode 100644
index 0000000..1ad2510
--- /dev/null
+++ b/pkg/async/include/lib/async/irq.h
@@ -0,0 +1,57 @@
+// 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.
+
+#ifndef LIB_ASYNC_IRQ_H_
+#define LIB_ASYNC_IRQ_H_
+
+#include <lib/async/dispatcher.h>
+
+__BEGIN_CDECLS
+
+// Handles interrupt.
+//
+// The |status| is |ZX_OK| if the IRQ was signalled.
+// The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
+// the task's handler ran or the task was canceled.
+typedef void(async_irq_handler_t)(async_dispatcher_t* dispatcher, async_irq_t* irq,
+                                  zx_status_t status, const zx_packet_interrupt_t* signal);
+
+// Similar to async_wait, but holds state for an interrupt.
+struct async_irq {
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
+
+  // The wait's handler function.
+  async_irq_handler_t* handler;
+
+  // The object to wait for signals on.
+  zx_handle_t object;
+};
+
+// Begins asynchronously waiting on an IRQ specified in |irq|.
+// Invokes the handler when the wait completes.
+// The wait's handler will be invoked exactly once unless the wait is canceled.
+// When the dispatcher is shutting down (being destroyed), the handlers of
+// all remaining waits will be invoked with a status of |ZX_ERR_CANCELED|.
+//
+// Returns |ZX_OK| if the wait was successfully begun.
+// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+//
+// This operation is thread-safe.
+zx_status_t async_bind_irq(async_dispatcher_t* dispatcher, async_irq_t* irq);
+
+// Unbinds the IRQ associated with |irq|.
+//
+// If successful, the IRQ will be unbound from the async loop.
+//
+// Returns |ZX_OK| if the IRQ has been successfully unbound.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+//
+// This operation is thread-safe.
+zx_status_t async_unbind_irq(async_dispatcher_t* dispatcher, async_irq_t* irq);
+
+__END_CDECLS
+
+#endif  // LIB_ASYNC_IRQ_H_
diff --git a/pkg/async/include/lib/async/paged_vmo.h b/pkg/async/include/lib/async/paged_vmo.h
new file mode 100644
index 0000000..88b575b
--- /dev/null
+++ b/pkg/async/include/lib/async/paged_vmo.h
@@ -0,0 +1,62 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ASYNC_PAGED_VMO_H_
+#define LIB_ASYNC_PAGED_VMO_H_
+
+#include <lib/async/dispatcher.h>
+
+__BEGIN_CDECLS
+
+// Handles port packets containing page requests.
+//
+// The |status| is |ZX_OK| if the packet was successfully delivered and |request|
+// contains the information from the packet, otherwise |request| is null.
+// The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down.
+typedef void(async_paged_vmo_handler_t)(async_dispatcher_t* dispatcher,
+                                        async_paged_vmo_t* paged_vmo, zx_status_t status,
+                                        const zx_packet_page_request_t* request);
+
+// Holds content for a paged request packet receiver and its handler.
+//
+// The client is responsible for retaining the structure in memory
+// (and unmodified) until all packets have been received by the handler or the
+// dispatcher shuts down.
+struct async_paged_vmo {
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
+
+  // The handler to invoke when a packet is received.
+  async_paged_vmo_handler_t* handler;
+
+  // The associated pager when creating the VMO.
+  zx_handle_t pager;
+
+  // The VMO for this request.
+  zx_handle_t vmo;
+};
+
+// Create a pager owned VMO.
+//
+// Returns |ZX_ERR_BAD_STATE| if the dispatcher is shutting down.
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+// Other error values are possible. See the documentation for
+// |zx_pager_create_vmo()|.
+zx_status_t async_create_paged_vmo(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                                   uint32_t options, zx_handle_t pager, uint64_t vmo_size,
+                                   zx_handle_t* vmo_out);
+
+// Detach ownership of VMO from pager.
+//
+// Returns |ZX_ERR_NOT_SUPPORTED| if not supported by the dispatcher.
+// Returns |ZX_ERR_BAD_HANDLE| if pager or vmo is not a valid handle.
+// Returns |ZX_ERR_WRONG_TYPE| if pager is not a pager handle or vmo is not a vmo handle.
+// Returns |ZX_ERR_INVALID_ARGS| if vmo is not a vmo created from pager.
+// Other error values are possible. See the documentation for
+// |zx_detach_paged_vmo()|.
+zx_status_t async_detach_paged_vmo(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo);
+
+__END_CDECLS
+
+#endif  // LIB_ASYNC_PAGED_VMO_H_
diff --git a/pkg/async/include/lib/async/receiver.h b/pkg/async/include/lib/async/receiver.h
index 453df71..ed60d7c 100644
--- a/pkg/async/include/lib/async/receiver.h
+++ b/pkg/async/include/lib/async/receiver.h
@@ -13,10 +13,8 @@
 //
 // The |status| is |ZX_OK| if the packet was successfully delivered and |data|
 // contains the information from the packet, otherwise |data| is null.
-typedef void(async_receiver_handler_t)(async_dispatcher_t* dispatcher,
-                                       async_receiver_t* receiver,
-                                       zx_status_t status,
-                                       const zx_packet_user_t* data);
+typedef void(async_receiver_handler_t)(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
+                                       zx_status_t status, const zx_packet_user_t* data);
 
 // Holds content for a packet receiver and its handler.
 //
@@ -27,11 +25,11 @@
 //
 // Multiple packets may be delivered to the same receiver concurrently.
 struct async_receiver {
-    // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
-    async_state_t state;
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
 
-    // The handler to invoke when a packet is received.
-    async_receiver_handler_t* handler;
+  // The handler to invoke when a packet is received.
+  async_receiver_handler_t* handler;
 };
 
 // Enqueues a packet of data for delivery to a receiver.
@@ -49,4 +47,4 @@
 
 __END_CDECLS
 
-#endif  // LIB_ASYNC_RECEIVER_H_
\ No newline at end of file
+#endif  // LIB_ASYNC_RECEIVER_H_
diff --git a/pkg/async/include/lib/async/task.h b/pkg/async/include/lib/async/task.h
index ee0b295..936270e 100644
--- a/pkg/async/include/lib/async/task.h
+++ b/pkg/async/include/lib/async/task.h
@@ -13,9 +13,8 @@
 //
 // The |status| is |ZX_OK| if the task's deadline elapsed and the task should run.
 // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
-// the task's handler ran or the task was canceled.
-typedef void(async_task_handler_t)(async_dispatcher_t* dispatcher,
-                                   async_task_t* task,
+// the task's handler ran.
+typedef void(async_task_handler_t)(async_dispatcher_t* dispatcher, async_task_t* task,
                                    zx_status_t status);
 
 // Holds context for a task and its handler.
@@ -25,16 +24,16 @@
 // is successfully canceled, or the dispatcher shuts down.  Thereafter, the task
 // may be posted again or destroyed.
 struct async_task {
-    // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
-    async_state_t state;
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
 
-    // The task's handler function.
-    async_task_handler_t* handler;
+  // The task's handler function.
+  async_task_handler_t* handler;
 
-    // The task's deadline must be expressed in the time base used by the asynchronous
-    // dispatcher (usually |ZX_CLOCK_MONOTONIC| except in unit tests).
-    // See |async_now()| for details.
-    zx_time_t deadline;
+  // The task's deadline must be expressed in the time base used by the asynchronous
+  // dispatcher (usually |ZX_CLOCK_MONOTONIC| except in unit tests).
+  // See |async_now()| for details.
+  zx_time_t deadline;
 };
 
 // Posts a task to run on or after its deadline following all posted
@@ -67,4 +66,4 @@
 
 __END_CDECLS
 
-#endif  // LIB_ASYNC_TASK_H_
\ No newline at end of file
+#endif  // LIB_ASYNC_TASK_H_
diff --git a/pkg/async/include/lib/async/time.h b/pkg/async/include/lib/async/time.h
index fe62cd5..c800099 100644
--- a/pkg/async/include/lib/async/time.h
+++ b/pkg/async/include/lib/async/time.h
@@ -16,4 +16,4 @@
 
 __END_CDECLS
 
-#endif  // LIB_ASYNC_TIME_H_
\ No newline at end of file
+#endif  // LIB_ASYNC_TIME_H_
diff --git a/pkg/async/include/lib/async/trap.h b/pkg/async/include/lib/async/trap.h
index 814d9ef..6bd62c6 100644
--- a/pkg/async/include/lib/async/trap.h
+++ b/pkg/async/include/lib/async/trap.h
@@ -14,8 +14,7 @@
 // The |status| is |ZX_OK| if the bell was received and |bell| contains the
 // information from the packet, otherwise |bell| is null.
 typedef void(async_guest_bell_trap_handler_t)(async_dispatcher_t* dispatcher,
-                                              async_guest_bell_trap_t* trap,
-                                              zx_status_t status,
+                                              async_guest_bell_trap_t* trap, zx_status_t status,
                                               const zx_packet_guest_bell_t* bell);
 
 // Holds context for a bell trap and its handler.
@@ -24,11 +23,11 @@
 // the structure in memory (and unmodified) until the guest has been destroyed or the
 // dispatcher shuts down.  There is no way to cancel a trap which has been set.
 struct async_guest_bell_trap {
-    // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
-    async_state_t state;
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
 
-    // The handler to invoke to handle the trap access.
-    async_guest_bell_trap_handler_t* handler;
+  // The handler to invoke to handle the trap access.
+  async_guest_bell_trap_handler_t* handler;
 };
 
 // Sets a bell trap in the guest to be handled asynchronously via a handler.
@@ -53,4 +52,4 @@
 
 __END_CDECLS
 
-#endif  // LIB_ASYNC_TRAP_H_
\ No newline at end of file
+#endif  // LIB_ASYNC_TRAP_H_
diff --git a/pkg/async/include/lib/async/wait.h b/pkg/async/include/lib/async/wait.h
index d359979..713986f 100644
--- a/pkg/async/include/lib/async/wait.h
+++ b/pkg/async/include/lib/async/wait.h
@@ -14,10 +14,8 @@
 // The |status| is |ZX_OK| if the wait was satisfied and |signal| is non-null.
 // The |status| is |ZX_ERR_CANCELED| if the dispatcher was shut down before
 // the task's handler ran or the task was canceled.
-typedef void(async_wait_handler_t)(async_dispatcher_t* dispatcher,
-                                   async_wait_t* wait,
-                                   zx_status_t status,
-                                   const zx_packet_signal_t* signal);
+typedef void(async_wait_handler_t)(async_dispatcher_t* dispatcher, async_wait_t* wait,
+                                   zx_status_t status, const zx_packet_signal_t* signal);
 
 // Holds context for an asynchronous wait operation and its handler.
 //
@@ -26,17 +24,20 @@
 // is successfully canceled, or the dispatcher shuts down.  Thereafter, the wait
 // may be started begun or destroyed.
 struct async_wait {
-    // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
-    async_state_t state;
+  // Private state owned by the dispatcher, initialize to zero with |ASYNC_STATE_INIT|.
+  async_state_t state;
 
-    // The wait's handler function.
-    async_wait_handler_t* handler;
+  // The wait's handler function.
+  async_wait_handler_t* handler;
 
-    // The object to wait for signals on.
-    zx_handle_t object;
+  // The object to wait for signals on.
+  zx_handle_t object;
 
-    // The set of signals to wait for.
-    zx_signals_t trigger;
+  // The set of signals to wait for.
+  zx_signals_t trigger;
+
+  // Wait options, see zx_object_wait_async().
+  uint32_t options;
 };
 
 // Begins asynchronously waiting for an object to receive one or more signals
@@ -71,4 +72,4 @@
 
 __END_CDECLS
 
-#endif  // LIB_ASYNC_WAIT_H_
\ No newline at end of file
+#endif  // LIB_ASYNC_WAIT_H_
diff --git a/pkg/async/meta.json b/pkg/async/meta.json
index 31913e9..94a8433 100644
--- a/pkg/async/meta.json
+++ b/pkg/async/meta.json
@@ -1,31 +1,24 @@
 {
-  "banjo_deps": [], 
-  "deps": [], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/async/ops.c", 
-    "pkg/async/include/lib/async/dispatcher.h", 
-    "pkg/async/include/lib/async/exception.h", 
-    "pkg/async/include/lib/async/receiver.h", 
-    "pkg/async/include/lib/async/task.h", 
-    "pkg/async/include/lib/async/time.h", 
-    "pkg/async/include/lib/async/trap.h", 
-    "pkg/async/include/lib/async/wait.h"
-  ], 
+  "banjo_deps": [],
+  "deps": [
+    "fit"
+  ],
+  "fidl_deps": [],
   "headers": [
-    "pkg/async/include/lib/async/dispatcher.h", 
-    "pkg/async/include/lib/async/exception.h", 
-    "pkg/async/include/lib/async/receiver.h", 
-    "pkg/async/include/lib/async/task.h", 
-    "pkg/async/include/lib/async/time.h", 
-    "pkg/async/include/lib/async/trap.h", 
+    "pkg/async/include/lib/async/dispatcher.h",
+    "pkg/async/include/lib/async/irq.h",
+    "pkg/async/include/lib/async/paged_vmo.h",
+    "pkg/async/include/lib/async/receiver.h",
+    "pkg/async/include/lib/async/task.h",
+    "pkg/async/include/lib/async/time.h",
+    "pkg/async/include/lib/async/trap.h",
     "pkg/async/include/lib/async/wait.h"
-  ], 
-  "include_dir": "pkg/async/include", 
-  "name": "async", 
-  "root": "pkg/async", 
+  ],
+  "include_dir": "pkg/async/include",
+  "name": "async",
+  "root": "pkg/async",
   "sources": [
     "pkg/async/ops.c"
-  ], 
+  ],
   "type": "cc_source_library"
 }
\ No newline at end of file
diff --git a/pkg/async/ops.c b/pkg/async/ops.c
index e3b1d6d..4bea01a 100644
--- a/pkg/async/ops.c
+++ b/pkg/async/ops.c
@@ -8,55 +8,61 @@
 #include <lib/async/trap.h>
 #include <lib/async/wait.h>
 
-zx_time_t async_now(async_dispatcher_t* dispatcher) {
-    return dispatcher->ops->v1.now(dispatcher);
-}
+zx_time_t async_now(async_dispatcher_t* dispatcher) { return dispatcher->ops->v1.now(dispatcher); }
 
 zx_status_t async_begin_wait(async_dispatcher_t* dispatcher, async_wait_t* wait) {
-    return dispatcher->ops->v1.begin_wait(dispatcher, wait);
+  return dispatcher->ops->v1.begin_wait(dispatcher, wait);
 }
 
 zx_status_t async_cancel_wait(async_dispatcher_t* dispatcher, async_wait_t* wait) {
-    return dispatcher->ops->v1.cancel_wait(dispatcher, wait);
+  return dispatcher->ops->v1.cancel_wait(dispatcher, wait);
 }
 
 zx_status_t async_post_task(async_dispatcher_t* dispatcher, async_task_t* task) {
-    return dispatcher->ops->v1.post_task(dispatcher, task);
+  return dispatcher->ops->v1.post_task(dispatcher, task);
 }
 
 zx_status_t async_cancel_task(async_dispatcher_t* dispatcher, async_task_t* task) {
-    return dispatcher->ops->v1.cancel_task(dispatcher, task);
+  return dispatcher->ops->v1.cancel_task(dispatcher, task);
 }
 
 zx_status_t async_queue_packet(async_dispatcher_t* dispatcher, async_receiver_t* receiver,
                                const zx_packet_user_t* data) {
-    return dispatcher->ops->v1.queue_packet(dispatcher, receiver, data);
+  return dispatcher->ops->v1.queue_packet(dispatcher, receiver, data);
 }
 
 zx_status_t async_set_guest_bell_trap(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
                                       zx_handle_t guest, zx_vaddr_t addr, size_t length) {
-    return dispatcher->ops->v1.set_guest_bell_trap(dispatcher, trap, guest, addr, length);
+  return dispatcher->ops->v1.set_guest_bell_trap(dispatcher, trap, guest, addr, length);
 }
 
-zx_status_t async_bind_exception_port(async_dispatcher_t* dispatcher,
-                                      async_exception_t* exception) {
-    if (dispatcher->ops->version < ASYNC_OPS_V2)
-        return ZX_ERR_NOT_SUPPORTED;
-    return dispatcher->ops->v2.bind_exception_port(dispatcher, exception);
+zx_status_t async_bind_irq(async_dispatcher_t* dispatcher, async_irq_t* irq) {
+  if (dispatcher->ops->version < ASYNC_OPS_V2) {
+    return ZX_ERR_NOT_SUPPORTED;
+  }
+  return dispatcher->ops->v2.bind_irq(dispatcher, irq);
 }
 
-zx_status_t async_unbind_exception_port(async_dispatcher_t* dispatcher,
-                                        async_exception_t* exception) {
-    if (dispatcher->ops->version < ASYNC_OPS_V2)
-        return ZX_ERR_NOT_SUPPORTED;
-    return dispatcher->ops->v2.unbind_exception_port(dispatcher, exception);
+zx_status_t async_unbind_irq(async_dispatcher_t* dispatcher, async_irq_t* irq) {
+  if (dispatcher->ops->version < ASYNC_OPS_V2) {
+    return ZX_ERR_NOT_SUPPORTED;
+  }
+  return dispatcher->ops->v2.unbind_irq(dispatcher, irq);
 }
 
-zx_status_t async_resume_from_exception(async_dispatcher_t* dispatcher,
-                                        async_exception_t* exception,
-                                        zx_handle_t task,
-                                        uint32_t options) {
-    if (dispatcher->ops->version < ASYNC_OPS_V2)
-        return ZX_ERR_NOT_SUPPORTED;
-    return dispatcher->ops->v2.resume_from_exception(dispatcher, exception, task, options);
+zx_status_t async_create_paged_vmo(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo,
+                                   uint32_t options, zx_handle_t pager, uint64_t vmo_size,
+                                   zx_handle_t* vmo_out) {
+  if (dispatcher->ops->version < ASYNC_OPS_V2) {
+    return ZX_ERR_NOT_SUPPORTED;
+  }
+  return dispatcher->ops->v2.create_paged_vmo(dispatcher, paged_vmo, options, pager, vmo_size,
+                                              vmo_out);
+}
+
+zx_status_t async_detach_paged_vmo(async_dispatcher_t* dispatcher, async_paged_vmo_t* paged_vmo) {
+  if (dispatcher->ops->version < ASYNC_OPS_V2) {
+    return ZX_ERR_NOT_SUPPORTED;
+  }
+  return dispatcher->ops->v2.detach_paged_vmo(dispatcher, paged_vmo);
 }
diff --git a/pkg/fdio/include/lib/fdio/debug.h b/pkg/fdio/include/lib/fdio/debug.h
deleted file mode 100644
index 22acfb6..0000000
--- a/pkg/fdio/include/lib/fdio/debug.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <stdio.h>
-#include <zircon/compiler.h>
-
-__BEGIN_CDECLS
-
-// per-file chatty debug macro
-#define xprintf(fmt, args...)                                                                      \
-    do {                                                                                           \
-        if (ZXDEBUG) {                                                                             \
-            printf("%s:%d: " fmt, __FILE__, __LINE__, ##args);                                     \
-        }                                                                                          \
-    } while (0)
-
-__END_CDECLS
diff --git a/pkg/fdio/include/lib/fdio/directory.h b/pkg/fdio/include/lib/fdio/directory.h
new file mode 100644
index 0000000..e4f4d50
--- /dev/null
+++ b/pkg/fdio/include/lib/fdio/directory.h
@@ -0,0 +1,144 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_DIRECTORY_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_DIRECTORY_H_
+
+#include <lib/fdio/fd.h>
+#include <lib/fdio/fdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// Connects to a service at the given |path|.
+//
+// The |path| is looked up in the namespace for the current process. If found in
+// the namespace, the object at the path is opened, passing the |request| to
+// the remote party.
+//
+// Upon success, the |request| is handed off to the remote party. The operation
+// completes asynchronously, which means a ZX_OK result does not ensure that the
+// requested service actually exists.
+//
+// |request| must be a channel.
+//
+// Always consumes |request|.
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: |path| is invalid.
+//
+// ZX_ERR_NOT_FOUND: A prefix of |path| cannot be found in the namespace for the
+// current process.
+//
+// ZX_ERR_NOT_SUPPORTED: The requested |path| was found in the namespace for the
+// current process but the namespace entry does not support connecting to
+// services.
+//
+// ZX_ERR_ACCESS_DENIED: The namespace entry has insufficient rights to connect
+// to services.
+zx_status_t fdio_service_connect(const char* path, zx_handle_t request);
+
+// Connects to a service at the given |path| relative to the given |directory|.
+//
+// Upon success, the |request| is handed off to the remote party. The operation
+// completes asynchronously, which means a ZX_OK result does not ensure that the
+// requested service actually exists.
+//
+// |directory| must be a channel that implements the |fuchsia.io.Directory|
+// protocol.
+//
+// |request| must be a channel.
+//
+// Always consumes |request|.
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: |directory| or |path| is invalid.
+//
+// ZX_ERR_ACCESS_DENIED: |directory| has insufficient rights to connect to
+// services.
+zx_status_t fdio_service_connect_at(zx_handle_t directory, const char* path, zx_handle_t request);
+
+// Opens the remote object at the given |path| relative to the root of the namespace with the given
+// |flags| asynchronously.
+//
+// |flags| is a bit field of |fuchsia.io.OPEN_*|.
+//
+// Always consumes |request|.
+//
+// See |fdio_service_connect| for details.
+zx_status_t fdio_open(const char* path, uint32_t flags, zx_handle_t request);
+
+// Opens the remote object at the given |path| relative to the given |directory| with the given
+// |flags| asynchronously.
+//
+// |flags| is a bit field of |fuchsia.io.OPEN_*|.
+//
+// Always consumes |request|.
+//
+// See |fdio_service_connect_at| for details.
+zx_status_t fdio_open_at(zx_handle_t directory, const char* path, uint32_t flags,
+                         zx_handle_t request);
+
+// Opens the remote object at the given |path| relative to the root of the namespace with the given
+// |flags| synchronously, and on success, binds that channel to a file descriptor, returned via
+// |out_fd|.
+//
+// Note that unlike fdio_open, this function is synchronous. This is because it produces a file
+// descriptor, which requires synchronously waiting for the open to complete.
+//
+// |flags| is a bit field of |fuchsia.io.OPEN_*|.
+//
+// See |fdio_service_connect| for details.
+zx_status_t fdio_open_fd(const char* path, uint32_t flags, int* out_fd);
+
+// Opens the remote object at the given |path| relative to the given |dir_fd| with the given |flags|
+// synchronously, and on success, binds that channel to a file descriptor, returned via |out_fd|.
+//
+// Note that unlike fdio_open, this function is synchronous. This is because it produces a file
+// descriptor, which requires synchronously waiting for the open to complete.
+//
+// |flags| is a bit field of |fuchsia.io.OPEN_*|.
+//
+// See |fdio_service_connect| fort details.
+zx_status_t fdio_open_fd_at(int dir_fd, const char* path, uint32_t flags, int* out_fd);
+
+// Clone the given |node| asynchronously.
+//
+// |node| must be a channel that implements the |fuchsia.io.Node| protocol.
+//
+// Upon success, returns a handle to a newly created channel whose remote
+// endpoint has been sent to |node| as a request for a clone.
+//
+// The |node| is cloned as readable and writable.
+//
+// Upon failure, returns |ZX_HANDLE_INVALID|.
+zx_handle_t fdio_service_clone(zx_handle_t node);
+
+// Requests that |request| be connected to a clone of the given |node|
+// asynchronously.
+//
+// |node| must be a channel that implements the |fuchsia.io.Node| protocol.
+//
+// |request| must be a channel.
+//
+// Upon success, |request| has been sent to |node| as a request for a clone.
+//
+// The |node| is cloned as readable and writable.
+//
+// # Errors
+//
+// |ZX_ERR_INVALID_ARGS|: |node| or |request| is invalid.
+//
+// Returns transport- and application-level errors associated with
+// |fuchsia.io.Node/Clone|.
+zx_status_t fdio_service_clone_to(zx_handle_t node, zx_handle_t request);
+
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_DIRECTORY_H_
diff --git a/pkg/fdio/include/lib/fdio/fd.h b/pkg/fdio/include/lib/fdio/fd.h
new file mode 100644
index 0000000..eb63d31
--- /dev/null
+++ b/pkg/fdio/include/lib/fdio/fd.h
@@ -0,0 +1,99 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_FD_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_FD_H_
+
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// Create a file descriptor from a |zx_handle_t|.
+//
+// The |handle| must be to a channel, socket, vmo, or debuglog object.
+//
+// If the |zx_handle_t| is a channel, then the channel must implement the
+// |fuchsia.io.Node| protocol.
+//
+// For more precise control over which file descriptor is allocated, consider
+// using |fdio_create| and |fdio_bind_to_fd|.
+//
+// Always consumes |handle|.
+//
+// Upon success, |fd_out| contains a file descriptor that can be used to access
+// |handle|.
+//
+// # Errors
+//
+// TODO: Catalog errors.
+zx_status_t fdio_fd_create(zx_handle_t handle, int* fd_out);
+
+// Clones the current working directory.
+//
+// Upon success, |out_handle| contains a handle that represents the current
+// working directory. This handle is suitable for tranferring to another
+// process.
+//
+// # Errors
+//
+// ZX_ERR_NOT_SUPPORTED: The cwd cannot be represented as a |zx_handle_t|.
+//
+// ZX_ERR_BAD_STATE: The cwd cannot be cloned in its current state.
+//
+// ZX_ERR_ACCESS_DENIED: The cwd has insufficient rights to clone the underlying
+// object.
+zx_status_t fdio_cwd_clone(zx_handle_t* out_handle);
+
+// Clones a file descriptor.
+//
+// Upon success, |out_handle| contains a handle that represents the given file
+// descriptor. This handle is suitable for tranferring to another process.
+//
+// |fd| is not modified by this function.
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: |fd| is not a valid file descriptor.
+//
+// ZX_ERR_NOT_SUPPORTED: |fd| cannot be represented as a |zx_handle_t|.
+//
+// ZX_ERR_BAD_STATE: |fd| cannot be cloned in its current state.
+//
+// ZX_ERR_ACCESS_DENIED: |fd| has insufficient rights to clone the underlying
+// object.
+zx_status_t fdio_fd_clone(int fd, zx_handle_t* out_handle);
+
+// Prepares a file descriptor for transfer to another process.
+//
+// Upon success, |out_handle| contains a handle that represents the given file
+// descriptor, and the given file descriptor has been removed from the file
+// descriptor table for this process.
+//
+// Upon failure, |fd| might or might not be removed from the file descriptor
+// table for this process, depending on the error condition. If this function
+// returns |ZX_ERR_INVALID_ARGS| or |ZX_ERR_UNAVAILABLE|, the file descriptor
+// is not consumed. Otherwise, the file descriptor is consumed.
+//
+// TODO(REVIEW): This function should always consume the file descriptor.
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: |fd| is not a valid file descriptor.
+//
+// ZX_ERR_UNAVAILABLE: |fd| is busy or has been dup'ed and therefore is
+// referenced by multiple entries in the file descriptor table.
+//
+// ZX_ERR_NOT_SUPPORTED: |fd| cannot be represented as a |zx_handle_t|.
+//
+// ZX_ERR_BAD_STATE: |fd| cannot be transferred to another process in its
+// current state.
+//
+// ZX_ERR_ACCESS_DENIED: |fd| has insufficient rights to clone the underlying
+// object.
+zx_status_t fdio_fd_transfer(int fd, zx_handle_t* out_handle);
+
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_FD_H_
diff --git a/pkg/fdio/include/lib/fdio/fdio.h b/pkg/fdio/include/lib/fdio/fdio.h
new file mode 100644
index 0000000..544972d
--- /dev/null
+++ b/pkg/fdio/include/lib/fdio/fdio.h
@@ -0,0 +1,124 @@
+// 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.
+
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_FDIO_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_FDIO_H_
+
+#include <stdint.h>
+#include <unistd.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
+
+__BEGIN_CDECLS
+
+// An opaque structure that represents the object to which a file descriptor
+// refers.
+typedef struct fdio fdio_t;
+
+// Creates an |fdio_t| from a |zx_handle_t|.
+//
+// The |handle| must be to a channel, socket, vmo, or debuglog object.
+//
+// If the |zx_handle_t| is a channel, then the channel must implement the
+// |fuchsia.io.Node| protocol.
+//
+// Always consumes |handle|.
+//
+// # Errors
+//
+// TODO: Catalog errors.
+zx_status_t fdio_create(zx_handle_t handle, fdio_t** out_io);
+
+// Creates an |fdio_t| that does nothing.
+fdio_t* fdio_null_create(void);
+
+// Access the |zxio_t| field within an |fdio_t|.
+typedef struct zxio_tag zxio_t;
+zxio_t* fdio_get_zxio(fdio_t* io);
+
+// Creates a file descriptor that does nothing.
+//
+// Returns -1 and sets errno if the function is unable to create the file
+// descriptor (e.g., if the file descriptor table is full).
+int fdio_fd_create_null(void);
+
+// Install an |fdio_t| in the file descriptor table for this process.
+//
+// If fd >= 0, request a specific fd, and starting_fd is ignored.
+//
+// If fd < 0, request the first available fd >= starting_fd.
+//
+// Upon success, returns the allocated file descriptor. Returns -1 on failure.
+//
+// Upon success, takes ownership of the given reference to the |fdio_t|. That
+// reference is owned by the file descriptor table. Upon failure, the caller
+// retains ownership of that reference. Specifically, the caller is responsible
+// for calling |fdio_unsafe_release| upon failure.
+//
+// TODO(REVIEW): This function should always take ownership of the given
+// |fdio_t| reference.
+int fdio_bind_to_fd(fdio_t* io, int fd, int starting_fd);
+
+// Removes a file descriptor from the file descriptor table for this process.
+//
+// Upon success, the |fdio_t| underlying the file descriptor is returned in
+// |io_out|, and the caller receives ownership of one reference to |fdio_t|.
+// Specifically, the caller is responsible for calling |fdio_unsafe_release|
+// upon success.
+//
+// Upon failure, the file descriptor is not removed from the file descriptor
+// table for this process.
+//
+// TODO(REVIEW): This function should always consume the file descriptor.
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: |fd| is not a valid file descriptor.
+//
+// ZX_ERR_UNAVAILABLE: |fd| is busy or has been dup'ed and therefore is
+// referenced by multiple entries in the file descriptor table.
+zx_status_t fdio_unbind_from_fd(int fd, fdio_t** io_out);
+
+// If this fd represents a "service" (an rpc channel speaking
+// an unknown fidl protocol or a fuchsia.io.* protocol),
+// this call will return ZX_OK and return the underlying handle.
+// On both success and failure, the fd is effectively closed.
+//
+// ZX_ERR_NOT_SUPPORTED is returned if this fd does not represent
+// a FIDL transport
+//
+// ZX_ERR_UNAVAILABLE is returned if this fd has been dup()'d and
+// duplicates are sharing the FIDL transport
+//
+// TODO: Can also return ZX_ERR_NOT_FOUND. Maybe should be ZX_ERR_INVALID_ARGS?
+// TODO: This function appears to work only for |fuchsia.io| protocols now.
+// Should we rename it to something like |fdio_take_remote|?
+zx_status_t fdio_get_service_handle(int fd, zx_handle_t* out);
+
+// Storage for a ZXIO object.
+//
+// See <lib/zxio/ops.h> for more information.
+typedef struct zxio_storage zxio_storage_t;
+
+// Creates an |fdio_t| that is backed by a |zxio_t|.
+//
+// The |zxio_t| is initialized with a null ops table. The |zxio_storage_t| for
+// the |zxio_t| is returned via |out_storage|. The client can re-initialize the
+// |zxio_storage_t| to customize the behavior of the |zxio_t|.
+//
+// The returned |zxio_storage_t| is valid for the lifetime of the returned
+// |fdio_t|.
+//
+// To bind the |fdio_t| to a file descriptor, use |fdio_bind_to_fd|.
+//
+// Upon success, the caller receives ownership of one reference to |fdio_t|.
+// Specifically, the caller is responsible for calling |fdio_unsafe_release|
+// upon success.
+//
+// Upon failure, returns NULL.
+fdio_t* fdio_zxio_create(zxio_storage_t** out_storage);
+
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_FDIO_H_
diff --git a/pkg/fdio/include/lib/fdio/io.h b/pkg/fdio/include/lib/fdio/io.h
index b567cf4..9195abc 100644
--- a/pkg/fdio/include/lib/fdio/io.h
+++ b/pkg/fdio/include/lib/fdio/io.h
@@ -2,22 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_IO_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_IO_H_
 
+#include <lib/fdio/limits.h>
 #include <limits.h>
 #include <poll.h>
 #include <stdbool.h>
-#include <unistd.h> // for ssize_t
-
-#include <zircon/types.h>
+#include <unistd.h>  // for ssize_t
 #include <zircon/compiler.h>
-
-#include <lib/fdio/limits.h>
+#include <zircon/types.h>
 
 // flag on handle args in processargs
 // instructing that this fd should be dup'd to 0/1/2
 // and be used for all of stdio
-#define FDIO_FLAG_USE_FOR_STDIO 0x8000
+#define FDIO_FLAG_USE_FOR_STDIO ((uint32_t)0x8000)
 
 // events for fdio_wait_fd()
 #define FDIO_EVT_READABLE POLLIN
@@ -33,16 +32,21 @@
 
 // create a fd that works with wait APIs (epoll, select, etc.) from a handle
 // and expected signals (signals_in/signals_out correspond to POLLIN/POLLOUT
-// events respectively). the handle will be closed when the fd is closed, unless
+// events respectively). The handle will be closed when the fd is closed, unless
 // shared_handle is true.
-int fdio_handle_fd(zx_handle_t h, zx_signals_t signals_in, zx_signals_t signals_out, bool shared_handle);
+int fdio_handle_fd(zx_handle_t h, zx_signals_t signals_in, zx_signals_t signals_out,
+                   bool shared_handle);
 
-// invoke a raw fdio ioctl
-ssize_t fdio_ioctl(int fd, int op, const void* in_buf, size_t in_len, void* out_buf, size_t out_len);
-
-// create a pipe, installing one half in a fd, returning the other
-// for transport to another process
-zx_status_t fdio_pipe_half(zx_handle_t* handle, uint32_t* type);
+// Creates a pipe. The first argument returns the file descriptor representing
+// the pipe, and the second argument returns the handle of the socket used to
+// communicate with the pipe.
+//
+// # Errors
+//
+// ZX_ERR_NO_MEMORY: Failed due to a lack of memory.
+//
+// ZX_ERR_NO_RESOURCES: Failed to bind to the file descriptor.
+zx_status_t fdio_pipe_half(int* out_fd, zx_handle_t* out_handle);
 
 // Get a read-only VMO containing the whole contents of the file.
 // This function creates a clone of the underlying VMO when possible, falling
@@ -59,4 +63,10 @@
 // or clone data into a new VMO).
 zx_status_t fdio_get_vmo_exact(int fd, zx_handle_t* out_vmo);
 
+// Get a read + execute VMO containing a clone of the underlying VMO.
+// This function will fail rather than copying the contents if it cannot clone.
+zx_status_t fdio_get_vmo_exec(int fd, zx_handle_t* out_vmo);
+
 __END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_IO_H_
diff --git a/pkg/fdio/include/lib/fdio/limits.h b/pkg/fdio/include/lib/fdio/limits.h
index d6c5b68..0a3f7d1 100644
--- a/pkg/fdio/include/lib/fdio/limits.h
+++ b/pkg/fdio/include/lib/fdio/limits.h
@@ -2,22 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_LIMITS_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_LIMITS_H_
 
 #include <limits.h>
 
 // Maximum number of fds per process.
-#define FDIO_MAX_FD 256
-
-// Maximum handles used in open/clone/create.
-#define FDIO_MAX_HANDLES 3
+// TODO(fxbug.dev/33737): Investigate making the array expand dynamically to avoid
+// having to increase this further.
+#define FDIO_MAX_FD 1024
 
 // fdio_ops_t's read/write are able to do io of
 // at least this size.
 #define FDIO_CHUNK_SIZE 8192
 
-// Maximum size for an ioctl input.
-#define FDIO_IOCTL_MAX_INPUT 1024
-
 // Maximum length of a filename.
 #define FDIO_MAX_FILENAME NAME_MAX
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_LIMITS_H_
diff --git a/pkg/fdio/include/lib/fdio/namespace.h b/pkg/fdio/include/lib/fdio/namespace.h
index dcd7043..a9ced5a 100644
--- a/pkg/fdio/include/lib/fdio/namespace.h
+++ b/pkg/fdio/include/lib/fdio/namespace.h
@@ -2,23 +2,26 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_NAMESPACE_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_NAMESPACE_H_
 
 #include <stdint.h>
-
 #include <zircon/compiler.h>
 #include <zircon/types.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 typedef struct fdio_namespace fdio_ns_t;
 
-
 // Create a new, empty namespace
 zx_status_t fdio_ns_create(fdio_ns_t** out);
 
-// Destroy and deallocate a namespace
-// Will fail (ZX_ERR_BAD_STATE) if the namespace is in use.
+// Destroy and deallocate a namespace.
+//
+// If the namespace is in-use, it will be destroyed once it is
+// no longer referenced.
+//
+// This function always returns |ZX_OK|.
 zx_status_t fdio_ns_destroy(fdio_ns_t* ns);
 
 // Create a new directory within a namespace, bound to the
@@ -27,18 +30,24 @@
 // no "." nor ".." entries.  It is relative to the root of the
 // namespace.
 //
-// The handle is not closed on failure.
-//
-// Will fail with ZX_ERR_BAD_STATE if the namespace is in use.
+// Ownership of |h| is transferred to |ns|: it is closed on error.
 zx_status_t fdio_ns_bind(fdio_ns_t* ns, const char* path, zx_handle_t h);
 
+// Unbinds |path| from a namespace, closing the handle within |ns| that
+// corresponds to that path when all references to the node go out of scope.
+//
+// Returns ZX_ERR_NOT_FOUND if |path| is not a remote.
+// Returns ZX_ERR_NOT_SUPPORTED if |path| is the root of the namespace.
+// Returns ZX_ERR_INVALID_ARGS if |path| is otherwise invalid.
+zx_status_t fdio_ns_unbind(fdio_ns_t* ns, const char* path);
+
 // Create a new directory within a namespace, bound to the
 // directory referenced by the file descriptor fd.
 // The path must be an absolute path, like "/x/y/z", containing
 // no "." nor ".." entries.  It is relative to the root of the
 // namespace.
 //
-// The fd is not closed on success or failure.
+// |fd| is borrowed by this function, but is not closed on success or error.
 // Closing the fd after success does not affect namespace.
 //
 // Failures:
@@ -53,17 +62,19 @@
 // chdir to / in the provided namespace
 zx_status_t fdio_ns_chdir(fdio_ns_t* ns);
 
-// Replace the fdio "global" namespace with the provided namespace
-zx_status_t fdio_ns_install(fdio_ns_t* ns);
-
 // Retrieve the fdio "global" namespace (if any).
 zx_status_t fdio_ns_get_installed(fdio_ns_t** ns);
 
+// flat_namespace contains parallel arrays of handles, path names, and types.  The number of
+// elements of these arrays is given by |count|.  For any given offset i:
+// - handle[i] is the zx_handle_t representing that element in the namespace
+// - path[i] is the user-readable name of that element (e.g., "/bin")
+// - type[i] is a handle info entry as defined in zircon/processargs.h by PA_HND.
 typedef struct fdio_flat_namespace {
-    size_t count;
-    zx_handle_t* handle;
-    uint32_t* type;
-    const char* const* path;
+  size_t count;
+  zx_handle_t* handle;
+  uint32_t* type;
+  const char* const* path;
 } fdio_flat_namespace_t;
 
 // On success the caller takes ownership of a fdio_flat_namespace_t
@@ -71,8 +82,7 @@
 // one provided in 'ns' or the active root namespace, respectively.)
 // The handles are CLONEs of the handles in the namespace and also
 // belong to the caller.
-// The whole data structure can be released with free(), keeping in
-// mind that the handles should be used or closed first.
+// The whole data structure can be released with fdio_ns_free_flat_ns().
 zx_status_t fdio_ns_export(fdio_ns_t* ns, fdio_flat_namespace_t** out);
 zx_status_t fdio_ns_export_root(fdio_flat_namespace_t** out);
 
@@ -81,15 +91,12 @@
 // or passed to the remote service on success.
 // The path must be an absolute path starting with / and containing
 // no ".." or "." or empty segments.
-zx_status_t fdio_ns_connect(fdio_ns_t* ns, const char* path,
-                            uint32_t zxflags, zx_handle_t h);
+zx_status_t fdio_ns_connect(fdio_ns_t* ns, const char* path, uint32_t zxflags, zx_handle_t h);
 
-// Attempt a pipelined open through a namespace.
-// Success only indicates that the open was sent.
-// If the remote fails, the returned handle's peer will be closed.
-// The path must be an absolute path starting with / and containing
-// no ".." or "." or empty segments.
-zx_status_t fdio_ns_open(fdio_ns_t* ns, const char* path,
-                         uint32_t zxflags, zx_handle_t* out);
+// Frees a flat namespace.
+// Closes all handles contained within |ns|.
+void fdio_ns_free_flat_ns(fdio_flat_namespace_t* ns);
 
-__END_CDECLS;
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_NAMESPACE_H_
diff --git a/pkg/fdio/include/lib/fdio/private.h b/pkg/fdio/include/lib/fdio/private.h
index 2ceee14..6a7b1eb 100644
--- a/pkg/fdio/include/lib/fdio/private.h
+++ b/pkg/fdio/include/lib/fdio/private.h
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_PRIVATE_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_PRIVATE_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
 #include <zircon/types.h>
-#include <stdint.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // WARNING: These APIs are subject to change
 
@@ -19,4 +20,6 @@
 // is set to true if the returned path must be a directory.
 zx_status_t __fdio_cleanpath(const char* in, char* out, size_t* outlen, bool* is_dir);
 
-__END_CDECLS;
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_PRIVATE_H_
diff --git a/pkg/fdio/include/lib/fdio/spawn.h b/pkg/fdio/include/lib/fdio/spawn.h
index 94a656d..4bc19a8 100644
--- a/pkg/fdio/include/lib/fdio/spawn.h
+++ b/pkg/fdio/include/lib/fdio/spawn.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
-
-#include <zircon/compiler.h>
-#include <zircon/types.h>
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_SPAWN_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_SPAWN_H_
 
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <zircon/compiler.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
@@ -29,9 +29,6 @@
 //
 // The shared library loader is passed as |PA_LDSVC_LOADER|.
 #define FDIO_SPAWN_DEFAULT_LDSVC ((uint32_t)0x0002u)
-// FDIO_SPAWN_CLONE_LDSVC is the same as FDIO_SPAWN_DEFAULT_LDSVC.
-// TODO(ZX-3031): this name is deprecated.
-#define FDIO_SPAWN_CLONE_LDSVC ((uint32_t)0x0002u)
 
 // Clones the filesystem namespace into the spawned process.
 #define FDIO_SPAWN_CLONE_NAMESPACE ((uint32_t)0x0004u)
@@ -45,6 +42,9 @@
 // Clones the environment into the spawned process.
 #define FDIO_SPAWN_CLONE_ENVIRON ((uint32_t)0x0010u)
 
+// Clones the process-global UTC clock into the spawned process.
+#define FDIO_SPAWN_CLONE_UTC_CLOCK ((uint32_t)0x0020u)
+
 // Clones all of the above into the spawned process.
 #define FDIO_SPAWN_CLONE_ALL ((uint32_t)0xFFFFu)
 
@@ -61,10 +61,15 @@
 // |zx_job_default()|. Does not take ownership of |job|.
 //
 // Upon success, |process_out| will be a handle to the process.
-zx_status_t fdio_spawn(zx_handle_t job,
-                       uint32_t flags,
-                       const char* path,
-                       const char* const* argv,
+//
+// # Errors
+//
+// ZX_ERR_NOT_FOUND: |path| cannot be opened.
+//
+// ZX_ERR_BAD_HANDLE: |path| cannot be opened as an executable VMO.
+//
+// Returns the result of |fdio_spawn_vmo| in all other cases.
+zx_status_t fdio_spawn(zx_handle_t job, uint32_t flags, const char* path, const char* const* argv,
                        zx_handle_t* process_out);
 
 // The |fdio_spawn_etc| function allows the running process to control the file
@@ -92,6 +97,21 @@
 // If |FDIO_SPAWN_CLONE_NAMESPACE| is specified via |flags|, the namespace entry
 // is added to the cloned namespace from the calling process.
 //
+// The namespace entries are added in the order they appear in the action list.
+// If |FDIO_SPAWN_CLONE_NAMESPACE| is specified via |flags|, the entries from
+// the calling process are added before any entries specified with
+// |FDIO_SPAWN_ACTION_ADD_NS_ENTRY|.
+//
+// The spawned process decides how to process and interpret the namespace
+// entries. Typically, the spawned process with disregard duplicate entries
+// (i.e., the first entry for a given name wins) and will ignore nested entries
+// (e.g., |/foo/bar| when |/foo| has already been added to the namespace).
+//
+// To override or replace an entry in the namespace of the calling process,
+// use |fdio_ns_export_root| to export the namespace table of the calling
+// process and construct the namespace for the spawned process explicitly using
+// |FDIO_SPAWN_ACTION_ADD_NS_ENTRY|.
+//
 // The given handle will be closed regardless of whether the |fdio_spawn_etc|
 // call succeeds.
 //
@@ -113,45 +133,56 @@
 // Uses the |name| entry in the |fdio_spawn_action_t| union.
 #define FDIO_SPAWN_ACTION_SET_NAME ((uint32_t)0x0005u)
 
+// Shares the given directory by installing it into the namespace of spawned
+// process.
+//
+// Uses the |dir| entry in the |fdio_spawn_action_t| union
+#define FDIO_SPAWN_ACTION_CLONE_DIR ((uint32_t)0x0006u)
+
 // Instructs |fdio_spawn_etc| which actions to take.
 typedef struct fdio_spawn_action fdio_spawn_action_t;
 struct fdio_spawn_action {
-    // The action to take.
-    //
-    // See |FDIO_SPAWN_ACTION_*| above. If |action| is invalid, the action will
-    // be ignored (rather than generate an error).
-    uint32_t action;
-    union {
-        struct {
-            // The file descriptor in this process to clone or transfer.
-            int local_fd;
+  // The action to take.
+  //
+  // See |FDIO_SPAWN_ACTION_*| above. If |action| is invalid, the action will
+  // be ignored (rather than generate an error).
+  uint32_t action;
+  union {
+    struct {
+      // The file descriptor in this process to clone or transfer.
+      int local_fd;
 
-            // The file descriptor in the spawned process that will receive the
-            // clone or transfer.
-            int target_fd;
-        } fd;
-        struct {
-            // The prefix in which to install the given handle in the namespace
-            // of the spawned process.
-            const char* prefix;
+      // The file descriptor in the spawned process that will receive the
+      // clone or transfer.
+      int target_fd;
+    } fd;
+    struct {
+      // The prefix in which to install the given handle in the namespace
+      // of the spawned process.
+      const char* prefix;
 
-            // The handle to install with the given prefix in the namespace of
-            // the spawned process.
-            zx_handle_t handle;
-        } ns;
-        struct {
-            // The process argument identifier of the handle to pass to the
-            // spawned process.
-            uint32_t id;
+      // The handle to install with the given prefix in the namespace of
+      // the spawned process.
+      zx_handle_t handle;
+    } ns;
+    struct {
+      // The process argument identifier of the handle to pass to the
+      // spawned process.
+      uint32_t id;
 
-            // The handle to pass to the process on startup.
-            zx_handle_t handle;
-        } h;
-        struct {
-            // The name to assign to the spawned process.
-            const char* data;
-        } name;
-    };
+      // The handle to pass to the process on startup.
+      zx_handle_t handle;
+    } h;
+    struct {
+      // The name to assign to the spawned process.
+      const char* data;
+    } name;
+    struct {
+      // The directory to share with the spawned process. |prefix| may match zero or more
+      // entries in the callers flat namespace.
+      const char* prefix;
+    } dir;
+  };
 };
 
 // The maximum size for error messages from |fdio_spawn_etc|.
@@ -187,14 +218,17 @@
 // Upon success, |process_out| will be a handle to the process. Upon failure, if
 // |err_msg_out| is not null, an error message will be we written to
 // |err_msg_out|, including a null terminator.
-zx_status_t fdio_spawn_etc(zx_handle_t job,
-                           uint32_t flags,
-                           const char* path,
-                           const char* const* argv,
-                           const char* const* environ,
-                           size_t action_count,
-                           const fdio_spawn_action_t* actions,
-                           zx_handle_t* process_out,
+//
+// # Errors
+//
+// ZX_ERR_NOT_FOUND: |path| cannot be opened.
+//
+// ZX_ERR_BAD_HANDLE: |path| cannot be opened as an executable VMO.
+//
+// Returns the result of |fdio_spawn_vmo| in all other cases.
+zx_status_t fdio_spawn_etc(zx_handle_t job, uint32_t flags, const char* path,
+                           const char* const* argv, const char* const* environ, size_t action_count,
+                           const fdio_spawn_action_t* actions, zx_handle_t* process_out,
                            char err_msg_out[FDIO_SPAWN_ERR_MSG_MAX_LENGTH]);
 
 // Spawn a process using the given executable in the given job.
@@ -204,14 +238,29 @@
 // vmo.
 //
 // Always consumes |executable_vmo|.
-zx_status_t fdio_spawn_vmo(zx_handle_t job,
-                           uint32_t flags,
-                           zx_handle_t executable_vmo,
-                           const char* const* argv,
-                           const char* const* environ,
-                           size_t action_count,
-                           const fdio_spawn_action_t* actions,
-                           zx_handle_t* process_out,
+//
+// # Errors
+//
+// ZX_ERR_INVALID_ARGS: any supplied action is invalid, or the process name is unset.
+//
+// ZX_ERR_IO_INVALID: the recursion limit is hit resolving the executable name.
+//
+// ZX_ERR_BAD_HANDLE: |executable_vmo| is not a valid handle.
+//
+// ZX_ERR_WRONG_TYPE: |executable_vmo| is not a VMO handle.
+//
+// ZX_ERR_ACCESS_DENIED: |executable_vmo| is not readable.
+//
+// ZX_ERR_OUT_OF_RANGE: |executable_vmo| is smaller than the resolver prefix.
+//
+// ZX_ERR_INTERNAL: Cannot connect to process launcher.
+//
+// May return other errors.
+zx_status_t fdio_spawn_vmo(zx_handle_t job, uint32_t flags, zx_handle_t executable_vmo,
+                           const char* const* argv, const char* const* environ, size_t action_count,
+                           const fdio_spawn_action_t* actions, zx_handle_t* process_out,
                            char err_msg_out[FDIO_SPAWN_ERR_MSG_MAX_LENGTH]);
 
 __END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_SPAWN_H_
diff --git a/pkg/fdio/include/lib/fdio/unsafe.h b/pkg/fdio/include/lib/fdio/unsafe.h
index c0f7e41..7614e13 100644
--- a/pkg/fdio/include/lib/fdio/unsafe.h
+++ b/pkg/fdio/include/lib/fdio/unsafe.h
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_UNSAFE_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_UNSAFE_H_
 
+#include <stdint.h>
 #include <zircon/compiler.h>
 #include <zircon/types.h>
-#include <stdint.h>
 
-__BEGIN_CDECLS;
+__BEGIN_CDECLS
 
 // WARNING: These interfaces exist to allow integration of fdio file
 // descriptors with handle-centric message loops.  If used incorrectly
@@ -51,8 +52,8 @@
 // This function is only safe to call on a fdio_t you
 // hold a reference to.  It is not required that fdio_unsafe_wait_end() be
 // called after this.
-void fdio_unsafe_wait_begin(fdio_t* io, uint32_t events,
-                            zx_handle_t* handle_out, zx_signals_t* signals_out);
+void fdio_unsafe_wait_begin(fdio_t* io, uint32_t events, zx_handle_t* handle_out,
+                            zx_signals_t* signals_out);
 
 // This given a set of signals observed on a handle obtained
 // from fdio_unsafe_wait_begin() returns a set of posix-style events
@@ -62,4 +63,6 @@
 // hold a reference to.
 void fdio_unsafe_wait_end(fdio_t* io, zx_signals_t signals, uint32_t* events_out);
 
-__END_CDECLS;
+__END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_UNSAFE_H_
diff --git a/pkg/fdio/include/lib/fdio/util.h b/pkg/fdio/include/lib/fdio/util.h
deleted file mode 100644
index fd30748..0000000
--- a/pkg/fdio/include/lib/fdio/util.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// 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.
-
-#pragma once
-
-#include <zircon/types.h>
-#include <zircon/compiler.h>
-#include <stdint.h>
-#include <unistd.h>
-
-__BEGIN_CDECLS
-
-// These routines are "internal" to fdio but used by some companion
-// code like userboot and devmgr
-
-typedef struct fdio fdio_t;
-
-// Utilities to help assemble handles for a new process
-// may return up to FDIO_MAX_HANDLES
-zx_status_t fdio_clone_cwd(zx_handle_t* handles, uint32_t* types);
-zx_status_t fdio_clone_fd(int fd, int newfd, zx_handle_t* handles, uint32_t* types);
-zx_status_t fdio_transfer_fd(int fd, int newfd, zx_handle_t* handles, uint32_t* types);
-
-// Attempt to create an fdio fd from some handles and their associated types,
-// as returned from fdio_transfer_fd.
-//
-// Can only create fds around:
-// - Remote IO objects
-// - Pipes
-// - Connected sockets
-//
-// This function transfers ownership of handles to the fd on success, and
-// closes them on failure.
-zx_status_t fdio_create_fd(zx_handle_t* handles, uint32_t* types, size_t hcount, int* fd_out);
-
-// attempt to install a fdio in the unistd fd table
-// if fd >= 0, request a specific fd, and starting_fd is ignored
-// if fd < 0, request the first available fd >= starting_fd
-// returns fd on success
-// the fdio must have been upref'd on behalf of the fdtab first
-int fdio_bind_to_fd(fdio_t* io, int fd, int starting_fd);
-
-// attempt to detach an fdio_t from the fd table
-// returns ZX_ERR_INVALID_ARGS if fd is out of range or doesn't exist
-// returns ZX_ERR_UNAVAILABLE if the fd is busy or has been dup'd
-// returns fdio_t via io_out with refcount 1 on success
-zx_status_t fdio_unbind_from_fd(int fd, fdio_t** io_out);
-
-// If this fd represents a "service" (an rpc channel speaking
-// an unknown fidl protocol or a fuchsia.io.* protocol),
-// this call will return ZX_OK and return the underlying handle.
-// On both success and failure, the fd is effectively closed.
-//
-// ZX_ERR_NOT_SUPPORTED is returned if this fd does not represent
-// a FIDL transport
-//
-// ZX_ERR_UNAVAILABLE is returned if this fd has been dup()'d and
-// duplicates are sharing the FIDL transport
-zx_status_t fdio_get_service_handle(int fd, zx_handle_t* out);
-
-// creates a do-nothing fdio_t
-fdio_t* fdio_null_create(void);
-
-// Wraps a channel with an fdio_t using remote io.
-// Takes ownership of h and e.
-fdio_t* fdio_remote_create(zx_handle_t h, zx_handle_t event);
-
-// creates a fdio that wraps a log object
-// this will allocate a per-thread buffer (on demand) to assemble
-// entire log-lines and flush them on newline or buffer full.
-fdio_t* fdio_logger_create(zx_handle_t);
-
-typedef struct zxio_storage zxio_storage_t;
-
-// Creates an |fdio_t| that is backed by a |zxio_t|.
-//
-// The |zxio_t| is initialized with a null ops table. The |zxio_storage_t| for
-// the |zxio_t| is returned via |out_storage|. The client can re-initialize the
-// |zxio_storage_t| to customize the behavior of the |zxio_t|.
-//
-// To bind the |fdio_t| to a file descriptor, use |fdio_bind_to_fd|.
-//
-// Upon failure, returns NULL.
-fdio_t* fdio_zxio_create(zxio_storage_t** out_storage);
-
-// Attempt to connect a channel to a named service.
-// On success the channel is connected.  On failure
-// an error is returned and the handle is closed.
-zx_status_t fdio_service_connect(const char* svcpath, zx_handle_t h);
-
-// Attempt to connect a channel to a named service relative to dir.
-// On success the channel is connected.  On failure
-// an error is returned and the handle is closed.
-zx_status_t fdio_service_connect_at(zx_handle_t dir, const char* path, zx_handle_t h);
-
-// Same as |fdio_service_connect|, but allows the passing of flags.
-zx_status_t fdio_open(const char* path, uint32_t zxflags, zx_handle_t h);
-
-// Same as |fdio_service_connect_at, but allows the passing of flags.
-zx_status_t fdio_open_at(zx_handle_t dir, const char* path, uint32_t zxflags, zx_handle_t h);
-
-// Attempt to clone a service handle by doing a pipelined
-// CLONE operation, returning the new channel endpoint,
-// or ZX_HANDLE_INVALID.
-zx_handle_t fdio_service_clone(zx_handle_t h);
-
-// Attempt to clone a service handle by doing a pipelined
-// CLONE operation, using the provided serving channel.
-// On success srv is bound to a clone of h.  On failure
-// an error is returned and srv is closed.
-// Takes ownership of srv.
-zx_status_t fdio_service_clone_to(zx_handle_t h, zx_handle_t srv);
-
-__END_CDECLS
diff --git a/pkg/fdio/include/lib/fdio/vfs.h b/pkg/fdio/include/lib/fdio/vfs.h
index f32ccb1..7fbc8d7 100644
--- a/pkg/fdio/include/lib/fdio/vfs.h
+++ b/pkg/fdio/include/lib/fdio/vfs.h
@@ -2,21 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
-
-#include <zircon/types.h>
-#include <zircon/listnode.h>
-#include <zircon/compiler.h>
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_VFS_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_VFS_H_
 
 #include <stdio.h>
 #include <unistd.h>  // ssize_t
+#include <zircon/compiler.h>
+#include <zircon/listnode.h>
+#include <zircon/processargs.h>
+#include <zircon/types.h>
 
 __BEGIN_CDECLS
 
 // On Fuchsia, the Block Device is transmitted by file descriptor, rather than
 // by path. This can prevent some racy behavior relating to FS start-up.
 #ifdef __Fuchsia__
-#define FS_FD_BLOCKDEVICE 200
+#define FS_HANDLE_ROOT_ID PA_HND(PA_USER0, 0)
+#define FS_HANDLE_BLOCK_DEVICE_ID PA_HND(PA_USER0, 1)
 #endif
 
 // POSIX defines st_blocks to be the number of 512 byte blocks allocated
@@ -27,21 +29,21 @@
 #define VNATTR_BLKSIZE 512
 
 typedef struct vnattr {
-    uint32_t valid;        // mask of which bits to set for setattr
-    uint32_t mode;
-    uint64_t inode;
-    uint64_t size;
-    uint64_t blksize;      // Block size for filesystem I/O
-    uint64_t blkcount;     // Number of VNATTR_BLKSIZE byte blocks allocated
-    uint64_t nlink;
-    uint64_t create_time;  // posix time (seconds since epoch)
-    uint64_t modify_time;  // posix time
+  uint32_t valid;  // mask of which bits to set for setattr
+  uint32_t mode;
+  uint64_t inode;
+  uint64_t size;
+  uint64_t blksize;   // Block size for filesystem I/O
+  uint64_t blkcount;  // Number of VNATTR_BLKSIZE byte blocks allocated
+  uint64_t nlink;
+  uint64_t create_time;  // posix time (seconds since epoch)
+  uint64_t modify_time;  // posix time
 } vnattr_t;
 
 // mask that identifies what fields to set in setattr
-#define ATTR_CTIME  0000001
-#define ATTR_MTIME  0000002
-#define ATTR_ATIME  0000004  // not yet implemented
+#define ATTR_CTIME 0000001
+#define ATTR_MTIME 0000002
+#define ATTR_ATIME 0000004  // not yet implemented
 
 // bits compatible with POSIX stat
 #define V_TYPE_MASK 0170000
@@ -49,7 +51,7 @@
 #define V_TYPE_LINK 0120000
 #define V_TYPE_FILE 0100000
 #define V_TYPE_BDEV 0060000
-#define V_TYPE_DIR  0040000
+#define V_TYPE_DIR 0040000
 #define V_TYPE_CDEV 0020000
 #define V_TYPE_PIPE 0010000
 
@@ -73,10 +75,12 @@
 #define DTYPE_TO_VTYPE(type) (((type)&15) << 12)
 
 typedef struct vdirent {
-    uint64_t ino;
-    uint8_t size;
-    uint8_t type;
-    char name[0];
+  uint64_t ino;
+  uint8_t size;
+  uint8_t type;
+  char name[0];
 } __PACKED vdirent_t;
 
 __END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_VFS_H_
diff --git a/pkg/fdio/include/lib/fdio/watcher.h b/pkg/fdio/include/lib/fdio/watcher.h
index 441edcf..0f0eda3 100644
--- a/pkg/fdio/include/lib/fdio/watcher.h
+++ b/pkg/fdio/include/lib/fdio/watcher.h
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef LIB_FDIO_INCLUDE_LIB_FDIO_WATCHER_H_
+#define LIB_FDIO_INCLUDE_LIB_FDIO_WATCHER_H_
 
-#include <zircon/compiler.h>
 #include <lib/fdio/io.h>
+#include <zircon/compiler.h>
 
 __BEGIN_CDECLS
 
@@ -19,7 +20,7 @@
 // This event occurs, once, when fdio_watch_directory() runs
 // out of existing files and has to start waiting for new
 // files to be added.
-#define WATCH_EVENT_IDLE 3
+#define WATCH_EVENT_WAITING 3
 
 // Call the provided callback (cb) for each file in directory
 // and each time a new file is added to the directory.
@@ -39,5 +40,6 @@
 
 zx_status_t fdio_watch_directory(int dirfd, watchdir_func_t cb, zx_time_t deadline, void* cookie);
 
-
 __END_CDECLS
+
+#endif  // LIB_FDIO_INCLUDE_LIB_FDIO_WATCHER_H_
diff --git a/pkg/fdio/meta.json b/pkg/fdio/meta.json
index 51babcb..7874ac0 100644
--- a/pkg/fdio/meta.json
+++ b/pkg/fdio/meta.json
@@ -1,32 +1,35 @@
 {
   "binaries": {
     "arm64": {
-      "debug": ".build-id/eb/9ed8b78bc5865718b59bd2a3a47e3e28650f8f.debug", 
-      "dist": "arch/arm64/dist/libfdio.so", 
+      "debug": ".build-id/74/2b17fa45c78956.debug",
+      "dist": "arch/arm64/dist/libfdio.so",
+      "dist_path": "lib/libfdio.so",
       "link": "arch/arm64/lib/libfdio.so"
-    }, 
+    },
     "x64": {
-      "debug": ".build-id/fb/6715ba574ce88bcfca5045ee90fef94163808f.debug", 
-      "dist": "arch/x64/dist/libfdio.so", 
+      "debug": ".build-id/cf/a07b064427801f.debug",
+      "dist": "arch/x64/dist/libfdio.so",
+      "dist_path": "lib/libfdio.so",
       "link": "arch/x64/lib/libfdio.so"
     }
-  }, 
-  "deps": [], 
-  "format": "shared", 
+  },
+  "deps": [],
+  "format": "shared",
   "headers": [
-    "pkg/fdio/include/lib/fdio/debug.h", 
-    "pkg/fdio/include/lib/fdio/io.h", 
-    "pkg/fdio/include/lib/fdio/limits.h", 
-    "pkg/fdio/include/lib/fdio/namespace.h", 
-    "pkg/fdio/include/lib/fdio/private.h", 
-    "pkg/fdio/include/lib/fdio/spawn.h", 
-    "pkg/fdio/include/lib/fdio/unsafe.h", 
-    "pkg/fdio/include/lib/fdio/util.h", 
-    "pkg/fdio/include/lib/fdio/vfs.h", 
+    "pkg/fdio/include/lib/fdio/directory.h",
+    "pkg/fdio/include/lib/fdio/fd.h",
+    "pkg/fdio/include/lib/fdio/fdio.h",
+    "pkg/fdio/include/lib/fdio/io.h",
+    "pkg/fdio/include/lib/fdio/limits.h",
+    "pkg/fdio/include/lib/fdio/namespace.h",
+    "pkg/fdio/include/lib/fdio/private.h",
+    "pkg/fdio/include/lib/fdio/spawn.h",
+    "pkg/fdio/include/lib/fdio/unsafe.h",
+    "pkg/fdio/include/lib/fdio/vfs.h",
     "pkg/fdio/include/lib/fdio/watcher.h"
-  ], 
-  "include_dir": "pkg/fdio/include", 
-  "name": "fdio", 
-  "root": "pkg/fdio", 
+  ],
+  "include_dir": "pkg/fdio/include",
+  "name": "fdio",
+  "root": "pkg/fdio",
   "type": "cc_prebuilt_library"
 }
\ No newline at end of file
diff --git a/pkg/fidl-async/bind.c b/pkg/fidl-async/bind.c
deleted file mode 100644
index fad7132..0000000
--- a/pkg/fidl-async/bind.c
+++ /dev/null
@@ -1,147 +0,0 @@
-// 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.
-
-#include <lib/async/wait.h>
-#include <lib/fidl-async/bind.h>
-#include <stdlib.h>
-#include <string.h>
-#include <zircon/syscalls.h>
-
-typedef struct fidl_binding {
-    async_wait_t wait;
-    fidl_dispatch_t* dispatch;
-    async_dispatcher_t* dispatcher;
-    void* ctx;
-    const void* ops;
-} fidl_binding_t;
-
-typedef struct fidl_connection {
-    fidl_txn_t txn;
-    zx_handle_t channel;
-    zx_txid_t txid;
-    fidl_binding_t* binding;
-} fidl_connection_t;
-
-static zx_status_t fidl_reply(fidl_txn_t* txn, const fidl_msg_t* msg) {
-    fidl_connection_t* conn = (fidl_connection_t*)txn;
-    if (conn->txid == 0u)
-        return ZX_ERR_BAD_STATE;
-    if (msg->num_bytes < sizeof(fidl_message_header_t))
-        return ZX_ERR_INVALID_ARGS;
-    fidl_message_header_t* hdr = (fidl_message_header_t*)msg->bytes;
-    hdr->txid = conn->txid;
-    conn->txid = 0u;
-    return zx_channel_write(conn->channel, 0, msg->bytes, msg->num_bytes,
-                            msg->handles, msg->num_handles);
-}
-
-static void fidl_binding_destroy(fidl_binding_t* binding) {
-    zx_handle_close(binding->wait.object);
-    free(binding);
-}
-
-static void fidl_message_handler(async_dispatcher_t* dispatcher,
-                                 async_wait_t* wait,
-                                 zx_status_t status,
-                                 const zx_packet_signal_t* signal) {
-    fidl_binding_t* binding = (fidl_binding_t*)wait;
-    if (status != ZX_OK) {
-        goto shutdown;
-    }
-
-    if (signal->observed & ZX_CHANNEL_READABLE) {
-        char bytes[ZX_CHANNEL_MAX_MSG_BYTES];
-        zx_handle_t handles[ZX_CHANNEL_MAX_MSG_HANDLES];
-        for (uint64_t i = 0; i < signal->count; i++) {
-            fidl_msg_t msg = {
-                .bytes = bytes,
-                .handles = handles,
-                .num_bytes = 0u,
-                .num_handles = 0u,
-            };
-            status = zx_channel_read(wait->object, 0, bytes, handles,
-                                     ZX_CHANNEL_MAX_MSG_BYTES,
-                                     ZX_CHANNEL_MAX_MSG_HANDLES,
-                                     &msg.num_bytes, &msg.num_handles);
-            if (status == ZX_ERR_SHOULD_WAIT) {
-                break;
-            }
-            if (status != ZX_OK || msg.num_bytes < sizeof(fidl_message_header_t)) {
-                goto shutdown;
-            }
-            fidl_message_header_t* hdr = (fidl_message_header_t*)msg.bytes;
-            fidl_connection_t conn = {
-                .txn.reply = fidl_reply,
-                .channel = wait->object,
-                .txid = hdr->txid,
-                .binding = binding,
-            };
-            status = binding->dispatch(binding->ctx, &conn.txn, &msg, binding->ops);
-            switch (status) {
-            case ZX_OK:
-                status = async_begin_wait(dispatcher, wait);
-                if (status != ZX_OK) {
-                    goto shutdown;
-                }
-                return;
-            case ZX_ERR_ASYNC:
-                return;
-            default:
-                goto shutdown;
-            }
-        }
-    }
-
-shutdown:
-    fidl_binding_destroy(binding);
-}
-
-zx_status_t fidl_bind(async_dispatcher_t* dispatcher, zx_handle_t channel,
-                      fidl_dispatch_t* dispatch, void* ctx, const void* ops) {
-    fidl_binding_t* binding = calloc(1, sizeof(fidl_binding_t));
-    binding->wait.handler = fidl_message_handler;
-    binding->wait.object = channel;
-    binding->wait.trigger = ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED;
-    binding->dispatch = dispatch;
-    binding->dispatcher = dispatcher;
-    binding->ctx = ctx;
-    binding->ops = ops;
-    zx_status_t status = async_begin_wait(dispatcher, &binding->wait);
-    if (status != ZX_OK) {
-        fidl_binding_destroy(binding);
-    }
-    return status;
-}
-
-typedef struct fidl_async_txn {
-    fidl_connection_t connection;
-} fidl_async_txn_t;
-
-fidl_async_txn_t* fidl_async_txn_create(fidl_txn_t* txn) {
-    fidl_connection_t* connection = (fidl_connection_t*) txn;
-
-    fidl_async_txn_t* async_txn = calloc(1, sizeof(fidl_async_txn_t));
-    memcpy(&async_txn->connection, connection, sizeof(*connection));
-
-    return async_txn;
-}
-
-fidl_txn_t* fidl_async_txn_borrow(fidl_async_txn_t* async_txn) {
-    return &async_txn->connection.txn;
-}
-
-zx_status_t fidl_async_txn_complete(fidl_async_txn_t* async_txn, bool rebind) {
-    zx_status_t status = ZX_OK;
-    if (rebind) {
-        status = async_begin_wait(async_txn->connection.binding->dispatcher,
-                                  &async_txn->connection.binding->wait);
-        if (status == ZX_OK) {
-            return ZX_OK;
-        }
-    }
-
-    fidl_binding_destroy(async_txn->connection.binding);
-    free(async_txn);
-    return status;
-}
diff --git a/pkg/fidl-async/include/lib/fidl-async/bind.h b/pkg/fidl-async/include/lib/fidl-async/bind.h
deleted file mode 100644
index 5fc6f8b..0000000
--- a/pkg/fidl-async/include/lib/fidl-async/bind.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_BIND_H_
-#define LIB_FIDL_BIND_H_
-
-#include <lib/async/dispatcher.h>
-#include <zircon/fidl.h>
-
-__BEGIN_CDECLS
-
-// A generic FIDL dispatch function.
-//
-// For FIDL interfaces with [Layout="Simple"], the C backend generates a
-// dispatch function that decodes the |msg| and calls through an |ops| table.
-//
-// This function signature matches the structure of these generated functions
-// but with the type of the |ops| table erased.
-//
-// Example:
-//
-//  fidl_bind(dispacher, channel, (fidl_dispatch_t*)spaceship_SpaceShip_dispatch, ctx, &kOps);
-//
-typedef zx_status_t(fidl_dispatch_t)(void* ctx, fidl_txn_t* txn,
-                                     fidl_msg_t* msg, const void* ops);
-
-// Binds a |dispatch| function to channel| using |dispatcher|.
-//
-// This function adds an |async_wait_t| to the given |dispatcher| that waits
-// asynchronously for new messages to arrive on |channel|. When a message
-// arrives, the |dispatch| function is called on one of the threads associated
-// with the |dispatcher| with the |fidl_msg_t| as well as the given |ctx| and
-// |ops|.
-//
-// Typically, the |dispatch| function is generated by the C backend for FIDL
-// interfaces with with [Layout="Simple"] (see |fidl_dispatch_t|). These
-// dispatch functions decode the |fidl_msg_t| and call through the |ops| table
-// implementations of the interface's methods, passing along the |ctx| and a
-// |fidl_txn_t| (if the method has a reply message).
-//
-// The |fidl_txn_t| passed to |dispatch| is valid only until |dispatch| returns.
-// If the method has a reply message, the |reply| function on the |fidl_txn_t|
-// object must be called synchronously within the |dispatch| call.
-//
-// If a client wishes to reply to the message asynchronously, |fidl_async_txn_create|
-// must be invoked on |fidl_txn_t|, and ZX_ERR_ASYNC must be returned.
-//
-// Returns whether |fidl_bind| was able to begin waiting on the given |channel|.
-// Upon any error, |channel| is closed and the binding is terminated. Shutting down
-// the |dispatcher| also results in |channel| being closed.
-//
-// It is safe to shutdown the dispatcher at any time.
-//
-// It is unsafe to destroy the dispatcher from within a dispatch function.
-// It is unsafe to destroy the dispatcher while any |fidl_async_txn_t| objects
-// are alive.
-zx_status_t fidl_bind(async_dispatcher_t* dispatcher, zx_handle_t channel,
-                      fidl_dispatch_t* dispatch, void* ctx, const void* ops);
-
-// An asynchronous FIDL txn.
-//
-// This is an opaque wrapper around |fidl_txn_t| which can extend the lifetime
-// of the object beyond the dispatched function.
-typedef struct fidl_async_txn fidl_async_txn_t;
-
-// Takes ownership of |txn| and allows usage of the txn beyond the currently
-// dispatched function.
-//
-// If this function is invoked within a dispatched function, that function
-// must return ZX_ERR_ASYNC.
-//
-// The result must be destroyed with a call to |fidl_async_txn_complete|.
-fidl_async_txn_t* fidl_async_txn_create(fidl_txn_t* txn);
-
-// Acquire a reference to the |fidl_txn_t| backing this txn object.
-//
-// It is unsafe to use this |fidl_txn_t| after |async_txn| is completed.
-fidl_txn_t* fidl_async_txn_borrow(fidl_async_txn_t* async_txn);
-
-// Destroys an asynchronous transaction created with |fidl_async_txn_create|.
-//
-// If requested, rebinds the underlying txn against the binding.
-// Returns an error if |rebind| is true and the transaction could not be
-// re-bound.
-//
-// In all cases, the |async_txn| object is consumed.
-zx_status_t fidl_async_txn_complete(fidl_async_txn_t* async_txn, bool rebind);
-
-__END_CDECLS
-
-#endif // LIB_FIDL_BIND_H_
diff --git a/pkg/fidl-async/meta.json b/pkg/fidl-async/meta.json
deleted file mode 100644
index f5dfdbb..0000000
--- a/pkg/fidl-async/meta.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "banjo_deps": [], 
-  "deps": [
-    "async", 
-    "fidl"
-  ], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/fidl-async/bind.c", 
-    "pkg/fidl-async/include/lib/fidl-async/bind.h"
-  ], 
-  "headers": [
-    "pkg/fidl-async/include/lib/fidl-async/bind.h"
-  ], 
-  "include_dir": "pkg/fidl-async/include", 
-  "name": "fidl-async", 
-  "root": "pkg/fidl-async", 
-  "sources": [
-    "pkg/fidl-async/bind.c"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/fidl/buffer_walker.h b/pkg/fidl/buffer_walker.h
deleted file mode 100644
index 92cb2e1..0000000
--- a/pkg/fidl/buffer_walker.h
+++ /dev/null
@@ -1,809 +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.
-
-#pragma once
-
-namespace fidl {
-namespace internal {
-
-// Some assumptions about data type layout.
-static_assert(offsetof(fidl_string_t, size) == 0u, "");
-static_assert(offsetof(fidl_string_t, data) == 8u, "");
-
-static_assert(offsetof(fidl_vector_t, count) == 0u, "");
-static_assert(offsetof(fidl_vector_t, data) == 8u, "");
-
-static_assert(ZX_HANDLE_INVALID == FIDL_HANDLE_ABSENT, "");
-
-template <bool kConst, class U>
-struct SetPtrConst;
-
-template <class U>
-struct SetPtrConst<false, U> {
-    typedef U* type;
-};
-
-template <class U>
-struct SetPtrConst<true, U> {
-    typedef const U* type;
-};
-
-// Walks over a FIDL buffer and validates/encodes/decodes it per-Derived.
-//
-// kMutating controls whether this deals with mutable bytes or immutable bytes
-// (validation wants immutable, encode/decode wants mutable)
-//
-// kContinueAfterErrors controls whether parsing is continued upon failure (encode needs this to
-// see all available handles).
-//
-// Derived should offer the following methods:
-//
-//   const? uint8_t* bytes() - returns the start of the buffer of bytes
-//   uint32_t num_bytes() - returns the number of bytes in said buffer
-//   uint32_t num_handles() - returns the number of handles that are claimable
-//   bool ValidateOutOfLineStorageClaim(const void* a, const void* b)
-//      - returns true if a legally points to b
-//   void UnclaimedHandle(zx_handle_t*) - notes that a handle was skipped
-//   void ClaimedHandle(zx_handle_t*, uint32_t idx) - notes that a handle was claimed
-//   PointerState GetPointerState(const void* ptr) - returns whether a pointer is present or not
-//   HandleState GetHandleState(zx_handle_t) - returns if a handle is present or not
-//   void UpdatePointer(T**p, T*v) - mutates a pointer representation for a present pointer
-//   void SetError(const char* error_msg) - flags that an error occurred
-template <class Derived, bool kMutating, bool kContinueAfterErrors>
-class BufferWalker {
-public:
-    explicit BufferWalker(const fidl_type* type)
-        : type_(type) {}
-
-    void Walk() {
-        // The first decode is special. It must be a struct or a table.
-        // We need to know the size of the first element to compute the start of
-        // the out-of-line allocations.
-
-        if (type_ == nullptr) {
-            SetError("Cannot decode a null fidl type");
-            return;
-        }
-
-        if (bytes() == nullptr) {
-            SetError("Cannot decode null bytes");
-            return;
-        }
-
-        switch (type_->type_tag) {
-        case fidl::kFidlTypeStruct:
-            if (num_bytes() < type_->coded_struct.size) {
-                SetError("Message size is smaller than expected");
-                return;
-            }
-            out_of_line_offset_ = static_cast<uint32_t>(fidl::FidlAlign(type_->coded_struct.size));
-            break;
-        case fidl::kFidlTypeTable:
-            if (num_bytes() < sizeof(fidl_vector_t)) {
-                SetError("Message size is smaller than expected");
-                return;
-            }
-            out_of_line_offset_ = static_cast<uint32_t>(fidl::FidlAlign(sizeof(fidl_vector_t)));
-            break;
-        default:
-            SetError("Message must be a struct or a table");
-            return;
-        }
-
-        Push(Frame::DoneSentinel());
-        Push(Frame(type_, 0u));
-
-// Macro to insert the relevant goop required to support two control flows here:
-// one where we keep reading after error, and another where we return immediately.
-// No runtime overhead thanks to if constexpr magic.
-#define FIDL_POP_AND_CONTINUE_OR_RETURN \
-    if (kContinueAfterErrors) {         \
-        Pop();                          \
-        continue;                       \
-    } else {                            \
-        return;                         \
-    }
-
-        for (;;) {
-            Frame* frame = Peek();
-
-            switch (frame->state) {
-            case Frame::kStateStruct: {
-                const uint32_t field_index = frame->NextStructField();
-                if (field_index == frame->struct_state.field_count) {
-                    Pop();
-                    continue;
-                }
-                const fidl::FidlField& field = frame->struct_state.fields[field_index];
-                const fidl_type_t* field_type = field.type;
-                const uint32_t field_offset = frame->offset + field.offset;
-                if (!Push(Frame(field_type, field_offset))) {
-                    SetError("recursion depth exceeded processing struct");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                continue;
-            }
-            case Frame::kStateStructPointer: {
-                switch (GetPointerState(TypedAt<void>(frame->offset))) {
-                case PointerState::PRESENT:
-                    break;
-                case PointerState::ABSENT:
-                    Pop();
-                    continue;
-                default:
-                    SetError("Tried to decode a bad struct pointer");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                auto struct_ptr_ptr = TypedAt<void*>(frame->offset);
-                if (!ClaimOutOfLineStorage(frame->struct_pointer_state.struct_type->size,
-                                           *struct_ptr_ptr, &frame->offset)) {
-                    SetError("message wanted to store too large of a nullable struct");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                UpdatePointer(struct_ptr_ptr, TypedAt<void>(frame->offset));
-                const fidl::FidlCodedStruct* coded_struct = frame->struct_pointer_state.struct_type;
-                *frame = Frame(coded_struct, frame->offset);
-                continue;
-            }
-            case Frame::kStateTable: {
-                if (frame->field == 0u) {
-                    auto envelope_vector_ptr = TypedAt<fidl_vector_t>(frame->offset);
-                    switch (GetPointerState(&envelope_vector_ptr->data)) {
-                    case PointerState::PRESENT:
-                        break;
-                    case PointerState::ABSENT:
-                        SetError("Table data cannot be absent");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    default:
-                        SetError("message tried to decode a non-present vector");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    uint32_t size;
-                    if (mul_overflow(envelope_vector_ptr->count, 2 * sizeof(uint64_t), &size)) {
-                        SetError("integer overflow calculating table size");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    if (!ClaimOutOfLineStorage(size, envelope_vector_ptr->data, &frame->offset)) {
-                        SetError("message wanted to store too large of a table");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    UpdatePointer(&envelope_vector_ptr->data, TypedAt<void>(frame->offset));
-                    frame->field = 1;
-                    frame->table_state.known_index = 0;
-                    frame->table_state.present_count = static_cast<uint32_t>(envelope_vector_ptr->count);
-                    frame->table_state.end_offset = out_of_line_offset_;
-                    frame->table_state.end_handle = handle_idx_;
-                    continue;
-                }
-                if (frame->table_state.end_offset != out_of_line_offset_) {
-                    SetError("Table field was mis-sized");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (frame->table_state.end_handle != handle_idx_) {
-                    SetError("Table handles were mis-sized");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (frame->field > frame->table_state.present_count) {
-                    Pop();
-                    continue;
-                }
-                const fidl::FidlTableField* known_field = nullptr;
-                if (frame->table_state.known_index < frame->table_state.field_count) {
-                    const fidl::FidlTableField* field =
-                        &frame->table_state.fields[frame->table_state.known_index];
-                    if (field->ordinal == frame->field) {
-                        known_field = field;
-                        frame->table_state.known_index++;
-                    }
-                }
-                const uint32_t tag_offset = static_cast<uint32_t>(
-                    frame->offset + (frame->field - 1) * 2 * sizeof(uint64_t));
-                const uint32_t data_offset = static_cast<uint32_t>(
-                    tag_offset + sizeof(uint64_t));
-                const uint64_t packed_sizes = *TypedAt<uint64_t>(tag_offset);
-                frame->field++;
-                switch (GetPointerState(TypedAt<void>(data_offset))) {
-                case PointerState::PRESENT:
-                    if (packed_sizes != 0)
-                        break; // expected
-
-                    SetError("Table envelope has present data pointer, but no data, and no handles");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                case PointerState::ABSENT:
-                    if (packed_sizes == 0)
-                        continue; // skip
-
-                    SetError("Table envelope has absent data pointer, yet has data and/or handles");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                default:
-                    SetError("Table envelope has bad data pointer");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                uint32_t offset;
-                uint32_t handles;
-                const uint32_t table_bytes = static_cast<uint32_t>(packed_sizes & 0xffffffffu);
-                const uint32_t table_handles = static_cast<uint32_t>(packed_sizes >> 32);
-                if (add_overflow(out_of_line_offset_, table_bytes, &offset) || offset > num_bytes()) {
-                    SetError("integer overflow decoding table field");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (add_overflow(handle_idx_, table_handles, &handles) ||
-                    handles > num_handles()) {
-                    SetError("integer overflow decoding table handles");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                frame->table_state.end_offset = offset;
-                frame->table_state.end_handle = handles;
-                if (known_field != nullptr) {
-                    const fidl_type_t* field_type = known_field->type;
-                    uint32_t field_offset;
-                    if (!ClaimOutOfLineStorage(TypeSize(field_type), TypedAt<void*>(data_offset), &field_offset)) {
-                        SetError("table wanted too many bytes in field");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    UpdatePointer(TypedAt<void*>(data_offset), TypedAt<void>(field_offset));
-                    if (!Push(Frame(field_type, field_offset))) {
-                        SetError("recursion depth exceeded decoding table");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                } else {
-                    // Table data will not be processed: discard it.
-                    uint32_t field_offset;
-                    if (!ClaimOutOfLineStorage(table_bytes, TypedAt<void*>(data_offset), &field_offset)) {
-                        SetError("table wanted too many bytes in field");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    UpdatePointer(TypedAt<void*>(data_offset), TypedAt<void>(field_offset));
-                    for (uint32_t i = 0; i < table_handles; i++) {
-                        if (!ClaimHandle(nullptr)) {
-                            SetError("expected handle not present");
-                            FIDL_POP_AND_CONTINUE_OR_RETURN;
-                        }
-                    }
-                }
-                continue;
-            }
-            case Frame::kStateTablePointer: {
-                switch (GetPointerState(TypedAt<void>(frame->offset))) {
-                case PointerState::PRESENT:
-                    break;
-                case PointerState::ABSENT:
-                    Pop();
-                    continue;
-                default:
-                    SetError("Tried to decode a bad table pointer");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                auto table_ptr_ptr = TypedAt<void*>(frame->offset);
-                if (!ClaimOutOfLineStorage(sizeof(fidl_vector_t), *table_ptr_ptr, &frame->offset)) {
-                    SetError("message wanted to store too large of a nullable table");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                UpdatePointer(table_ptr_ptr, TypedAt<void>(frame->offset));
-                const fidl::FidlCodedTable* coded_table = frame->table_pointer_state.table_type;
-                *frame = Frame(coded_table, frame->offset);
-                continue;
-            }
-            case Frame::kStateUnion: {
-                fidl_union_tag_t union_tag = *TypedAt<fidl_union_tag_t>(frame->offset);
-                if (union_tag >= frame->union_state.type_count) {
-                    SetError("Tried to decode a bad union discriminant");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                const fidl_type_t* member = frame->union_state.types[union_tag];
-                if (!member) {
-                    Pop();
-                    continue;
-                }
-                frame->offset += frame->union_state.data_offset;
-                *frame = Frame(member, frame->offset);
-                continue;
-            }
-            case Frame::kStateUnionPointer: {
-                auto union_ptr_ptr = TypedAt<fidl_union_tag_t*>(frame->offset);
-                switch (GetPointerState(TypedAt<void>(frame->offset))) {
-                case PointerState::PRESENT:
-                    break;
-                case PointerState::ABSENT:
-                    Pop();
-                    continue;
-                default:
-                    SetError("Tried to decode a bad union pointer");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (!ClaimOutOfLineStorage(frame->union_pointer_state.union_type->size, *union_ptr_ptr,
-                                           &frame->offset)) {
-                    SetError("message wanted to store too large of a nullable union");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                UpdatePointer(union_ptr_ptr, TypedAt<fidl_union_tag_t>(frame->offset));
-                const fidl::FidlCodedUnion* coded_union = frame->union_pointer_state.union_type;
-                *frame = Frame(coded_union, frame->offset);
-                continue;
-            }
-            case Frame::kStateArray: {
-                const uint32_t element_offset = frame->NextArrayOffset();
-                if (element_offset == frame->array_state.array_size) {
-                    Pop();
-                    continue;
-                }
-                const fidl_type_t* element_type = frame->array_state.element;
-                const uint32_t offset = frame->offset + element_offset;
-                if (!Push(Frame(element_type, offset))) {
-                    SetError("recursion depth exceeded decoding array");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                continue;
-            }
-            case Frame::kStateString: {
-                auto string_ptr = TypedAt<fidl_string_t>(frame->offset);
-                // The string storage may be Absent for nullable strings and must
-                // otherwise be Present. No other values are allowed.
-                switch (GetPointerState(&string_ptr->data)) {
-                case PointerState::PRESENT:
-                    break;
-                case PointerState::ABSENT:
-                    if (!frame->string_state.nullable) {
-                        SetError("message tried to decode an absent non-nullable string");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    if (string_ptr->size != 0u) {
-                        SetError("message tried to decode an absent string of non-zero length");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    Pop();
-                    continue;
-                default:
-                    SetError(
-                        "message tried to decode a string that is neither present nor absent");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                uint64_t bound = frame->string_state.max_size;
-                uint64_t size = string_ptr->size;
-                if (size > bound) {
-                    SetError("message tried to decode too large of a bounded string");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                uint32_t string_data_offset = 0u;
-                if (!ClaimOutOfLineStorage(static_cast<uint32_t>(size), string_ptr->data, &string_data_offset)) {
-                    SetError("decoding a string overflowed buffer");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                UpdatePointer(&string_ptr->data, TypedAt<char>(string_data_offset));
-                Pop();
-                continue;
-            }
-            case Frame::kStateHandle: {
-                auto handle_ptr = TypedAt<zx_handle_t>(frame->offset);
-                // The handle storage may be Absent for nullable handles and must
-                // otherwise be Present. No other values are allowed.
-                switch (GetHandleState(*handle_ptr)) {
-                case HandleState::ABSENT:
-                    if (frame->handle_state.nullable) {
-                        Pop();
-                        continue;
-                    }
-                    SetError("message tried to decode a non-present handle");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                case HandleState::PRESENT:
-                    if (!ClaimHandle(handle_ptr)) {
-                        SetError("message decoded too many handles");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    Pop();
-                    continue;
-                default:
-                    // The value at the handle was garbage.
-                    SetError("message tried to decode a garbage handle");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-            }
-            case Frame::kStateVector: {
-                auto vector_ptr = TypedAt<fidl_vector_t>(frame->offset);
-                // The vector storage may be Absent for nullable vectors and must
-                // otherwise be Present. No other values are allowed.
-                switch (GetPointerState(&vector_ptr->data)) {
-                case PointerState::PRESENT:
-                    break;
-                case PointerState::ABSENT:
-                    if (!frame->vector_state.nullable) {
-                        SetError("message tried to decode an absent non-nullable vector");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    if (vector_ptr->count != 0u) {
-                        SetError("message tried to decode an absent vector of non-zero elements");
-                        FIDL_POP_AND_CONTINUE_OR_RETURN;
-                    }
-                    Pop();
-                    continue;
-                default:
-                    SetError("message tried to decode a non-present vector");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (vector_ptr->count > frame->vector_state.max_count) {
-                    SetError("message tried to decode too large of a bounded vector");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                uint32_t size;
-                if (mul_overflow(vector_ptr->count, frame->vector_state.element_size, &size)) {
-                    SetError("integer overflow calculating vector size");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                if (!ClaimOutOfLineStorage(size, vector_ptr->data, &frame->offset)) {
-                    SetError("message wanted to store too large of a vector");
-                    FIDL_POP_AND_CONTINUE_OR_RETURN;
-                }
-                UpdatePointer(&vector_ptr->data, TypedAt<void>(frame->offset));
-                if (frame->vector_state.element) {
-                    // Continue by decoding the vector elements as an array.
-                    *frame = Frame(frame->vector_state.element, size,
-                                   frame->vector_state.element_size, frame->offset);
-                } else {
-                    // If there is no element type pointer, there is
-                    // nothing to decode in the vector secondary
-                    // payload. So just continue.
-                    Pop();
-                }
-                continue;
-            }
-            case Frame::kStateDone: {
-                if (out_of_line_offset_ != num_bytes()) {
-                    SetError("message did not decode all provided bytes");
-                }
-                return;
-            }
-            }
-        }
-
-#undef FIDL_POP_AND_CONTINUE_OR_RETURN
-    }
-
-protected:
-    void SetError(const char* error_msg) {
-        derived()->SetError(error_msg);
-    }
-
-    template <typename T>
-    typename SetPtrConst<!kMutating, T>::type TypedAt(uint32_t offset) const {
-        return reinterpret_cast<typename SetPtrConst<!kMutating, T>::type>(bytes() + offset);
-    }
-
-    enum class PointerState : uintptr_t {
-        PRESENT = FIDL_ALLOC_PRESENT,
-        ABSENT = FIDL_ALLOC_ABSENT,
-        INVALID = 1 // *OR* *ANY* non PRESENT/ABSENT value.
-    };
-
-    enum class HandleState : zx_handle_t {
-        PRESENT = FIDL_HANDLE_PRESENT,
-        ABSENT = FIDL_HANDLE_ABSENT,
-        INVALID = 1 // *OR* *ANY* non PRESENT/ABSENT value.
-    };
-
-    uint32_t handle_idx() const { return handle_idx_; }
-
-private:
-    Derived* derived() {
-        return static_cast<Derived*>(this);
-    }
-
-    const Derived* derived() const {
-        return static_cast<const Derived*>(this);
-    }
-
-    // Returns a pointer to the bytes in the message.
-    auto bytes() const {
-        return derived()->bytes();
-    }
-
-    // Returns the number of bytes in the message.
-    auto num_bytes() const {
-        return derived()->num_bytes();
-    }
-
-    // Returns the number of handles in the message (encoding: the max number of handles in the message).
-    auto num_handles() const {
-        return derived()->num_handles();
-    }
-
-    // Returns PRESENT/ABSENT/INVALID for a given pointer value.
-    PointerState GetPointerState(const void* ptr) const {
-        return derived()->GetPointerState(ptr);
-    }
-
-    // Returns PRESENT/ABSENT/INVALID for a given handle value.
-    HandleState GetHandleState(zx_handle_t p) const {
-        return derived()->GetHandleState(p);
-    }
-
-    // If required: mutate a pointer to the dual representation.
-    template <class T2, class T1>
-    void UpdatePointer(T2 p, T1 v) {
-        derived()->UpdatePointer(p, v);
-    }
-
-    // Returns true when a handle was claimed, and false when the
-    // handles are exhausted.
-    template <class ZxHandleTPointer>
-    bool ClaimHandle(ZxHandleTPointer out_handle) {
-        if (handle_idx_ == num_handles()) {
-            derived()->UnclaimedHandle(out_handle);
-            return false;
-        }
-        derived()->ClaimedHandle(out_handle, handle_idx_);
-        ++handle_idx_;
-        return true;
-    }
-
-    // Returns true when the buffer space is claimed, and false when
-    // the requested claim is too large for bytes_.
-    bool ClaimOutOfLineStorage(uint32_t size, const void* storage, uint32_t* out_offset) {
-        if (!derived()->ValidateOutOfLineStorageClaim(storage, &bytes()[out_of_line_offset_])) {
-            return false;
-        }
-
-        // We have to manually maintain alignment here. For example, a pointer
-        // to a struct that is 4 bytes still needs to advance the next
-        // out-of-line offset by 8 to maintain the aligned-to-FIDL_ALIGNMENT
-        // property.
-        static constexpr uint32_t mask = FIDL_ALIGNMENT - 1;
-        uint32_t offset = out_of_line_offset_;
-        if (add_overflow(offset, size, &offset) ||
-            add_overflow(offset, mask, &offset)) {
-            return false;
-        }
-        offset &= ~mask;
-
-        if (offset > num_bytes()) {
-            return false;
-        }
-        *out_offset = out_of_line_offset_;
-        out_of_line_offset_ = offset;
-        return true;
-    }
-
-    uint32_t TypeSize(const fidl_type_t* type) {
-        switch (type->type_tag) {
-        case fidl::kFidlTypeStructPointer:
-        case fidl::kFidlTypeTablePointer:
-        case fidl::kFidlTypeUnionPointer:
-            return sizeof(uint64_t);
-        case fidl::kFidlTypeHandle:
-            return sizeof(zx_handle_t);
-        case fidl::kFidlTypeStruct:
-            return type->coded_struct.size;
-        case fidl::kFidlTypeTable:
-            return sizeof(fidl_vector_t);
-        case fidl::kFidlTypeUnion:
-            return type->coded_union.size;
-        case fidl::kFidlTypeString:
-            return sizeof(fidl_string_t);
-        case fidl::kFidlTypeArray:
-            return type->coded_array.array_size;
-        case fidl::kFidlTypeVector:
-            return sizeof(fidl_vector_t);
-        }
-        abort();
-        return 0;
-    }
-
-    // Functions that manipulate the decoding stack frames.
-    struct Frame {
-        Frame(const fidl_type_t* fidl_type, uint32_t offset)
-            : offset(offset) {
-            switch (fidl_type->type_tag) {
-            case fidl::kFidlTypeStruct:
-                state = kStateStruct;
-                struct_state.fields = fidl_type->coded_struct.fields;
-                struct_state.field_count = fidl_type->coded_struct.field_count;
-                break;
-            case fidl::kFidlTypeStructPointer:
-                state = kStateStructPointer;
-                struct_pointer_state.struct_type = fidl_type->coded_struct_pointer.struct_type;
-                break;
-            case fidl::kFidlTypeTable:
-                state = kStateTable;
-                table_state.fields = fidl_type->coded_table.fields;
-                table_state.field_count = fidl_type->coded_table.field_count;
-                table_state.present_count = 0;
-                break;
-            case fidl::kFidlTypeTablePointer:
-                state = kStateTablePointer;
-                table_pointer_state.table_type = fidl_type->coded_table_pointer.table_type;
-                break;
-            case fidl::kFidlTypeUnion:
-                state = kStateUnion;
-                union_state.types = fidl_type->coded_union.types;
-                union_state.type_count = fidl_type->coded_union.type_count;
-                union_state.data_offset = fidl_type->coded_union.data_offset;
-                break;
-            case fidl::kFidlTypeUnionPointer:
-                state = kStateUnionPointer;
-                union_pointer_state.union_type = fidl_type->coded_union_pointer.union_type;
-                break;
-            case fidl::kFidlTypeArray:
-                state = kStateArray;
-                array_state.element = fidl_type->coded_array.element;
-                array_state.array_size = fidl_type->coded_array.array_size;
-                array_state.element_size = fidl_type->coded_array.element_size;
-                break;
-            case fidl::kFidlTypeString:
-                state = kStateString;
-                string_state.max_size = fidl_type->coded_string.max_size;
-                string_state.nullable = fidl_type->coded_string.nullable;
-                break;
-            case fidl::kFidlTypeHandle:
-                state = kStateHandle;
-                handle_state.nullable = fidl_type->coded_handle.nullable;
-                break;
-            case fidl::kFidlTypeVector:
-                state = kStateVector;
-                vector_state.element = fidl_type->coded_vector.element;
-                vector_state.max_count = fidl_type->coded_vector.max_count;
-                vector_state.element_size = fidl_type->coded_vector.element_size;
-                vector_state.nullable = fidl_type->coded_vector.nullable;
-                break;
-            }
-        }
-
-        Frame(const fidl::FidlCodedStruct* coded_struct, uint32_t offset)
-            : offset(offset) {
-            state = kStateStruct;
-            struct_state.fields = coded_struct->fields;
-            struct_state.field_count = coded_struct->field_count;
-        }
-
-        Frame(const fidl::FidlCodedTable* coded_table, uint32_t offset)
-            : offset(offset) {
-            state = kStateStruct;
-            table_state.fields = coded_table->fields;
-            table_state.field_count = coded_table->field_count;
-        }
-
-        Frame(const fidl::FidlCodedUnion* coded_union, uint32_t offset)
-            : offset(offset) {
-            state = kStateUnion;
-            union_state.types = coded_union->types;
-            union_state.type_count = coded_union->type_count;
-            union_state.data_offset = coded_union->data_offset;
-        }
-
-        Frame(const fidl_type_t* element, uint32_t array_size, uint32_t element_size,
-              uint32_t offset)
-            : offset(offset) {
-            state = kStateArray;
-            array_state.element = element;
-            array_state.array_size = array_size;
-            array_state.element_size = element_size;
-        }
-
-        // The default constructor does nothing when initializing the stack of frames.
-        Frame() {}
-
-        static Frame DoneSentinel() {
-            Frame frame;
-            frame.state = kStateDone;
-            return frame;
-        }
-
-        uint32_t NextStructField() {
-            ZX_DEBUG_ASSERT(state == kStateStruct);
-
-            uint32_t current = field;
-            field += 1;
-            return current;
-        }
-
-        uint32_t NextArrayOffset() {
-            ZX_DEBUG_ASSERT(state == kStateArray);
-
-            uint32_t current = field;
-            field += array_state.element_size;
-            return current;
-        }
-
-        enum : int {
-            kStateStruct,
-            kStateStructPointer,
-            kStateTable,
-            kStateTablePointer,
-            kStateUnion,
-            kStateUnionPointer,
-            kStateArray,
-            kStateString,
-            kStateHandle,
-            kStateVector,
-
-            kStateDone,
-        } state;
-        // A byte offset into bytes_;
-        uint32_t offset;
-
-        // This is a subset of the information recorded in the
-        // fidl_type structures needed for decoding state. For
-        // example, struct sizes do not need to be present here.
-        union {
-            struct {
-                const fidl::FidlField* fields;
-                uint32_t field_count;
-            } struct_state;
-            struct {
-                const fidl::FidlCodedStruct* struct_type;
-            } struct_pointer_state;
-            struct {
-                const fidl::FidlTableField* fields;
-                uint32_t known_index;
-                uint32_t field_count;
-                uint32_t present_count;
-                uint32_t end_offset;
-                uint32_t end_handle;
-            } table_state;
-            struct {
-                const fidl::FidlCodedTable* table_type;
-            } table_pointer_state;
-            struct {
-                const fidl_type_t* const* types;
-                uint32_t type_count;
-                uint32_t data_offset;
-            } union_state;
-            struct {
-                const fidl::FidlCodedUnion* union_type;
-            } union_pointer_state;
-            struct {
-                const fidl_type_t* element;
-                uint32_t array_size;
-                uint32_t element_size;
-            } array_state;
-            struct {
-                uint32_t max_size;
-                bool nullable;
-            } string_state;
-            struct {
-                bool nullable;
-            } handle_state;
-            struct {
-                const fidl_type* element;
-                uint32_t max_count;
-                uint32_t element_size;
-                bool nullable;
-            } vector_state;
-        };
-
-        uint32_t field = 0u;
-    };
-
-    // Returns true on success and false on recursion overflow.
-    bool Push(Frame frame) {
-        if (depth_ == FIDL_RECURSION_DEPTH) {
-            return false;
-        }
-        decoding_frames_[depth_] = frame;
-        ++depth_;
-        return true;
-    }
-
-    void Pop() {
-        ZX_DEBUG_ASSERT(depth_ != 0u);
-        --depth_;
-    }
-
-    Frame* Peek() {
-        ZX_DEBUG_ASSERT(depth_ != 0u);
-        return &decoding_frames_[depth_ - 1];
-    }
-
-    // Message state passed in to the constructor.
-    const fidl_type_t* const type_;
-
-    // Internal state.
-    uint32_t handle_idx_ = 0u;
-    uint32_t out_of_line_offset_ = 0u;
-
-    // Decoding stack state.
-    uint32_t depth_ = 0u;
-    Frame decoding_frames_[FIDL_RECURSION_DEPTH];
-};
-
-} // namespace internal
-} // namespace fidl
diff --git a/pkg/fidl/builder.cpp b/pkg/fidl/builder.cpp
deleted file mode 100644
index 476b7ee..0000000
--- a/pkg/fidl/builder.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-#include <lib/fidl/cpp/builder.h>
-
-#include <string.h>
-
-#include <lib/fidl/internal.h>
-
-namespace fidl {
-
-Builder::Builder()
-    : capacity_(0u), at_(0u), buffer_(nullptr) {}
-
-Builder::Builder(void* buffer, uint32_t capacity)
-    : capacity_(capacity), at_(0u), buffer_(static_cast<uint8_t*>(buffer)) {
-}
-
-Builder::~Builder() = default;
-
-Builder::Builder(Builder&& other)
-    : capacity_(other.capacity_),
-      at_(other.at_),
-      buffer_(other.buffer_) {
-    other.Reset(nullptr, 0);
-}
-
-Builder& Builder::operator=(Builder&& other) {
-    if (this != &other) {
-        capacity_ = other.capacity_;
-        at_ = other.at_;
-        buffer_ = other.buffer_;
-        other.Reset(nullptr, 0);
-    }
-    return *this;
-}
-
-void* Builder::Allocate(uint32_t size) {
-    uint64_t limit = FidlAlign(at_ + size);
-    if (limit > capacity_)
-        return nullptr;
-    uint8_t* result = &buffer_[at_];
-    memset(buffer_ + at_, 0, limit - at_);
-    at_ = static_cast<uint32_t>(limit);
-    return result;
-}
-
-BytePart Builder::Finalize() {
-    BytePart bytes(buffer_, capacity_, at_);
-    capacity_ = 0u;
-    at_ = 0u;
-    return bytes;
-}
-
-void Builder::Reset(void* buffer, uint32_t capacity) {
-    buffer_ = static_cast<uint8_t*>(buffer);
-    capacity_ = capacity;
-    at_ = 0u;
-}
-
-} // namespace fidl
diff --git a/pkg/fidl/decoding.cpp b/pkg/fidl/decoding.cpp
deleted file mode 100644
index 3066778..0000000
--- a/pkg/fidl/decoding.cpp
+++ /dev/null
@@ -1,115 +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.
-
-#include <lib/fidl/coding.h>
-
-#include <stdalign.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <lib/fidl/internal.h>
-#include <zircon/assert.h>
-#include <zircon/compiler.h>
-
-#ifdef __Fuchsia__
-#include <zircon/syscalls.h>
-#endif
-
-#include "buffer_walker.h"
-
-// TODO(kulakowski) Design zx_status_t error values.
-
-namespace {
-
-class FidlDecoder final : public fidl::internal::BufferWalker<FidlDecoder, true, false> {
-    typedef fidl::internal::BufferWalker<FidlDecoder, true, false> Super;
-
-public:
-    FidlDecoder(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                const zx_handle_t* handles, uint32_t num_handles, const char** out_error_msg)
-        : Super(type), bytes_(static_cast<uint8_t*>(bytes)), num_bytes_(num_bytes),
-          handles_(handles), num_handles_(num_handles), out_error_msg_(out_error_msg) {}
-
-    void Walk() {
-        if (handles_ == nullptr && num_handles_ != 0u) {
-            SetError("Cannot provide non-zero handle count and null handle pointer");
-            return;
-        }
-        Super::Walk();
-        if (status_ == ZX_OK && handle_idx() != num_handles()) {
-            SetError("message did not contain the specified number of handles");
-        }
-    }
-
-    uint8_t* bytes() const { return bytes_; }
-    uint32_t num_bytes() const { return num_bytes_; }
-    uint32_t num_handles() const { return num_handles_; }
-
-    bool ValidateOutOfLineStorageClaim(const void* a, const void* b) {
-        return true;
-    }
-
-    void UnclaimedHandle(zx_handle_t* out_handle) {}
-    void ClaimedHandle(zx_handle_t* out_handle, uint32_t idx) {
-        if (out_handle != nullptr) {
-            *out_handle = handles_[idx];
-#ifdef __Fuchsia__
-        } else {
-            // Return value intentionally ignored: this is best-effort cleanup.
-            zx_handle_close(handles_[idx]);
-#endif
-        }
-    }
-
-    PointerState GetPointerState(const void* ptr) const {
-        return static_cast<PointerState>(*static_cast<const uintptr_t*>(ptr));
-    }
-    HandleState GetHandleState(zx_handle_t p) const {
-        return static_cast<HandleState>(p);
-    }
-
-    template <class T>
-    void UpdatePointer(T* p, T v) {
-        *p = v;
-    }
-
-    void SetError(const char* error_msg) {
-        status_ = ZX_ERR_INVALID_ARGS;
-        if (out_error_msg_ != nullptr) {
-            *out_error_msg_ = error_msg;
-        }
-#ifdef __Fuchsia__
-        if (handles_) {
-            // Return value intentionally ignored: this is best-effort cleanup.
-            zx_handle_close_many(handles_, num_handles());
-        }
-#endif
-    }
-
-    zx_status_t status() const { return status_; }
-
-private:
-    uint8_t* const bytes_;
-    const uint32_t num_bytes_;
-    const zx_handle_t* const handles_;
-    const uint32_t num_handles_;
-    const char** const out_error_msg_;
-    zx_status_t status_ = ZX_OK;
-};
-
-} // namespace
-
-zx_status_t fidl_decode(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                        const zx_handle_t* handles, uint32_t num_handles,
-                        const char** out_error_msg) {
-    FidlDecoder decoder(type, bytes, num_bytes, handles, num_handles, out_error_msg);
-    decoder.Walk();
-    return decoder.status();
-}
-
-zx_status_t fidl_decode_msg(const fidl_type_t* type, fidl_msg_t* msg,
-                            const char** out_error_msg) {
-    return fidl_decode(type, msg->bytes, msg->num_bytes, msg->handles,
-                       msg->num_handles, out_error_msg);
-}
diff --git a/pkg/fidl/encoding.cpp b/pkg/fidl/encoding.cpp
deleted file mode 100644
index f4d4f49..0000000
--- a/pkg/fidl/encoding.cpp
+++ /dev/null
@@ -1,134 +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.
-
-#include <lib/fidl/coding.h>
-
-#include <stdalign.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <lib/fidl/internal.h>
-#include <zircon/assert.h>
-#include <zircon/compiler.h>
-
-#ifdef __Fuchsia__
-#include <zircon/syscalls.h>
-#endif
-
-#include "buffer_walker.h"
-
-#include <stdio.h>
-
-// TODO(kulakowski) Design zx_status_t error values.
-
-namespace {
-
-class FidlEncoder final : public fidl::internal::BufferWalker<FidlEncoder, true, true> {
-    typedef fidl::internal::BufferWalker<FidlEncoder, true, true> Super;
-
-public:
-    FidlEncoder(const fidl_type_t* type, void* bytes, uint32_t num_bytes, zx_handle_t* handles,
-                uint32_t num_handles, uint32_t* out_actual_handles, const char** out_error_msg)
-        : Super(type), bytes_(static_cast<uint8_t*>(bytes)), num_bytes_(num_bytes),
-          handles_(handles), num_handles_(num_handles), out_actual_handles_(out_actual_handles),
-          out_error_msg_(out_error_msg) {}
-
-    void Walk() {
-        if (handles_ == nullptr && num_handles_ != 0u) {
-            SetError("Cannot provide non-zero handle count and null handle pointer");
-            return;
-        }
-        if (out_actual_handles_ == nullptr) {
-            SetError("Cannot encode with null out_actual_handles");
-            return;
-        }
-        Super::Walk();
-        if (status_ == ZX_OK) {
-            *out_actual_handles_ = handle_idx();
-        }
-    }
-
-    uint8_t* bytes() const { return bytes_; }
-    uint32_t num_bytes() const { return num_bytes_; }
-    uint32_t num_handles() const { return num_handles_; }
-
-    bool ValidateOutOfLineStorageClaim(const void* a, const void* b) {
-        return a == b;
-    }
-
-    void UnclaimedHandle(zx_handle_t* out_handle) {
-#ifdef __Fuchsia__
-        // Return value intentionally ignored: this is best-effort cleanup.
-        zx_handle_close(*out_handle);
-#endif
-    }
-    void ClaimedHandle(zx_handle_t* out_handle, uint32_t idx) {
-        assert(out_handle != nullptr);
-        handles_[idx] = *out_handle;
-        *out_handle = FIDL_HANDLE_PRESENT;
-    }
-
-    PointerState GetPointerState(const void* ptr) const {
-        return *static_cast<const uintptr_t*>(ptr) == 0
-                   ? PointerState::ABSENT
-                   : PointerState::PRESENT;
-    }
-    HandleState GetHandleState(zx_handle_t p) const {
-        return p == ZX_HANDLE_INVALID
-                   ? HandleState::ABSENT
-                   : HandleState::PRESENT;
-    }
-
-    template <class T>
-    void UpdatePointer(T** p, T* v) {
-        assert(*p == v);
-        assert(v != nullptr);
-        *p = reinterpret_cast<T*>(FIDL_ALLOC_PRESENT);
-    }
-
-    void SetError(const char* error_msg) {
-        if (status_ != ZX_OK) {
-            return;
-        }
-        status_ = ZX_ERR_INVALID_ARGS;
-        if (out_error_msg_ != nullptr) {
-            *out_error_msg_ = error_msg;
-        }
-#ifdef __Fuchsia__
-        if (handles_) {
-            // Return value intentionally ignored: this is best-effort cleanup.
-            zx_handle_close_many(handles_, num_handles());
-        }
-#endif
-    }
-
-    zx_status_t status() const { return status_; }
-
-private:
-    // Message state passed in to the constructor.
-    uint8_t* const bytes_;
-    const uint32_t num_bytes_;
-    zx_handle_t* const handles_;
-    const uint32_t num_handles_;
-    uint32_t* const out_actual_handles_;
-    const char** const out_error_msg_;
-    zx_status_t status_ = ZX_OK;
-};
-
-} // namespace
-
-zx_status_t fidl_encode(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                        zx_handle_t* handles, uint32_t max_handles, uint32_t* out_actual_handles,
-                        const char** out_error_msg) {
-    FidlEncoder encoder(type, bytes, num_bytes, handles, max_handles, out_actual_handles,
-                        out_error_msg);
-    encoder.Walk();
-    return encoder.status();
-}
-
-zx_status_t fidl_encode_msg(const fidl_type_t* type, fidl_msg_t* msg,
-                            uint32_t* out_actual_handles, const char** out_error_msg) {
-    return fidl_encode(type, msg->bytes, msg->num_bytes, msg->handles, msg->num_handles,
-                       out_actual_handles, out_error_msg);
-}
diff --git a/pkg/fidl/epitaph.c b/pkg/fidl/epitaph.c
deleted file mode 100644
index d1a14e1..0000000
--- a/pkg/fidl/epitaph.c
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-#ifdef __Fuchsia__
-
-#include <string.h>
-
-#include <lib/fidl/epitaph.h>
-#include <zircon/fidl.h>
-#include <zircon/syscalls.h>
-
-zx_status_t fidl_epitaph_write(zx_handle_t channel, zx_status_t error) {
-    fidl_epitaph_t epitaph;
-    memset(&epitaph, 0, sizeof(epitaph));
-    epitaph.hdr.ordinal = FIDL_EPITAPH_ORDINAL;
-    epitaph.hdr.reserved0 = error;
-
-    return zx_channel_write(channel, 0, &epitaph, sizeof(epitaph), NULL, 0);
-}
-
-#endif // __Fuchsia__
diff --git a/pkg/fidl/formatting.cpp b/pkg/fidl/formatting.cpp
deleted file mode 100644
index ffe6f39..0000000
--- a/pkg/fidl/formatting.cpp
+++ /dev/null
@@ -1,218 +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.
-
-#include <lib/fidl/coding.h>
-
-#include <inttypes.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include <lib/fidl/internal.h>
-#include <zircon/assert.h>
-#include <zircon/compiler.h>
-
-namespace {
-
-class StringBuilder {
-public:
-    StringBuilder(char* buffer, size_t capacity)
-        : buffer_(buffer), capacity_(capacity) {}
-
-    size_t length() const { return length_; }
-
-    void Append(const char* data, size_t length) {
-        size_t remaining = capacity_ - length_;
-        if (length > remaining) {
-            length = remaining;
-        }
-        memcpy(buffer_ + length_, data, length);
-        length_ += length;
-    }
-
-    void Append(const char* data) {
-        Append(data, strlen(data));
-    }
-
-    void AppendPrintf(const char* format, ...) __PRINTFLIKE(2, 3) {
-        va_list ap;
-        va_start(ap, format);
-        AppendVPrintf(format, ap);
-        va_end(ap);
-    }
-
-    void AppendVPrintf(const char* format, va_list ap) {
-        size_t remaining = capacity_ - length_;
-        if (remaining == 0u) {
-            return;
-        }
-        int count = vsnprintf(buffer_ + length_, remaining, format, ap);
-        if (count <= 0) {
-            return;
-        }
-        size_t length = static_cast<size_t>(count);
-        length_ += (length >= remaining ? remaining : length);
-    }
-
-private:
-    char* buffer_;
-    size_t capacity_;
-    size_t length_ = 0u;
-};
-
-void FormatNullability(StringBuilder* str, fidl::FidlNullability nullable) {
-    if (nullable == fidl::kNullable) {
-        str->Append("?");
-    }
-}
-
-void FormatStructName(StringBuilder* str, const fidl::FidlCodedStruct* coded_struct) {
-    if (coded_struct->name) {
-        str->Append(coded_struct->name);
-    } else {
-        str->Append("struct");
-    }
-}
-
-void FormatUnionName(StringBuilder* str, const fidl::FidlCodedUnion* coded_union) {
-    if (coded_union->name) {
-        str->Append(coded_union->name);
-    } else {
-        str->Append("union");
-    }
-}
-
-void FormatTypeName(StringBuilder* str, const fidl_type_t* type);
-void FormatElementName(StringBuilder* str, const fidl_type_t* type) {
-    if (type) {
-        FormatTypeName(str, type);
-    } else {
-        // TODO(jeffbrown): Print the actual primitive type name, assuming we
-        // start recording that information in the tables.
-        str->Append("primitive");
-    }
-}
-
-void FormatTypeName(StringBuilder* str, const fidl_type_t* type) {
-    switch (type->type_tag) {
-    case fidl::kFidlTypeStruct:
-        FormatStructName(str, &type->coded_struct);
-        break;
-    case fidl::kFidlTypeStructPointer:
-        FormatStructName(str, type->coded_struct_pointer.struct_type);
-        str->Append("?");
-        break;
-    case fidl::kFidlTypeUnion:
-        FormatUnionName(str, &type->coded_union);
-        break;
-    case fidl::kFidlTypeUnionPointer:
-        FormatUnionName(str, type->coded_union_pointer.union_type);
-        str->Append("?");
-        break;
-    case fidl::kFidlTypeArray:
-        str->Append("array<");
-        FormatElementName(str, type->coded_array.element);
-        str->Append(">");
-        str->AppendPrintf(":%" PRIu32, type->coded_array.array_size /
-                                           type->coded_array.element_size);
-        break;
-    case fidl::kFidlTypeString:
-        str->Append("string");
-        if (type->coded_string.max_size != FIDL_MAX_SIZE) {
-            str->AppendPrintf(":%" PRIu32, type->coded_string.max_size);
-        }
-        FormatNullability(str, type->coded_string.nullable);
-        break;
-    case fidl::kFidlTypeHandle:
-        str->Append("handle");
-        if (type->coded_handle.handle_subtype) {
-            str->Append("<");
-            switch (type->coded_handle.handle_subtype) {
-            case fidl::kFidlHandleSubtypeHandle:
-                str->Append("handle");
-                break;
-            case fidl::kFidlHandleSubtypeProcess:
-                str->Append("process");
-                break;
-            case fidl::kFidlHandleSubtypeThread:
-                str->Append("thread");
-                break;
-            case fidl::kFidlHandleSubtypeVmo:
-                str->Append("vmo");
-                break;
-            case fidl::kFidlHandleSubtypeChannel:
-                str->Append("channel");
-                break;
-            case fidl::kFidlHandleSubtypeEvent:
-                str->Append("event");
-                break;
-            case fidl::kFidlHandleSubtypePort:
-                str->Append("port");
-                break;
-            case fidl::kFidlHandleSubtypeInterrupt:
-                str->Append("interrupt");
-                break;
-            case fidl::kFidlHandleSubtypeLog:
-                str->Append("log");
-                break;
-            case fidl::kFidlHandleSubtypeSocket:
-                str->Append("socket");
-                break;
-            case fidl::kFidlHandleSubtypeResource:
-                str->Append("resource");
-                break;
-            case fidl::kFidlHandleSubtypeEventpair:
-                str->Append("eventpair");
-                break;
-            case fidl::kFidlHandleSubtypeJob:
-                str->Append("job");
-                break;
-            case fidl::kFidlHandleSubtypeVmar:
-                str->Append("vmar");
-                break;
-            case fidl::kFidlHandleSubtypeFifo:
-                str->Append("fifo");
-                break;
-            case fidl::kFidlHandleSubtypeGuest:
-                str->Append("guest");
-                break;
-            case fidl::kFidlHandleSubtypeTimer:
-                str->Append("timer");
-                break;
-            // TODO(pascallouis): Add support for iomap, pci, and hypervisor
-            // when they are supported in FIDL.
-            default:
-                str->AppendPrintf("%" PRIu32, type->coded_handle.handle_subtype);
-                break;
-            }
-            str->Append(">");
-        }
-        FormatNullability(str, type->coded_handle.nullable);
-        break;
-    case fidl::kFidlTypeVector:
-        str->Append("vector<");
-        FormatElementName(str, type->coded_vector.element);
-        str->Append(">");
-        if (type->coded_vector.max_count != FIDL_MAX_SIZE) {
-            str->AppendPrintf(":%" PRIu32, type->coded_vector.max_count);
-        }
-        FormatNullability(str, type->coded_vector.nullable);
-        break;
-    default:
-        ZX_PANIC("unrecognized tag");
-        break;
-    }
-}
-
-} // namespace
-
-size_t fidl_format_type_name(const fidl_type_t* type,
-                             char* buffer, size_t capacity) {
-    if (!type || !buffer || !capacity) {
-        return 0u;
-    }
-
-    StringBuilder str(buffer, capacity);
-    FormatTypeName(&str, type);
-    return str.length();
-}
diff --git a/pkg/fidl/handle_closing.cpp b/pkg/fidl/handle_closing.cpp
deleted file mode 100644
index 5350993..0000000
--- a/pkg/fidl/handle_closing.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// 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.
-
-
-#include <limits>
-#include <stdalign.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <lib/fidl/coding.h>
-
-#ifdef __Fuchsia__
-
-#include <lib/fidl/internal.h>
-#include <zircon/assert.h>
-#include <zircon/compiler.h>
-#include <zircon/syscalls.h>
-
-#include "buffer_walker.h"
-
-namespace {
-
-class FidlHandleCloser final : public fidl::internal::BufferWalker<FidlHandleCloser, true, true> {
-    typedef fidl::internal::BufferWalker<FidlHandleCloser, true, true> Super;
-
-public:
-    FidlHandleCloser(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                     const char** out_error_msg)
-        : Super(type), bytes_(static_cast<uint8_t*>(bytes)), num_bytes_(num_bytes),
-          out_error_msg_(out_error_msg) {}
-
-    void Walk() {
-        Super::Walk();
-    }
-
-    uint8_t* bytes() const { return bytes_; }
-    uint32_t num_bytes() const { return num_bytes_; }
-    uint32_t num_handles() const { return std::numeric_limits<uint32_t>::max(); }
-
-    bool ValidateOutOfLineStorageClaim(const void* a, void* b) {
-        return true;
-    }
-
-    void UnclaimedHandle(zx_handle_t* out_handle) {
-        // This will never happen since we are returning numeric_limits::max() in num_handles.
-        // We want to claim (close) all the handles.
-        ZX_DEBUG_ASSERT(false);
-    }
-
-    void ClaimedHandle(zx_handle_t* out_handle, uint32_t idx) {
-        if (*out_handle != ZX_HANDLE_INVALID) {
-            zx_handle_close(*out_handle);
-        }
-        *out_handle = ZX_HANDLE_INVALID;
-    }
-
-    template <class T>
-    void UpdatePointer(T* const* p, T* v) {}
-
-    PointerState GetPointerState(const void* ptr) const {
-        return *static_cast<const uintptr_t*>(ptr) == 0
-               ? PointerState::ABSENT
-               : PointerState::PRESENT;
-    }
-
-    HandleState GetHandleState(zx_handle_t p) const {
-        // Treat all handles as present to keep the buffer walker going.
-        return HandleState::PRESENT;
-    }
-
-    void SetError(const char* error_msg) {
-        status_ = ZX_ERR_INVALID_ARGS;
-        if (out_error_msg_ != nullptr) {
-            *out_error_msg_ = error_msg;
-        }
-    }
-
-    zx_status_t status() const { return status_; }
-
-private:
-    // Message state passed in to the constructor.
-    uint8_t* const bytes_;
-    const uint32_t num_bytes_;
-    const char** const out_error_msg_;
-    zx_status_t status_ = ZX_OK;
-};
-
-} // namespace
-
-#endif  // __Fuchsia__
-
-zx_status_t fidl_close_handles(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                               const char** out_error_msg) {
-#if __Fuchsia__
-    FidlHandleCloser handle_closer(type, bytes, num_bytes, out_error_msg);
-    handle_closer.Walk();
-    return handle_closer.status();
-#else
-    return ZX_OK;  // there can't be any handles on the host
-#endif
-}
-
-zx_status_t fidl_close_handles_msg(const fidl_type_t* type, const fidl_msg_t* msg,
-                                   const char** out_error_msg) {
-    return fidl_close_handles(type, msg->bytes, msg->num_bytes, out_error_msg);
-}
-
diff --git a/pkg/fidl/include/lib/fidl/coding.h b/pkg/fidl/include/lib/fidl/coding.h
deleted file mode 100644
index f30fe94..0000000
--- a/pkg/fidl/include/lib/fidl/coding.h
+++ /dev/null
@@ -1,60 +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.
-
-#ifndef LIB_FIDL_CODING_H_
-#define LIB_FIDL_CODING_H_
-
-#include <zircon/compiler.h>
-#include <zircon/fidl.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS
-
-// The maximum recursion depth the fidl encoder or decoder will
-// perform. Each nested aggregate type (structs, unions, arrays, or
-// vectors) counts as one step in the recursion depth.
-#define FIDL_RECURSION_DEPTH 32
-
-// See https://fuchsia.googlesource.com/docs/+/master/development/languages/fidl/languages/c.md#fidl_encode-fidl_encode_msg
-zx_status_t fidl_encode(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                        zx_handle_t* handles, uint32_t max_handles,
-                        uint32_t* out_actual_handles, const char** out_error_msg);
-zx_status_t fidl_encode_msg(const fidl_type_t* type, fidl_msg_t* msg,
-                            uint32_t* out_actual_handles, const char** out_error_msg);
-
-// See https://fuchsia.googlesource.com/docs/+/master/development/languages/fidl/languages/c.md#fidl_decode-fidl_decode_msg
-zx_status_t fidl_decode(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                        const zx_handle_t* handles, uint32_t num_handles,
-                        const char** error_msg_out);
-zx_status_t fidl_decode_msg(const fidl_type_t* type, fidl_msg_t* msg,
-                            const char** out_error_msg);
-
-// Validates an encoded message against the given |type|.
-//
-// The |bytes| are not modified.
-zx_status_t fidl_validate(const fidl_type_t* type, const void* bytes, uint32_t num_bytes,
-                          uint32_t num_handles, const char** error_msg_out);
-zx_status_t fidl_validate_msg(const fidl_type_t* type, const fidl_msg_t* msg,
-                              const char** out_error_msg);
-
-// Traverses a linearized FIDL message, closing all handles within it.
-// This function is a no-op on host side.
-//
-// Handle values in |bytes| are replaced with ZX_HANDLE_INVALID.
-zx_status_t fidl_close_handles(const fidl_type_t* type, void* bytes, uint32_t num_bytes,
-                               const char** out_error_msg);
-zx_status_t fidl_close_handles_msg(const fidl_type_t* type, const fidl_msg_t* msg,
-                                   const char** out_error_msg);
-
-// Stores the name of a fidl type into the provided buffer.
-// Truncates the name if it is too long to fit into the buffer.
-// Returns the number of characters written into the buffer.
-//
-// Note: This function does not write a trailing NUL.
-size_t fidl_format_type_name(const fidl_type_t* type,
-                             char* buffer, size_t capacity);
-
-__END_CDECLS
-
-#endif // LIB_FIDL_CODING_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/builder.h b/pkg/fidl/include/lib/fidl/cpp/builder.h
deleted file mode 100644
index bc394c5..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/builder.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_BUILDER_H_
-#define LIB_FIDL_CPP_BUILDER_H_
-
-#include <new>  // For placement new.
-#include <stdalign.h>
-#include <stdint.h>
-
-#include <lib/fidl/cpp/message_part.h>
-#include <zircon/compiler.h>
-#include <zircon/fidl.h>
-#include <zircon/types.h>
-
-namespace fidl {
-
-// Builder helps FIDL clients store decoded objects in a buffer.
-//
-// Objects are allocated sequentually in the buffer with appropriate alignment
-// for in-place encoding. The client is responsible for ordering the objects in
-// the buffer appropriately.
-class Builder {
-public:
-    // Creates a buffer without any storage.
-    Builder();
-
-    // Creates a buffer that stores objects in the given memory.
-    //
-    // The constructed |Builder| object does not take ownership of the given
-    // storage.
-    Builder(void* buffer, uint32_t capacity);
-    ~Builder();
-
-    Builder(const Builder& other) = delete;
-    Builder& operator=(const Builder& other) = delete;
-
-    Builder(Builder&& other);
-    Builder& operator=(Builder&& other);
-
-    // Allocates storage in the buffer of sufficient size to store an object of
-    // type |T|. The object must have alignment constraints that are compatible
-    // with FIDL messages.
-    //
-    // If there is insufficient storage in the builder's buffer, this method
-    // returns nullptr.
-    template <typename T>
-    T* New() {
-        static_assert(alignof(T) <= FIDL_ALIGNMENT, "");
-        static_assert(sizeof(T) <= ZX_CHANNEL_MAX_MSG_BYTES, "");
-        if (void* ptr = Allocate(sizeof(T)))
-            return new (ptr) T;
-        return nullptr;
-    }
-
-    // Allocates storage in the buffer of sufficient size to store |count|
-    // objects of type |T|. The object must have alignment constraints that are
-    // compatible with FIDL messages.
-    //
-    // If there is insufficient storage in the builder's buffer, this method
-    // returns nullptr.
-    template <typename T>
-    T* NewArray(uint32_t count) {
-        static_assert(alignof(T) <= FIDL_ALIGNMENT, "");
-        static_assert(sizeof(T) <= ZX_CHANNEL_MAX_MSG_BYTES, "");
-        if (sizeof(T) * static_cast<uint64_t>(count) > UINT32_MAX)
-            return nullptr;
-        if (void* ptr = Allocate(static_cast<uint32_t>(sizeof(T) * count)))
-            return new (ptr) T[count];
-        return nullptr;
-    }
-
-    // Completes the building and returns a |MesssagePart| containing the
-    // allocated objects.
-    //
-    // The allocated objects are placed in the returned buffer in the order in
-    // which they were allocated, with appropriate alignment for a FIDL message.
-    // The returned buffer's capacity cooresponds to the capacity originally
-    // provided to this builder in its constructor.
-    BytePart Finalize();
-
-    // Attaches the given storage to the |Builder|.
-    //
-    // The |Builder| object does not take ownership of the given storage. The
-    // next object will be allocated at the start of the buffer.
-    void Reset(void* buffer, uint32_t capacity);
-
-protected:
-    uint8_t* buffer() const { return buffer_; }
-    uint32_t capacity() const { return capacity_; }
-
-private:
-    // Returns |size| bytes of zeroed memory aligned to at least FIDL_ALIGNMENT
-    void* Allocate(uint32_t size);
-
-    uint32_t capacity_;
-    uint32_t at_;
-    uint8_t* buffer_;
-};
-
-} // namespace fidl
-
-#endif //  LIB_FIDL_CPP_BUILDER_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/message.h b/pkg/fidl/include/lib/fidl/cpp/message.h
deleted file mode 100644
index d93e7c9..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/message.h
+++ /dev/null
@@ -1,172 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_MESSAGE_H_
-#define LIB_FIDL_CPP_MESSAGE_H_
-
-#include <lib/fidl/coding.h>
-#include <lib/fidl/cpp/message_part.h>
-#include <zircon/fidl.h>
-
-namespace fidl {
-
-// A FIDL message.
-//
-// A FIDL message has two parts: the bytes and the handles. The bytes are
-// divided into a header (of type fidl_message_header_t) and a payload, which
-// follows the header.
-//
-// A Message object does not own the storage for the message parts.
-class Message {
-public:
-    // Creates a message without any storage.
-    Message();
-
-    // Creates a message whose storage is backed by |bytes| and |handles|.
-    //
-    // The constructed |Message| object does not take ownership of the given
-    // storage, although does take ownership of zircon handles contained withing
-    // handles.
-    Message(BytePart bytes, HandlePart handles);
-
-    ~Message();
-
-    Message(const Message& other) = delete;
-    Message& operator=(const Message& other) = delete;
-
-    Message(Message&& other);
-    Message& operator=(Message&& other);
-
-    // Whether the message has enough bytes to contain a fidl_message_header_t.
-    bool has_header() const {
-        return bytes_.actual() >= sizeof(fidl_message_header_t);
-    }
-
-    // The header at the start of the message.
-    //
-    // Valid only if has_header().
-    const fidl_message_header_t& header() const {
-        return *reinterpret_cast<fidl_message_header_t*>(bytes_.data());
-    }
-    fidl_message_header_t& header() {
-        return *reinterpret_cast<fidl_message_header_t*>(bytes_.data());
-    }
-
-    // The transaction ID in the message header.
-    //
-    // Valid only if has_header().
-    zx_txid_t txid() const { return header().txid; }
-    void set_txid(zx_txid_t txid) { header().txid = txid; }
-
-    // The flags in the message header.
-    //
-    // Valid only if has_header().
-    uint32_t flags() const { return header().flags; }
-
-    // The flags in the message header.
-    //
-    // Valid only if has_header().
-    uint32_t ordinal() const { return header().ordinal; }
-
-    // The message payload that follows the header.
-    //
-    // Valid only if has_header().
-    BytePart payload() const {
-        constexpr uint32_t n = sizeof(fidl_message_header_t);
-        return BytePart(bytes_.data() + n, bytes_.capacity() - n, bytes_.actual() - n);
-    }
-
-    // The message bytes interpreted as the given type.
-    template <typename T>
-    T* GetBytesAs() const {
-        return reinterpret_cast<T*>(bytes_.data());
-    }
-
-    // The message payload that follows the header interpreted as the given type.
-    //
-    // Valid only if has_header().
-    template <typename T>
-    T* GetPayloadAs() const {
-        return reinterpret_cast<T*>(bytes_.data() + sizeof(fidl_message_header_t));
-    }
-
-    // The storage for the bytes of the message.
-    BytePart& bytes() { return bytes_; }
-    const BytePart& bytes() const { return bytes_; }
-    void set_bytes(BytePart bytes) { bytes_ = static_cast<BytePart&&>(bytes); }
-
-    // The storage for the handles of the message.
-    //
-    // When the message is encoded, the handle values are stored in this part of
-    // the message. When the message is decoded, this part of the message is
-    // empty and the handle values are stored in the bytes().
-    HandlePart& handles() { return handles_; }
-    const HandlePart& handles() const { return handles_; }
-
-    // Encodes the message in-place.
-    //
-    // The message must previously have been in a decoded state, for example,
-    // either by being built in a decoded state using a |Builder| or having been
-    // decoded using the |Decode| method.
-    zx_status_t Encode(const fidl_type_t* type, const char** error_msg_out);
-
-    // Decodes the message in-place.
-    //
-    // The message must previously have been in an encoded state, for example,
-    // either by being read from a zx_channel_t or having been encoded using the
-    // |Encode| method.
-    zx_status_t Decode(const fidl_type_t* type, const char** error_msg_out);
-
-    // Validates the message in-place.
-    //
-    // The message must already be in an encoded state, for example, either by
-    // being read from a zx_channel_t or having been created in that state.
-    //
-    // Does not modify the message.
-    zx_status_t Validate(const fidl_type_t* type, const char** error_msg_out) const;
-
-    // Read a message from the given channel.
-    //
-    // The bytes read from the channel are stored in bytes() and the handles
-    // read from the channel are stored in handles(). Existing data in these
-    // buffers is overwritten.
-    zx_status_t Read(zx_handle_t channel, uint32_t flags);
-
-    // Writes a message to the given channel.
-    //
-    // The bytes stored in bytes() are written to the channel and the handles
-    // stored in handles() are written to the channel.
-    //
-    // If this method returns ZX_OK, handles() will be empty because they were
-    // consumed by this operation.
-    zx_status_t Write(zx_handle_t channel, uint32_t flags);
-
-    // Issues a synchronous send and receive transaction on the given channel.
-    //
-    // The bytes stored in bytes() are written to the channel and the handles
-    // stored in handles() are written to the channel. The bytes read from the
-    // channel are stored in response->bytes() and the handles read from the
-    // channel are stored in response->handles().
-    //
-    // If this method returns ZX_OK, handles() will be empty because they were
-    // consumed by this operation.
-    zx_status_t Call(zx_handle_t channel, uint32_t flags, zx_time_t deadline,
-                     Message* response);
-
-    // Stop tracking the handles in stored in handles(), without closing them.
-    //
-    // Typically, these handles will be extracted during decode or the
-    // message's destructor, so this function will be unnecessary. However,
-    // for clients of ulib/fidl which decode message manually, this function
-    // is necessary to prevent extracted handles from being closed.
-    void ClearHandlesUnsafe();
-
-private:
-    BytePart bytes_;
-    HandlePart handles_;
-};
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_MESSAGE_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/message_buffer.h b/pkg/fidl/include/lib/fidl/cpp/message_buffer.h
deleted file mode 100644
index 8e85823..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/message_buffer.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_MESSAGE_BUFFER_H_
-#define LIB_FIDL_CPP_MESSAGE_BUFFER_H_
-
-#include <stdint.h>
-
-#include <lib/fidl/cpp/builder.h>
-#include <lib/fidl/cpp/message.h>
-#include <zircon/fidl.h>
-#include <zircon/types.h>
-
-namespace fidl {
-
-class MessageBuffer {
-public:
-    // Creates a |MessageBuffer| that allocates buffers for message of the
-    // given capacities.
-    //
-    // The buffers are freed when the |MessageBuffer| is destructed.
-    explicit MessageBuffer(
-        uint32_t bytes_capacity = ZX_CHANNEL_MAX_MSG_BYTES,
-        uint32_t handles_capacity = ZX_CHANNEL_MAX_MSG_HANDLES);
-
-    // The memory that backs the message is freed by this destructor.
-    ~MessageBuffer();
-
-    // The memory in which bytes can be stored in this buffer.
-    uint8_t* bytes() const { return buffer_; }
-
-    // The total number of bytes that can be stored in this buffer.
-    uint32_t bytes_capacity() const { return bytes_capacity_; }
-
-    // The memory in which handles can be stored in this buffer.
-    zx_handle_t* handles() const;
-
-    // The total number of handles that can be stored in this buffer.
-    uint32_t handles_capacity() const { return handles_capacity_; }
-
-    // Creates a |Message| that is backed by the memory in this buffer.
-    //
-    // The returned |Message| contains no bytes or handles.
-    Message CreateEmptyMessage();
-
-    // Creates a |Builder| that is backed by the memory in this buffer.
-    Builder CreateBuilder();
-
-private:
-    uint8_t* const buffer_;
-    const uint32_t bytes_capacity_;
-    const uint32_t handles_capacity_;
-};
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_MESSAGE_BUFFER_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/message_builder.h b/pkg/fidl/include/lib/fidl/cpp/message_builder.h
deleted file mode 100644
index b571f3b..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/message_builder.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_MESSAGE_BUILDER_H_
-#define LIB_FIDL_CPP_MESSAGE_BUILDER_H_
-
-#include <stdint.h>
-
-#include <lib/fidl/cpp/builder.h>
-#include <lib/fidl/cpp/message_buffer.h>
-#include <lib/fidl/cpp/message.h>
-#include <zircon/fidl.h>
-#include <zircon/types.h>
-
-namespace fidl {
-
-// A builder for FIDL messages that owns the memory for the message.
-//
-// A |MessageBuilder| is a |Builder| that uses the heap to back the memory for
-// the message. If you wish to manage the memory yourself, you can use |Builder|
-// and |Message| directly.
-//
-// Upon creation, the |MessageBuilder| creates a FIDL message header, which you
-// can modify using |header()|.
-class MessageBuilder : public Builder {
-public:
-    // Creates a |MessageBuilder| for the given |type| that allocates buffers
-    // for message of the given capacities.
-    //
-    // The bytes buffer is initialied by adding a |fidl_message_header_t|
-    // header.
-    //
-    // The buffers are freed when the |MessageBuilder| is destructed.
-    explicit MessageBuilder(
-        const fidl_type_t* type,
-        uint32_t bytes_capacity = ZX_CHANNEL_MAX_MSG_BYTES,
-        uint32_t handles_capacity = ZX_CHANNEL_MAX_MSG_HANDLES);
-
-    // The memory that backs the message is freed by this destructor.
-    ~MessageBuilder();
-
-    // The type of the message payload this object is building.
-    const fidl_type_t* type() const { return type_; }
-
-    // The header for the message.
-    //
-    // The message header is allocated by the |MessageBuilder| itself.
-    fidl_message_header_t* header() const {
-        return reinterpret_cast<fidl_message_header_t*>(buffer());
-    }
-
-    // Encodes a message of the given |type|.
-    //
-    // The memory that backs the message returned by this function is owned by
-    // the |MessageBuilder|, which means the |MessageBuilder| must remain alive
-    // as long as the |Message| object is in use.
-    //
-    // The |message| parameter might be modified even if this method returns an
-    // error.
-    zx_status_t Encode(Message* message_out, const char** error_msg_out);
-
-    // Resets all the data in the |MessageBuffer|.
-    //
-    // The underlying buffer is retained and reused. The next object will be
-    // allocated at the start of the buffer.
-    void Reset();
-
-private:
-    const fidl_type_t* type_;
-    MessageBuffer buffer_;
-};
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_MESSAGE_BUILDER_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/message_part.h b/pkg/fidl/include/lib/fidl/cpp/message_part.h
deleted file mode 100644
index 1dd7f7b..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/message_part.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_MESSAGE_PART_H_
-#define LIB_FIDL_CPP_MESSAGE_PART_H_
-
-#include <stdint.h>
-#include <string.h>
-
-#include <zircon/types.h>
-
-namespace fidl {
-
-// Part of a FIDL message.
-//
-// A FIDL message has two parts: the bytes and the handles. This class is used
-// to represent both kinds of parts.
-//
-// Each part of the message has a data buffer, which contains the actual data
-// for that part of the message, a capacity for that buffer, and the actual
-// amount of data stored in the buffer, which might be less that the capacity if
-// the buffer is not completely full.
-template<typename T>
-class MessagePart {
-public:
-    using value_type = T;
-    using const_iterator = const T*;
-
-    // A message part with no storage.
-    MessagePart() : data_(nullptr), capacity_(0u), actual_(0u) {}
-
-    // A message part that uses the given storage.
-    //
-    // The constructed |MessagePart| object does not take ownership of the given
-    // storage.
-    MessagePart(T* data, uint32_t capacity, uint32_t actual = 0u)
-        : data_(data), capacity_(capacity), actual_(actual) {}
-
-    MessagePart(const MessagePart& other) = delete;
-    MessagePart& operator=(const MessagePart& other) = delete;
-
-    MessagePart(MessagePart&& other)
-        : data_(other.data_),
-          capacity_(other.capacity_),
-          actual_(other.actual_) {
-        other.data_ = nullptr;
-        other.capacity_ = 0u;
-        other.actual_ = 0u;
-    }
-
-    MessagePart& operator=(MessagePart&& other) {
-        if (this == &other)
-            return *this;
-        data_ = other.data_;
-        capacity_ = other.capacity_;
-        actual_ = other.actual_;
-        other.data_ = nullptr;
-        other.capacity_ = 0u;
-        other.actual_ = 0u;
-        return *this;
-    }
-
-    // The data stored in this part of the message.
-    T* data() const { return data_; }
-
-    // The total amount of storage available for this part of the message.
-    //
-    // This part of the message might not actually use all of this storage. To
-    // determine how much storage is actually being used, see |actual()|.
-    uint32_t capacity() const { return capacity_; }
-
-    // The amount of storage that is actually being used for this part of the
-    // message.
-    //
-    // There might be more storage available than is actually being used. To
-    // determine how much storage is available, see |capacity()|.
-    uint32_t actual() const { return actual_; }
-    void set_actual(uint32_t actual) { actual_ = actual; }
-
-    T* begin() { return data_; }
-    const T* begin() const { return data_; }
-    const T* cbegin() const { return data_; }
-
-    T* end() { return data_ + actual_; }
-    const T* end() const { return data_ + actual_; }
-    const T* cend() const { return data_ + actual_; }
-
-    size_t size() const { return actual_; }
-
-private:
-    T* data_;
-    uint32_t capacity_;
-    uint32_t actual_;
-};
-
-using BytePart = MessagePart<uint8_t>;
-using HandlePart = MessagePart<zx_handle_t>;
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_MESSAGE_PART_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/string_view.h b/pkg/fidl/include/lib/fidl/cpp/string_view.h
deleted file mode 100644
index 88eec42..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/string_view.h
+++ /dev/null
@@ -1,46 +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.
-
-#ifndef LIB_FIDL_CPP_STRING_VIEW_H_
-#define LIB_FIDL_CPP_STRING_VIEW_H_
-
-#include <zircon/fidl.h>
-
-namespace fidl {
-
-class StringView : public fidl_string_t {
-public:
-    StringView() : fidl_string_t{} {}
-
-    uint64_t size() const { return fidl_string_t::size; }
-    void set_size(uint64_t size) { fidl_string_t::size = size; }
-
-    const char* data() const { return fidl_string_t::data; }
-    void set_data(char* data) { fidl_string_t::data = data; }
-
-    char* mutable_data() const { return fidl_string_t::data; }
-
-    bool is_null() const { return fidl_string_t::data == nullptr; }
-    bool empty() const { return fidl_string_t::size == 0; }
-
-    const char& at(size_t offset) const { return data()[offset]; }
-    char& at(size_t offset) { return mutable_data()[offset]; }
-
-    const char& operator[](size_t offset) const { return at(offset); }
-    char& operator[](size_t offset) { return at(offset); }
-
-    char* begin() { return mutable_data(); }
-    const char* begin() const { return data(); }
-    const char* cbegin() const { return data(); }
-
-    char* end() { return mutable_data() + size(); }
-    const char* end() const { return data() + size(); }
-    const char* cend() const { return data() + size(); }
-
-    fidl_string_t* impl() { return this; }
-};
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_STRING_VIEW_H_
diff --git a/pkg/fidl/include/lib/fidl/cpp/vector_view.h b/pkg/fidl/include/lib/fidl/cpp/vector_view.h
deleted file mode 100644
index df4cedf..0000000
--- a/pkg/fidl/include/lib/fidl/cpp/vector_view.h
+++ /dev/null
@@ -1,47 +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.
-
-#ifndef LIB_FIDL_CPP_VECTOR_VIEW_H_
-#define LIB_FIDL_CPP_VECTOR_VIEW_H_
-
-#include <zircon/fidl.h>
-
-namespace fidl {
-
-template<typename T>
-class VectorView : public fidl_vector_t {
-public:
-    VectorView() : fidl_vector_t{} {}
-
-    uint64_t count() const { return fidl_vector_t::count; }
-    void set_count(uint64_t count) { fidl_vector_t::count = count; }
-
-    const T* data() const { return static_cast<T*>(fidl_vector_t::data); }
-    void set_data(T* data) { fidl_vector_t::data = data; }
-
-    T* mutable_data() const { return static_cast<T*>(fidl_vector_t::data); }
-
-    bool is_null() const { return fidl_vector_t::data == nullptr; }
-    bool empty() const { return fidl_vector_t::count == 0; }
-
-    const T& at(size_t offset) const { return data()[offset]; }
-    T& at(size_t offset) { return mutable_data()[offset]; }
-
-    const T& operator[](size_t offset) const { return at(offset); }
-    T& operator[](size_t offset) { return at(offset); }
-
-    T* begin() { return mutable_data(); }
-    const T* begin() const { return data(); }
-    const T* cbegin() const { return data(); }
-
-    T* end() { return mutable_data() + count(); }
-    const T* end() const { return data() + count(); }
-    const T* cend() const { return data() + count(); }
-
-    fidl_vector_t* impl() { return this; }
-};
-
-} // namespace fidl
-
-#endif // LIB_FIDL_CPP_VECTOR_VIEW_H_
diff --git a/pkg/fidl/include/lib/fidl/epitaph.h b/pkg/fidl/include/lib/fidl/epitaph.h
deleted file mode 100644
index 55653a7..0000000
--- a/pkg/fidl/include/lib/fidl/epitaph.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_EPITAPH_H_
-#define LIB_FIDL_EPITAPH_H_
-
-#include <zircon/types.h>
-
-__BEGIN_CDECLS
-
-#ifdef __Fuchsia__
-
-// Sends an epitaph with the given values down the channel.
-// See https://fuchsia.googlesource.com/docs/+/master/development/languages/fidl/languages/c.md#fidl_epitaph_write
-zx_status_t fidl_epitaph_write(zx_handle_t channel, zx_status_t error);
-
-#endif // __Fuchsia__
-
-__END_CDECLS
-
-#endif // LIB_FIDL_EPITAPH_H_
diff --git a/pkg/fidl/include/lib/fidl/internal.h b/pkg/fidl/include/lib/fidl/internal.h
deleted file mode 100644
index efef16e..0000000
--- a/pkg/fidl/include/lib/fidl/internal.h
+++ /dev/null
@@ -1,242 +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.
-
-#ifndef LIB_FIDL_INTERNAL_H_
-#define LIB_FIDL_INTERNAL_H_
-
-#include <assert.h>
-#include <stdint.h>
-
-#include <lib/fidl/coding.h>
-#include <zircon/syscalls/object.h>
-#include <zircon/types.h>
-
-// All sizes here are given as uint32_t. Fidl message sizes are bounded to well below UINT32_MAX.
-// This also applies to arrays and vectors. For arrays, element_count * element_size will always fit
-// with 32 bits. For vectors, max_count * element_size will always fit within 32 bits.
-
-// Pointers to other type tables within a type are always nonnull, with the exception of vectors.
-// In that case, a null pointer indicates that the element type of the vector has no interesting
-// information to be decoded (i.e. no pointers or handles). The vector type still needs to be
-// emitted as it contains the information about the size of its secondary object. Contrast this with
-// arrays: being inline, ones with no interesting coding information can be elided, just like a
-// uint32 field in a struct is elided.
-
-namespace fidl {
-
-enum FidlNullability : uint32_t {
-    kNonnullable = 0u,
-    kNullable = 1u,
-};
-
-inline uint64_t FidlAlign(uint32_t offset) {
-    constexpr uint64_t alignment_mask = FIDL_ALIGNMENT - 1;
-    return (offset + alignment_mask) & ~alignment_mask;
-}
-
-struct FidlField {
-    const fidl_type* type;
-    uint32_t offset;
-
-    constexpr FidlField(const fidl_type* type, uint32_t offset)
-        : type(type), offset(offset) {}
-};
-
-struct FidlTableField {
-    const fidl_type* type;
-    uint32_t ordinal;
-
-    constexpr FidlTableField(const fidl_type* type, uint32_t ordinal)
-        : type(type), ordinal(ordinal) {}
-};
-
-enum FidlTypeTag : uint32_t {
-    kFidlTypeStruct = 0u,
-    kFidlTypeStructPointer = 1u,
-    kFidlTypeTable = 8u,
-    kFidlTypeTablePointer = 9u,
-    kFidlTypeUnion = 2u,
-    kFidlTypeUnionPointer = 3u,
-    kFidlTypeArray = 4u,
-    kFidlTypeString = 5u,
-    kFidlTypeHandle = 6u,
-    kFidlTypeVector = 7u,
-};
-
-// Though the |size| is implied by the fields, computing that information is not the purview of this
-// library. It's easier for the compiler to stash it.
-struct FidlCodedStruct {
-    const FidlField* const fields;
-    const uint32_t field_count;
-    const uint32_t size;
-    const char* name; // may be nullptr if omitted at compile time
-
-    constexpr FidlCodedStruct(const FidlField* fields, uint32_t field_count, uint32_t size,
-                              const char* name)
-        : fields(fields), field_count(field_count), size(size), name(name) {}
-};
-
-struct FidlCodedStructPointer {
-    const FidlCodedStruct* const struct_type;
-
-    constexpr explicit FidlCodedStructPointer(const FidlCodedStruct* struct_type)
-        : struct_type(struct_type) {}
-};
-
-struct FidlCodedTable {
-    const FidlTableField* const fields;
-    const uint32_t field_count;
-    const char* name; // may be nullptr if omitted at compile time
-
-    constexpr FidlCodedTable(const FidlTableField* fields, uint32_t field_count,
-                             const char* name)
-        : fields(fields), field_count(field_count), name(name) {}
-};
-
-struct FidlCodedTablePointer {
-    const FidlCodedTable* const table_type;
-
-    constexpr explicit FidlCodedTablePointer(const FidlCodedTable* table_type)
-        : table_type(table_type) {}
-};
-
-// Unlike structs, union members do not have different offsets, so this points to an array of
-// |fidl_type*| rather than |FidlField|.
-//
-// On-the-wire unions begin with a tag which is an index into |types|.
-// |data_offset| is the offset of the data in the wire format (tag + padding).
-struct FidlCodedUnion {
-    const fidl_type* const* types;
-    const uint32_t type_count;
-    const uint32_t data_offset;
-    const uint32_t size;
-    const char* name; // may be nullptr if omitted at compile time
-
-    constexpr FidlCodedUnion(const fidl_type* const* types, uint32_t type_count,
-                             uint32_t data_offset, uint32_t size, const char* name)
-        : types(types), type_count(type_count), data_offset(data_offset), size(size), name(name) {}
-};
-
-struct FidlCodedUnionPointer {
-    const FidlCodedUnion* const union_type;
-
-    constexpr explicit FidlCodedUnionPointer(const FidlCodedUnion* union_type)
-        : union_type(union_type) {}
-};
-
-// An array is essentially a struct with |array_size / element_size| of the same field, named at
-// |element|.
-struct FidlCodedArray {
-    const fidl_type* const element;
-    const uint32_t array_size;
-    const uint32_t element_size;
-
-    constexpr FidlCodedArray(const fidl_type* element, uint32_t array_size, uint32_t element_size)
-        : element(element), array_size(array_size), element_size(element_size) {}
-};
-
-// Note: must keep in sync with fidlc types.h HandleSubtype.
-enum FidlHandleSubtype : zx_obj_type_t {
-    // special case to indicate subtype is not specified.
-    kFidlHandleSubtypeHandle = ZX_OBJ_TYPE_NONE,
-
-    kFidlHandleSubtypeProcess = ZX_OBJ_TYPE_PROCESS,
-    kFidlHandleSubtypeThread = ZX_OBJ_TYPE_THREAD,
-    kFidlHandleSubtypeVmo = ZX_OBJ_TYPE_VMO,
-    kFidlHandleSubtypeChannel = ZX_OBJ_TYPE_CHANNEL,
-    kFidlHandleSubtypeEvent = ZX_OBJ_TYPE_EVENT,
-    kFidlHandleSubtypePort = ZX_OBJ_TYPE_PORT,
-    kFidlHandleSubtypeInterrupt = ZX_OBJ_TYPE_INTERRUPT,
-    kFidlHandleSubtypeLog = ZX_OBJ_TYPE_LOG,
-    kFidlHandleSubtypeSocket = ZX_OBJ_TYPE_SOCKET,
-    kFidlHandleSubtypeResource = ZX_OBJ_TYPE_RESOURCE,
-    kFidlHandleSubtypeEventpair = ZX_OBJ_TYPE_EVENTPAIR,
-    kFidlHandleSubtypeJob = ZX_OBJ_TYPE_JOB,
-    kFidlHandleSubtypeVmar = ZX_OBJ_TYPE_VMAR,
-    kFidlHandleSubtypeFifo = ZX_OBJ_TYPE_FIFO,
-    kFidlHandleSubtypeGuest = ZX_OBJ_TYPE_GUEST,
-    kFidlHandleSubtypeTimer = ZX_OBJ_TYPE_TIMER,
-};
-
-struct FidlCodedHandle {
-    const zx_obj_type_t handle_subtype;
-    const FidlNullability nullable;
-
-    constexpr FidlCodedHandle(uint32_t handle_subtype, FidlNullability nullable)
-        : handle_subtype(handle_subtype), nullable(nullable) {}
-
-    static_assert(ZX_OBJ_TYPE_LAST <= UINT32_MAX, "");
-};
-
-struct FidlCodedString {
-    const uint32_t max_size;
-    const FidlNullability nullable;
-
-    constexpr FidlCodedString(uint32_t max_size, FidlNullability nullable)
-        : max_size(max_size), nullable(nullable) {}
-};
-
-// Note that |max_count * element_size| is guaranteed to fit into a uint32_t. Unlike other types,
-// the |element| pointer may be null. This occurs when the element type contains no interesting bits
-// (i.e. pointers or handles).
-struct FidlCodedVector {
-    const fidl_type* const element;
-    const uint32_t max_count;
-    const uint32_t element_size;
-    const FidlNullability nullable;
-
-    constexpr FidlCodedVector(const fidl_type* element, uint32_t max_count, uint32_t element_size,
-                              FidlNullability nullable)
-        : element(element), max_count(max_count), element_size(element_size), nullable(nullable) {}
-};
-
-} // namespace fidl
-
-struct fidl_type {
-    const fidl::FidlTypeTag type_tag;
-    const union {
-        const fidl::FidlCodedStruct coded_struct;
-        const fidl::FidlCodedStructPointer coded_struct_pointer;
-        const fidl::FidlCodedTable coded_table;
-        const fidl::FidlCodedTablePointer coded_table_pointer;
-        const fidl::FidlCodedUnion coded_union;
-        const fidl::FidlCodedUnionPointer coded_union_pointer;
-        const fidl::FidlCodedHandle coded_handle;
-        const fidl::FidlCodedString coded_string;
-        const fidl::FidlCodedArray coded_array;
-        const fidl::FidlCodedVector coded_vector;
-    };
-
-    constexpr fidl_type(fidl::FidlCodedStruct coded_struct)
-        : type_tag(fidl::kFidlTypeStruct), coded_struct(coded_struct) {}
-
-    constexpr fidl_type(fidl::FidlCodedStructPointer coded_struct_pointer)
-        : type_tag(fidl::kFidlTypeStructPointer), coded_struct_pointer(coded_struct_pointer) {}
-
-    constexpr fidl_type(fidl::FidlCodedTable coded_table)
-        : type_tag(fidl::kFidlTypeTable), coded_table(coded_table) {}
-
-    constexpr fidl_type(fidl::FidlCodedTablePointer coded_table_pointer)
-        : type_tag(fidl::kFidlTypeTablePointer), coded_table_pointer(coded_table_pointer) {}
-
-    constexpr fidl_type(fidl::FidlCodedUnion coded_union)
-        : type_tag(fidl::kFidlTypeUnion), coded_union(coded_union) {}
-
-    constexpr fidl_type(fidl::FidlCodedUnionPointer coded_union_pointer)
-        : type_tag(fidl::kFidlTypeUnionPointer), coded_union_pointer(coded_union_pointer) {}
-
-    constexpr fidl_type(fidl::FidlCodedHandle coded_handle)
-        : type_tag(fidl::kFidlTypeHandle), coded_handle(coded_handle) {}
-
-    constexpr fidl_type(fidl::FidlCodedString coded_string)
-        : type_tag(fidl::kFidlTypeString), coded_string(coded_string) {}
-
-    constexpr fidl_type(fidl::FidlCodedArray coded_array)
-        : type_tag(fidl::kFidlTypeArray), coded_array(coded_array) {}
-
-    constexpr fidl_type(fidl::FidlCodedVector coded_vector)
-        : type_tag(fidl::kFidlTypeVector), coded_vector(coded_vector) {}
-};
-
-#endif // LIB_FIDL_INTERNAL_H_
diff --git a/pkg/fidl/include/lib/fidl/llcpp/decoded_message.h b/pkg/fidl/include/lib/fidl/llcpp/decoded_message.h
deleted file mode 100644
index 52d0ec5..0000000
--- a/pkg/fidl/include/lib/fidl/llcpp/decoded_message.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_LLCPP_DECODED_MESSAGE_H_
-#define LIB_FIDL_LLCPP_DECODED_MESSAGE_H_
-
-#include <lib/fidl/coding.h>
-#include <lib/fidl/llcpp/encoded_message.h>
-#include <lib/fidl/llcpp/traits.h>
-#include <type_traits>
-#include <zircon/fidl.h>
-
-namespace fidl {
-
-// `DecodedMessage` manages a linearized FIDL message in decoded form.
-// It takes care of releasing all handles which were not consumed
-// (std::moved from the decoded FIDL struct) when it goes out of scope.
-template <typename FidlType>
-class DecodedMessage final {
-    static_assert(IsFidlType<FidlType>::value, "Only FIDL types allowed here");
-    static_assert(FidlType::MaxSize > 0, "Positive message size");
-
-public:
-    // Instantiates an empty message.
-    // To populate this message, decode from an EncodedMessage object.
-    DecodedMessage() = default;
-
-    // Instantiates a DecodedMessage which points to a buffer region with caller-managed memory.
-    // The buffer region is assumed to contain a linearized FIDL message with valid pointers.
-    // This does not take ownership of that buffer region.
-    // But it does take ownership of the handles within the buffer.
-    DecodedMessage(BytePart bytes) :
-        bytes_(std::move(bytes)) { }
-
-    DecodedMessage(DecodedMessage&& other) = default;
-
-    DecodedMessage& operator=(DecodedMessage&& other) = default;
-
-    DecodedMessage(const DecodedMessage& other) = delete;
-
-    DecodedMessage& operator=(const DecodedMessage& other) = delete;
-
-    ~DecodedMessage() {
-        CloseHandles();
-    }
-
-    // Keeps track of a new buffer region with caller-managed memory.
-    // The buffer region is assumed to contain a linearized FIDL message with valid pointers.
-    // This does not take ownership of that buffer region.
-    // But it does take ownership of the handles within the buffer.
-    void Reset(BytePart bytes) {
-        CloseHandles();
-        bytes_ = std::move(bytes);
-    }
-
-    // Consumes an encoded message object containing FIDL encoded bytes and handles.
-    // The current buffer region in DecodedMessage is always released.
-    // Uses the FIDL encoding tables to deserialize the message in-place.
-    // If the message is invalid, discards the buffer and returns an error.
-    zx_status_t DecodeFrom(EncodedMessage<FidlType>* msg, const char** out_error_msg) {
-        // Clear any existing message.
-        CloseHandles();
-        bytes_ = BytePart();
-        zx_status_t status = fidl_decode(FidlType::type,
-                                         msg->bytes().data(), msg->bytes().actual(),
-                                         msg->handles().data(), msg->handles().actual(),
-                                         out_error_msg);
-        // Clear out |msg| independent of success or failure
-        BytePart bytes = msg->ReleaseBytesAndHandles();
-        if (status == ZX_OK) {
-            Reset(std::move(bytes));
-        } else {
-            Reset(BytePart());
-        }
-        return status;
-    }
-
-    // Serializes the content of the message in-place and stores the result
-    // in |out_msg|. The message's contents are always consumed by this
-    // operation, even in case of an error.
-    zx_status_t EncodeTo(EncodedMessage<FidlType>* out_msg, const char** out_error_msg) {
-        return out_msg->Initialize([this, &out_error_msg] (BytePart& msg_bytes,
-                                                           HandlePart& msg_handles) {
-            msg_bytes = std::move(bytes_);
-            uint32_t actual_handles = 0;
-            zx_status_t status = fidl_encode(FidlType::type,
-                                             msg_bytes.data(), msg_bytes.actual(),
-                                             msg_handles.data(), msg_handles.capacity(),
-                                             &actual_handles, out_error_msg);
-            msg_handles.set_actual(actual_handles);
-            return status;
-        });
-    }
-
-    // Accesses the FIDL message by reinterpreting the buffer pointer.
-    // Returns nullptr if there is no message.
-    FidlType* message() const {
-        return reinterpret_cast<FidlType*>(bytes_.data());
-    }
-
-private:
-    // Use the FIDL encoding tables for |FidlType| to walk the message and
-    // destroy the handles it contains.
-    void CloseHandles() {
-#ifdef __Fuchsia__
-        if (bytes_.data()) {
-            fidl_close_handles(FidlType::type, bytes_.data(), bytes_.actual(), nullptr);
-        }
-#endif
-    }
-
-    // The contents of the decoded message.
-    BytePart bytes_;
-};
-
-}  // namespace fidl
-
-#endif // LIB_FIDL_LLCPP_DECODED_MESSAGE_H_
diff --git a/pkg/fidl/include/lib/fidl/llcpp/encoded_message.h b/pkg/fidl/include/lib/fidl/llcpp/encoded_message.h
deleted file mode 100644
index 8fd1a06..0000000
--- a/pkg/fidl/include/lib/fidl/llcpp/encoded_message.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_LLCPP_ENCODED_MESSAGE_H_
-#define LIB_FIDL_LLCPP_ENCODED_MESSAGE_H_
-
-#include <algorithm>
-#include <cstdint>
-#include <iterator>
-#include <lib/fidl/cpp/message_part.h>
-#include <lib/fidl/llcpp/traits.h>
-#include <lib/fit/traits.h>
-#include <type_traits>
-#include <utility>
-#include <zircon/fidl.h>
-
-#ifdef __Fuchsia__
-#include <zircon/syscalls.h>
-#endif
-
-namespace fidl {
-
-// Holds an encoded FIDL message, that is, a byte array plus a handle table.
-//
-// The bytes part points to an external caller-managed buffer, while the handles part
-// is owned by this class. Any handles will be closed upon destruction.
-// This class is aware of the upper bound on the number of handles
-// in a message, such that its size can be adjusted to fit the demands
-// of a specific FIDL type.
-//
-// Because this class does not own the underlying message buffer, the caller
-// must make sure the lifetime of this class does not extend over that of the buffer.
-template <typename FidlType>
-class EncodedMessage final {
-    static_assert(IsFidlType<FidlType>::value, "Only FIDL types allowed here");
-    static_assert(FidlType::MaxSize > 0, "Positive message size");
-
-public:
-    // Instantiates an empty buffer with no bytes or handles.
-    EncodedMessage() = default;
-
-    EncodedMessage(EncodedMessage&& other) noexcept {
-        if (this != &other) {
-            MoveImpl(std::move(other));
-        }
-    }
-
-    EncodedMessage& operator=(EncodedMessage&& other) noexcept {
-        if (this != &other) {
-            MoveImpl(std::move(other));
-        }
-        return *this;
-    }
-
-    EncodedMessage(const EncodedMessage& other) = delete;
-
-    EncodedMessage& operator=(const EncodedMessage& other) = delete;
-
-    // Instantiates an EncodedMessage which points to a buffer region with caller-managed memory.
-    // It does not take ownership of that buffer region.
-    // Also initializes an empty handles part.
-    EncodedMessage(BytePart bytes) :
-        bytes_(std::move(bytes)) { }
-
-    ~EncodedMessage() {
-        CloseHandles();
-    }
-
-    // Takes ownership of the contents of the message.
-    // The bytes and handle parts will become empty, while the existing bytes part is returned.
-    // The caller is responsible for having transferred the handles elsewhere
-    // before calling this method.
-    BytePart ReleaseBytesAndHandles() {
-        handles_.set_actual(0);
-        BytePart return_bytes = std::move(bytes_);
-        return return_bytes;
-    }
-
-    const BytePart& bytes() const { return bytes_; }
-
-    const HandlePart& handles() const { return handles_; }
-
-    // Clears the contents of the EncodedMessage then invokes Callback
-    // to initialize the EncodedMessage in-place then returns the callback's
-    // result.
-    //
-    // |callback| is a callable object whose arguments are (BytePart&, HandlePart&).
-    template <typename Callback>
-    decltype(auto) Initialize(Callback callback) {
-        static_assert(
-            fit::callable_traits<Callback>::args::size == 2 &&
-            std::is_same<
-                BytePart&,
-                typename fit::template callable_traits<Callback>::args::template at<0>>::value &&
-            std::is_same<
-                HandlePart&,
-                typename fit::template callable_traits<Callback>::args::template at<1>>::value,
-            "Callback signature must be: T(BytePart&, HandlePart&).");
-        bytes_ = BytePart();
-        CloseHandles();
-        return callback(bytes_, handles_);
-    }
-
-private:
-    void CloseHandles() {
-        if (handles_.actual() > 0) {
-#ifdef __Fuchsia__
-            zx_handle_close_many(handles_.data(), handles_.actual());
-#else
-            // How did we have handles if not on Fuchsia? Something bad happened...
-            assert(false);
-#endif
-            handles_.set_actual(0);
-        }
-    }
-
-    void MoveImpl(EncodedMessage&& other) noexcept {
-        CloseHandles();
-        bytes_ = std::move(other.bytes_);
-        // copy handles from |other|
-        memcpy(handle_storage_, other.handle_storage_,
-            other.handles_.actual() * sizeof(zx_handle_t));
-        // release handles in |other|
-        handles_.set_actual(other.handles().actual());
-        other.handles_.set_actual(0);
-    }
-
-    BytePart bytes_;
-    zx_handle_t handle_storage_[FidlType::MaxNumHandles];
-    HandlePart handles_{handle_storage_, FidlType::MaxNumHandles};
-};
-
-}
-
-#endif  // LIB_FIDL_LLCPP_ENCODED_MESSAGE_H_
diff --git a/pkg/fidl/include/lib/fidl/llcpp/traits.h b/pkg/fidl/include/lib/fidl/llcpp/traits.h
deleted file mode 100644
index 80fadd7..0000000
--- a/pkg/fidl/include/lib/fidl/llcpp/traits.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_LLCPP_TRAITS_H_
-#define LIB_FIDL_LLCPP_TRAITS_H_
-
-#include <lib/zx/object.h>
-#include <stdint.h>
-#include <type_traits>
-#include <zircon/fidl.h>
-
-// Defines type traits used in the low-level C++ binding.
-//
-// The contracts of a FIDL type |T| are as follows:
-//
-// |IsFidlType<T>| resolves to std::true_type.
-// |IsFidlMessage<T>| resolves to std::true_type iff |T| is a transactional message.
-// |T::MaxNumHandles| is an uint32_t specifying the upper bound on the number of contained handles.
-// |T::MaxSize| is an uint32_t specifying the upper bound on the message byte size.
-//              It is std::numeric_limits<uint32_t>::max() if |T| is unbounded.
-// |T::type| is a fidl_type_t* pointing to the corresponding encoding table, if any.
-//
-
-namespace fidl {
-
-// A type trait that indicates whether the given type is a request/response type
-// i.e. has a FIDL message header.
-template <typename T> struct IsFidlMessage : public std::false_type {};
-
-// Code-gen will explicitly conform the generated FIDL transactional messages to IsFidlMessage.
-
-// A type trait that indicates whether the given type is allowed to appear in
-// generated binding APIs and can be encoded/decoded.
-// As a start, all handle types are supported.
-template <typename T> struct IsFidlType :
-    public std::is_base_of<zx::object_base, T> {};
-
-// clang-format off
-// Specialize for primitives
-template <> struct IsFidlType<bool> : public std::true_type {};
-template <> struct IsFidlType<uint8_t> : public std::true_type {};
-template <> struct IsFidlType<uint16_t> : public std::true_type {};
-template <> struct IsFidlType<uint32_t> : public std::true_type {};
-template <> struct IsFidlType<uint64_t> : public std::true_type {};
-template <> struct IsFidlType<int8_t> : public std::true_type {};
-template <> struct IsFidlType<int16_t> : public std::true_type {};
-template <> struct IsFidlType<int32_t> : public std::true_type {};
-template <> struct IsFidlType<int64_t> : public std::true_type {};
-template <> struct IsFidlType<float> : public std::true_type {};
-template <> struct IsFidlType<double> : public std::true_type {};
-// clang-format on
-
-// String
-class StringView;
-template <> struct IsFidlType<StringView> : public std::true_type {};
-
-// Vector (conditional on element)
-template <typename E> class VectorView;
-template <typename E>
-struct IsFidlType<VectorView<E>> : public IsFidlType<E> {};
-
-// Code-gen will explicitly conform the generated FIDL structures to IsFidlType.
-
-}  // namespace fidl
-
-#endif // LIB_FIDL_LLCPP_TRAITS_H_
diff --git a/pkg/fidl/include/lib/fidl/transport.h b/pkg/fidl/include/lib/fidl/transport.h
deleted file mode 100644
index 2da0d9c..0000000
--- a/pkg/fidl/include/lib/fidl/transport.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_TRANSPORT_H_
-#define LIB_FIDL_TRANSPORT_H_
-
-#include <zircon/compiler.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS
-
-// Writes |capacity| bytes from |buffer| to the control channel of |socket|.
-//
-// Blocks until |socket| is able to accept a control plane message.
-zx_status_t fidl_socket_write_control(zx_handle_t socket, const void* buffer,
-                                      size_t capacity);
-
-// Reads |capacity| bytes from the control channel of |socket| to |buffer|.
-//
-// Blocks until a control plane message is able to be read from |socket|.
-//
-// The actual number of bytes reads from the control plan is returned in
-// |out_actual|.
-zx_status_t fidl_socket_read_control(zx_handle_t socket, void* buffer,
-                                     size_t capacity, size_t* out_actual);
-
-// Issues a transaction on the control channel of |socket|.
-//
-// First, writes |capacity| bytes from |buffer| to the control channel of
-// |socket|. Second, reads |out_capacity| bytes from the control channel of
-// |socket| to |out_buffer|.
-//
-// Blocks until the transaction is complete.
-//
-// |buffer| and |out_buffer| may be aliased.
-//
-// The actual number of bytes reads from the control plan is returned in
-// |out_actual|.
-zx_status_t fidl_socket_call_control(zx_handle_t socket, const void* buffer,
-                                     size_t capacity, void* out_buffer,
-                                     size_t out_capacity, size_t* out_actual);
-
-__END_CDECLS
-
-#endif // LIB_FIDL_TRANSPORT_H_
diff --git a/pkg/fidl/message.cpp b/pkg/fidl/message.cpp
deleted file mode 100644
index 6857459..0000000
--- a/pkg/fidl/message.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// 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.
-
-#include <lib/fidl/cpp/message.h>
-
-#include <string.h>
-
-#include <lib/fidl/coding.h>
-#include <lib/fidl/cpp/builder.h>
-
-#ifdef __Fuchsia__
-#include <zircon/syscalls.h>
-#endif
-
-namespace fidl {
-
-Message::Message() = default;
-
-Message::Message(BytePart bytes, HandlePart handles)
-    : bytes_(static_cast<BytePart&&>(bytes)),
-      handles_(static_cast<HandlePart&&>(handles)) {}
-
-Message::~Message() {
-#ifdef __Fuchsia__
-    zx_handle_close_many(handles_.data(), handles_.actual());
-#endif
-    ClearHandlesUnsafe();
-}
-
-Message::Message(Message&& other)
-    : bytes_(static_cast<BytePart&&>(other.bytes_)),
-      handles_(static_cast<HandlePart&&>(other.handles_)) {}
-
-Message& Message::operator=(Message&& other) {
-    bytes_ = static_cast<BytePart&&>(other.bytes_);
-    handles_ = static_cast<HandlePart&&>(other.handles_);
-    return *this;
-}
-
-zx_status_t Message::Encode(const fidl_type_t* type,
-                            const char** error_msg_out) {
-    uint32_t actual_handles = 0u;
-    zx_status_t status = fidl_encode(type, bytes_.data(), bytes_.actual(),
-                                     handles_.data(), handles_.capacity(),
-                                     &actual_handles, error_msg_out);
-    if (status == ZX_OK)
-        handles_.set_actual(actual_handles);
-    return status;
-}
-
-zx_status_t Message::Decode(const fidl_type_t* type,
-                            const char** error_msg_out) {
-    zx_status_t status = fidl_decode(type, bytes_.data(), bytes_.actual(),
-                                     handles_.data(), handles_.actual(),
-                                     error_msg_out);
-    ClearHandlesUnsafe();
-    return status;
-}
-
-zx_status_t Message::Validate(const fidl_type_t* type,
-                              const char** error_msg_out) const {
-    return fidl_validate(type, bytes_.data(), bytes_.actual(),
-                         handles_.actual(), error_msg_out);
-}
-
-#ifdef __Fuchsia__
-zx_status_t Message::Read(zx_handle_t channel, uint32_t flags) {
-    uint32_t actual_bytes = 0u;
-    uint32_t actual_handles = 0u;
-    zx_status_t status = zx_channel_read(
-        channel, flags, bytes_.data(), handles_.data(), bytes_.capacity(),
-        handles_.capacity(), &actual_bytes, &actual_handles);
-    if (status == ZX_OK) {
-        bytes_.set_actual(actual_bytes);
-        handles_.set_actual(actual_handles);
-    }
-    return status;
-}
-
-zx_status_t Message::Write(zx_handle_t channel, uint32_t flags) {
-    zx_status_t status = zx_channel_write(channel, flags, bytes_.data(),
-                                          bytes_.actual(), handles_.data(),
-                                          handles_.actual());
-    ClearHandlesUnsafe();
-    return status;
-}
-
-zx_status_t Message::Call(zx_handle_t channel, uint32_t flags,
-                          zx_time_t deadline, Message* response) {
-    zx_channel_call_args_t args;
-    args.wr_bytes = bytes_.data();
-    args.wr_handles = handles_.data();
-    args.rd_bytes = response->bytes_.data();
-    args.rd_handles = response->handles_.data();
-    args.wr_num_bytes = bytes_.actual();
-    args.wr_num_handles = handles_.actual();
-    args.rd_num_bytes = response->bytes_.capacity();
-    args.rd_num_handles = response->handles_.capacity();
-    uint32_t actual_bytes = 0u;
-    uint32_t actual_handles = 0u;
-    zx_status_t status = zx_channel_call(channel, flags, deadline, &args,
-                                         &actual_bytes, &actual_handles);
-    ClearHandlesUnsafe();
-    if (status == ZX_OK) {
-        response->bytes_.set_actual(actual_bytes);
-        response->handles_.set_actual(actual_handles);
-    }
-    return status;
-}
-#endif
-
-void Message::ClearHandlesUnsafe() {
-    handles_.set_actual(0u);
-}
-
-} // namespace fidl
diff --git a/pkg/fidl/message_buffer.cpp b/pkg/fidl/message_buffer.cpp
deleted file mode 100644
index 54e2346..0000000
--- a/pkg/fidl/message_buffer.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// 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.
-
-#include <lib/fidl/cpp/message_buffer.h>
-#include <zircon/assert.h>
-
-#include <stdlib.h>
-
-namespace fidl {
-namespace {
-
-uint64_t AddPadding(uint32_t offset) {
-    constexpr uint32_t kMask = alignof(zx_handle_t) - 1;
-    // Cast before addition to avoid overflow.
-    return static_cast<uint64_t>(offset) + static_cast<uint64_t>(offset & kMask);
-}
-
-size_t GetAllocSize(uint32_t bytes_capacity, uint32_t handles_capacity) {
-    return AddPadding(bytes_capacity) + sizeof(zx_handle_t) * handles_capacity;
-}
-
-} // namespace
-
-MessageBuffer::MessageBuffer(uint32_t bytes_capacity,
-                             uint32_t handles_capacity)
-    : buffer_(static_cast<uint8_t*>(malloc(GetAllocSize(bytes_capacity, handles_capacity)))),
-      bytes_capacity_(bytes_capacity),
-      handles_capacity_(handles_capacity) {
-    ZX_ASSERT_MSG(buffer_, "malloc returned NULL in MessageBuffer::MessageBuffer()");
-}
-
-MessageBuffer::~MessageBuffer() {
-    free(buffer_);
-}
-
-zx_handle_t* MessageBuffer::handles() const {
-    return reinterpret_cast<zx_handle_t*>(buffer_ + AddPadding(bytes_capacity_));
-}
-
-Message MessageBuffer::CreateEmptyMessage() {
-    return Message(BytePart(bytes(), bytes_capacity()),
-                   HandlePart(handles(), handles_capacity()));
-}
-
-Builder MessageBuffer::CreateBuilder() {
-    return Builder(bytes(), bytes_capacity());
-}
-
-} // namespace fidl
diff --git a/pkg/fidl/message_builder.cpp b/pkg/fidl/message_builder.cpp
deleted file mode 100644
index c178690..0000000
--- a/pkg/fidl/message_builder.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.
-
-#include <lib/fidl/cpp/message_builder.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-namespace fidl {
-
-MessageBuilder::MessageBuilder(const fidl_type_t* type,
-                               uint32_t bytes_capacity,
-                               uint32_t handles_capacity)
-    : type_(type),
-      buffer_(bytes_capacity, handles_capacity) {
-    Reset();
-}
-
-MessageBuilder::~MessageBuilder() = default;
-
-zx_status_t MessageBuilder::Encode(Message* message_out,
-                                   const char** error_msg_out) {
-    *message_out = Message(Finalize(),
-                           HandlePart(buffer_.handles(),
-                                      buffer_.handles_capacity()));
-    return message_out->Encode(type_, error_msg_out);
-}
-
-void MessageBuilder::Reset() {
-    Builder::Reset(buffer_.bytes(), buffer_.bytes_capacity());
-    New<fidl_message_header_t>();
-}
-
-} // namespace fidl
diff --git a/pkg/fidl/meta.json b/pkg/fidl/meta.json
deleted file mode 100644
index be54c7d..0000000
--- a/pkg/fidl/meta.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "banjo_deps": [], 
-  "deps": [], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/fidl/buffer_walker.h", 
-    "pkg/fidl/builder.cpp", 
-    "pkg/fidl/decoding.cpp", 
-    "pkg/fidl/encoding.cpp", 
-    "pkg/fidl/epitaph.c", 
-    "pkg/fidl/formatting.cpp", 
-    "pkg/fidl/handle_closing.cpp", 
-    "pkg/fidl/message.cpp", 
-    "pkg/fidl/message_buffer.cpp", 
-    "pkg/fidl/message_builder.cpp", 
-    "pkg/fidl/transport.cpp", 
-    "pkg/fidl/validating.cpp", 
-    "pkg/fidl/include/lib/fidl/coding.h", 
-    "pkg/fidl/include/lib/fidl/cpp/builder.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_buffer.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_builder.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_part.h", 
-    "pkg/fidl/include/lib/fidl/cpp/string_view.h", 
-    "pkg/fidl/include/lib/fidl/cpp/vector_view.h", 
-    "pkg/fidl/include/lib/fidl/epitaph.h", 
-    "pkg/fidl/include/lib/fidl/internal.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/decoded_message.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/encoded_message.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/traits.h", 
-    "pkg/fidl/include/lib/fidl/transport.h"
-  ], 
-  "headers": [
-    "pkg/fidl/include/lib/fidl/coding.h", 
-    "pkg/fidl/include/lib/fidl/cpp/builder.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_buffer.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_builder.h", 
-    "pkg/fidl/include/lib/fidl/cpp/message_part.h", 
-    "pkg/fidl/include/lib/fidl/cpp/string_view.h", 
-    "pkg/fidl/include/lib/fidl/cpp/vector_view.h", 
-    "pkg/fidl/include/lib/fidl/epitaph.h", 
-    "pkg/fidl/include/lib/fidl/internal.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/decoded_message.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/encoded_message.h", 
-    "pkg/fidl/include/lib/fidl/llcpp/traits.h", 
-    "pkg/fidl/include/lib/fidl/transport.h"
-  ], 
-  "include_dir": "pkg/fidl/include", 
-  "name": "fidl", 
-  "root": "pkg/fidl", 
-  "sources": [
-    "pkg/fidl/buffer_walker.h", 
-    "pkg/fidl/builder.cpp", 
-    "pkg/fidl/decoding.cpp", 
-    "pkg/fidl/encoding.cpp", 
-    "pkg/fidl/epitaph.c", 
-    "pkg/fidl/formatting.cpp", 
-    "pkg/fidl/handle_closing.cpp", 
-    "pkg/fidl/message.cpp", 
-    "pkg/fidl/message_buffer.cpp", 
-    "pkg/fidl/message_builder.cpp", 
-    "pkg/fidl/transport.cpp", 
-    "pkg/fidl/validating.cpp"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/fidl/transport.cpp b/pkg/fidl/transport.cpp
deleted file mode 100644
index 253b5ec..0000000
--- a/pkg/fidl/transport.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// 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.
-
-#ifdef __Fuchsia__
-
-#include <lib/fidl/transport.h>
-#include <zircon/assert.h>
-#include <zircon/syscalls.h>
-
-zx_status_t fidl_socket_write_control(zx_handle_t socket, const void* buffer,
-                                      size_t capacity) {
-    for (;;) {
-        zx_status_t status = zx_socket_write(socket, ZX_SOCKET_CONTROL, buffer,
-                                             capacity, nullptr);
-        if (status != ZX_ERR_SHOULD_WAIT) {
-            return status;
-        }
-
-        zx_signals_t observed = ZX_SIGNAL_NONE;
-        status = zx_object_wait_one(socket, ZX_SOCKET_CONTROL_WRITABLE | ZX_SOCKET_PEER_CLOSED,
-                                    ZX_TIME_INFINITE, &observed);
-        if (status != ZX_OK) {
-            return status;
-        }
-
-        if (observed & ZX_SOCKET_PEER_CLOSED) {
-            return ZX_ERR_PEER_CLOSED;
-        }
-
-        ZX_ASSERT(observed & ZX_SOCKET_CONTROL_WRITABLE);
-    }
-}
-
-zx_status_t fidl_socket_read_control(zx_handle_t socket, void* buffer,
-                                     size_t capacity, size_t* out_actual) {
-    for (;;) {
-        zx_status_t status = zx_socket_read(socket, ZX_SOCKET_CONTROL, buffer,
-                                            capacity, out_actual);
-        if (status != ZX_ERR_SHOULD_WAIT) {
-            return status;
-        }
-
-        zx_signals_t observed = ZX_SIGNAL_NONE;
-        status = zx_object_wait_one(socket, ZX_SOCKET_CONTROL_READABLE | ZX_SOCKET_PEER_CLOSED,
-                                    ZX_TIME_INFINITE, &observed);
-        if (status != ZX_OK) {
-            return status;
-        }
-
-        if (observed & ZX_SOCKET_CONTROL_READABLE) {
-            continue;
-        }
-
-        ZX_ASSERT(observed & ZX_SOCKET_PEER_CLOSED);
-        return ZX_ERR_PEER_CLOSED;
-    }
-}
-
-zx_status_t fidl_socket_call_control(zx_handle_t socket, const void* buffer,
-                                     size_t capacity, void* out_buffer,
-                                     size_t out_capacity, size_t* out_actual) {
-    zx_status_t status = fidl_socket_write_control(socket, buffer, capacity);
-    if (status != ZX_OK) {
-        return status;
-    }
-    return fidl_socket_read_control(socket, out_buffer, out_capacity, out_actual);
-}
-
-#endif
diff --git a/pkg/fidl/validating.cpp b/pkg/fidl/validating.cpp
deleted file mode 100644
index 342face..0000000
--- a/pkg/fidl/validating.cpp
+++ /dev/null
@@ -1,90 +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.
-
-#include <lib/fidl/coding.h>
-
-#include <stdalign.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <lib/fidl/internal.h>
-#include <zircon/assert.h>
-#include <zircon/compiler.h>
-
-#include "buffer_walker.h"
-
-// TODO(kulakowski) Design zx_status_t error values.
-
-namespace {
-
-class FidlValidator final : public fidl::internal::BufferWalker<FidlValidator, false, false> {
-    typedef fidl::internal::BufferWalker<FidlValidator, false, false> Super;
-
-public:
-    FidlValidator(const fidl_type_t* type, const void* bytes, uint32_t num_bytes,
-                  uint32_t num_handles, const char** out_error_msg)
-        : Super(type), bytes_(static_cast<const uint8_t*>(bytes)), num_bytes_(num_bytes),
-          num_handles_(num_handles), out_error_msg_(out_error_msg) {}
-
-    void Walk() {
-        Super::Walk();
-        if (status_ == ZX_OK && handle_idx() != num_handles()) {
-            SetError("message did not contain the specified number of handles");
-            return;
-        }
-    }
-
-    const uint8_t* bytes() const { return bytes_; }
-    uint32_t num_bytes() const { return num_bytes_; }
-    uint32_t num_handles() const { return num_handles_; }
-
-    bool ValidateOutOfLineStorageClaim(const void* a, const void* b) {
-        return true;
-    }
-
-    void UnclaimedHandle(const zx_handle_t* out_handle) {}
-    void ClaimedHandle(const zx_handle_t* out_handle, uint32_t idx) {}
-
-    template <class T>
-    void UpdatePointer(const T* const* p, const T* v) {}
-
-    PointerState GetPointerState(const void* ptr) const {
-        return static_cast<PointerState>(*static_cast<const uintptr_t*>(ptr));
-    }
-    HandleState GetHandleState(zx_handle_t p) const {
-        return static_cast<HandleState>(p);
-    }
-
-    void SetError(const char* error_msg) {
-        status_ = ZX_ERR_INVALID_ARGS;
-        if (out_error_msg_ != nullptr) {
-            *out_error_msg_ = error_msg;
-        }
-    }
-
-    zx_status_t status() const { return status_; }
-
-private:
-    // Message state passed in to the constructor.
-    const uint8_t* const bytes_;
-    const uint32_t num_bytes_;
-    const uint32_t num_handles_;
-    const char** const out_error_msg_;
-    zx_status_t status_ = ZX_OK;
-};
-
-} // namespace
-
-zx_status_t fidl_validate(const fidl_type_t* type, const void* bytes, uint32_t num_bytes,
-                          uint32_t num_handles, const char** out_error_msg) {
-    FidlValidator validator(type, bytes, num_bytes, num_handles, out_error_msg);
-    validator.Walk();
-    return validator.status();
-}
-
-zx_status_t fidl_validate_msg(const fidl_type_t* type, const fidl_msg_t* msg,
-                              const char** out_error_msg) {
-    return fidl_validate(type, msg->bytes, msg->num_bytes, msg->num_handles,
-                         out_error_msg);
-}
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/binding.h b/pkg/fidl_cpp/include/lib/fidl/cpp/binding.h
deleted file mode 100644
index 05c0637..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/binding.h
+++ /dev/null
@@ -1,239 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_BINDING_H_
-#define LIB_FIDL_CPP_BINDING_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/fit/function.h>
-#include <lib/zx/channel.h>
-#include <zircon/assert.h>
-
-#include <memory>
-#include <utility>
-
-#include "lib/fidl/cpp/interface_handle.h"
-#include "lib/fidl/cpp/interface_ptr.h"
-#include "lib/fidl/cpp/interface_request.h"
-#include "lib/fidl/cpp/internal/stub_controller.h"
-
-namespace fidl {
-
-// Binds the implementation of |Interface| to a channel.
-//
-// The |Binding| listens for incoming messages on the channel, decodes them, and
-// calls the appropriate method on the bound implementation. If the message
-// expects a reply, the |Binding| creates callbacks that encode and send
-// reply messages when called.
-//
-// When the |Binding| object is destroyed, the binding between the channel
-// and the interface is torn down and the channel is closed, leaving the
-// |Binding| in an unbound state.
-//
-// The implementation pointer type of the binding is also parameterized,
-// allowing the use of smart pointer types such as |std::unique_ptr| to
-// reference the implementation.
-//
-// Example:
-//
-//   #include "foo.fidl.h"
-//
-//   class FooImpl : public Foo {
-//    public:
-//     explicit FooImpl(InterfaceRequest<Foo> request)
-//         : binding_(this, std::move(request)) {}
-//
-//     // Foo implementation here.
-//
-//    private:
-//     Binding<Foo> binding_;
-//   };
-//
-// After the |Binding| has been bound to an implementation, the implementation
-// will receive methods calls from the remote endpoint of the channel on the
-// async_t on which the |InterfaceRequest| was bound. By default this is the
-// thread on which the binding occurred.
-//
-// See also:
-//
-//  * |InterfacePtr|, which is the client analog of a |Binding|.
-template <typename Interface, typename ImplPtr = Interface*>
-class Binding {
- public:
-  // Constructs an incomplete binding that will use the implementation |impl|.
-  //
-  // The binding may be completed with a subsequent call to the |Bind| method.
-  // Does not take ownership of |impl|, which must outlive the binding.
-  explicit Binding(ImplPtr impl)
-      : impl_(std::forward<ImplPtr>(impl)), stub_(&*this->impl()) {
-    controller_.set_stub(&stub_);
-    stub_.set_controller(&controller_);
-  }
-
-  // Constructs a completed binding of |channel| to implementation |impl|.
-  //
-  // Does not take ownership of |impl|, which must outlive the binding.
-  //
-  // If the |Binding| cannot be bound to the given |channel| (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|), the |Binding| will be constructed
-  // in an unbound state.
-  //
-  // Uses the given async_dispatcher_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|.  If |dispatcher| is null, the current thread must
-  // have a default async_dispatcher_t.
-  Binding(ImplPtr impl, zx::channel channel,
-          async_dispatcher_t* dispatcher = nullptr)
-      : Binding(std::forward<ImplPtr>(impl)) {
-    Bind(std::move(channel), dispatcher);
-  }
-
-  // Constructs a completed binding of |impl| to the channel in |request|.
-  //
-  // Does not take ownership of |impl|, which must outlive the binding.
-  //
-  // If the |Binding| cannot be bound to the given |channel| (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|), the |Binding| will be constructed
-  // in an unbound state.
-  //
-  // Uses the given async_dispatcher_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|.  If |dispatcher| is null, the current thread must
-  // have a default async_dispatcher_t.
-  Binding(ImplPtr impl, InterfaceRequest<Interface> request,
-          async_dispatcher_t* dispatcher = nullptr)
-      : Binding(std::forward<ImplPtr>(impl)) {
-    Bind(request.TakeChannel(), dispatcher);
-  }
-
-  Binding(const Binding&) = delete;
-  Binding& operator=(const Binding&) = delete;
-
-  // Completes a binding by creating a new channel, binding one endpoint to
-  // the previously specified implementation and returning the other endpoint.
-  //
-  // If |NewBinding| fails to create the underlying channel, the returned
-  // |InterfaceHandle| will return false from |is_valid()|.
-  //
-  // Uses the given async_dispatcher_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|.  If |dispatcher| is null, the current thread must
-  // have a default async_dispatcher_t.
-  InterfaceHandle<Interface> NewBinding(
-      async_dispatcher_t* dispatcher = nullptr) {
-    InterfaceHandle<Interface> client;
-    Bind(client.NewRequest().TakeChannel(), dispatcher);
-    return client;
-  }
-
-  // Binds the previously specified implementation to the given |channel|.
-  //
-  // If the |Binding| was prevously bound to another channel, that channel is
-  // closed.
-  //
-  // Uses the given async_dispatcher_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|.  If |dispatcher| is null, the current thread must
-  // have a default async_dispatcher_t.
-  //
-  // Returns an error if the binding was not able to be created (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|).
-  zx_status_t Bind(zx::channel channel,
-                   async_dispatcher_t* dispatcher = nullptr) {
-    return controller_.reader().Bind(std::move(channel), dispatcher);
-  }
-
-  // Binds the previously specified implementation to the given
-  // |InterfaceRequest|.
-  //
-  // If the |Binding| was prevously bound to another channel, that channel is
-  // closed.
-  //
-  // Uses the given async_dispatcher_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|.  If |dispatcher| is null, the current thread must
-  // have a default async_dispatcher_t.
-  //
-  // Returns an error if the binding was not able to be created (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|).
-  zx_status_t Bind(InterfaceRequest<Interface> request,
-                   async_dispatcher_t* dispatcher = nullptr) {
-    return Bind(request.TakeChannel(), dispatcher);
-  }
-
-  // Unbinds the underlying channel from this binding and returns it so it can
-  // be used in another context, such as on another thread or with a different
-  // implementation.
-  //
-  // After this function returns, the |Binding| is ready to be bound to another
-  // channel.
-  InterfaceRequest<Interface> Unbind() {
-    return InterfaceRequest<Interface>(controller_.reader().Unbind());
-  }
-
-  // Sends an Epitaph over the bound channel corresponding to the error passed
-  // as a parameter, closes the channel, and unbinds it.  An Epitaph is the last
-  // message sent over a channel before a close operation; for the purposes of
-  // this function, it can be thought of as a return code.  See the FIDL
-  // language spec for more information about Epitaphs.
-  //
-  // The return value can be any of the return values of zx_channel_write.
-  zx_status_t Close(zx_status_t epitaph_value) {
-    return controller_.reader().Close(epitaph_value);
-  }
-
-  // Blocks the calling thread until either a message arrives on the previously
-  // bound channel or an error occurs.
-  //
-  // Returns an error if waiting for the message, reading the message, or
-  // processing the message fails. If the error results in the channel being
-  // closed, the error handler will be called synchronously before this
-  // method returns.
-  //
-  // This method can be called only if this |Binding| is currently bound to a
-  // channel.
-  zx_status_t WaitForMessage() {
-    return controller_.reader().WaitAndDispatchOneMessageUntil(
-        zx::time::infinite());
-  }
-
-  // Sets an error handler that will be called if an error causes the underlying
-  // channel to be closed.
-  //
-  // If the error is being reported because an error occurred on the local side
-  // of the channel, the zx_status_t of that error will be passed as the
-  // parameter to the handler.
-  //
-  // If an Epitaph was present on the channel, its error value will be passed as
-  // the parameter.  See the FIDL language specification for more detail on
-  // Epitaphs.
-  //
-  // For example, the error handler will be called if the remote side of the
-  // channel sends an invalid message. When the error handler is called, the
-  // |Binding| will no longer be bound to the channel.
-  void set_error_handler(fit::function<void(zx_status_t)> error_handler) {
-    controller_.reader().set_error_handler(std::move(error_handler));
-  }
-
-  // The implementation used by this |Binding| to process incoming messages.
-  const ImplPtr& impl() const { return impl_; }
-
-  // The interface for sending events back to the client.
-  typename Interface::EventSender_& events() { return stub_; }
-
-  // Whether this |Binding| is currently listening to a channel.
-  bool is_bound() const { return controller_.reader().is_bound(); }
-
-  // The underlying channel.
-  const zx::channel& channel() const { return controller_.reader().channel(); }
-
- private:
-  const ImplPtr impl_;
-  typename Interface::Stub_ stub_;
-  internal::StubController controller_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_BINDING_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/binding_set.h b/pkg/fidl_cpp/include/lib/fidl/cpp/binding_set.h
deleted file mode 100644
index c505344..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/binding_set.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_BINDING_SET_H_
-#define LIB_FIDL_CPP_BINDING_SET_H_
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <lib/fit/function.h>
-
-#include "lib/fidl/cpp/binding.h"
-
-namespace fidl {
-
-// Manages a set of bindings to implementations owned by the bound channels.
-//
-// The implementation pointer type of the binding is also parameterized,
-// allowing the use of smart pointer types such as |std::unique_ptr<>| to
-// reference the implementation.
-//
-// See also:
-//
-//  * |InterfacePtrSet|, which is the client analog of |BindingSet|.
-template <typename Interface, typename ImplPtr = Interface*>
-class BindingSet {
- public:
-  using Binding = ::fidl::Binding<Interface, ImplPtr>;
-  using StorageType = std::vector<std::unique_ptr<Binding>>;
-
-  using iterator = typename StorageType::iterator;
-
-  BindingSet() = default;
-
-  BindingSet(const BindingSet&) = delete;
-  BindingSet& operator=(const BindingSet&) = delete;
-
-  // Adds a binding to the set.
-  //
-  // The given |ImplPtr| is bound to the channel underlying the
-  // |InterfaceRequest|. The binding is removed (and the |~ImplPtr| called)
-  // when the created binding has an error (e.g., if the remote endpoint of
-  // the channel sends an invalid message).
-  //
-  // Whether this method takes ownership of |impl| depends on |ImplPtr|. If
-  // |ImplPtr| is a raw pointer, then this method does not take ownership of
-  // |impl|. If |ImplPtr| is a |unique_ptr|, then running |~ImplPtr| when the
-  // binding generates an error will delete |impl| because |~ImplPtr| is
-  // |~unique_ptr|, which deletes |impl|.
-  void AddBinding(ImplPtr impl, InterfaceRequest<Interface> request,
-                  async_dispatcher_t* dispatcher = nullptr) {
-    bindings_.push_back(std::make_unique<Binding>(
-        std::forward<ImplPtr>(impl), std::move(request), dispatcher));
-    auto* binding = bindings_.back().get();
-    // Set the connection error handler for the newly added Binding to be a
-    // function that will erase it from the vector.
-    binding->set_error_handler([binding, this](zx_status_t status) {
-      this->RemoveOnError(binding);
-    });
-  }
-
-  // Adds a binding to the set for the given implementation.
-  //
-  // Creates a channel for the binding and returns the client endpoint of
-  // the channel as an |InterfaceHandle|. If |AddBinding| fails to create the
-  // underlying channel, the returned |InterfaceHandle| will return false from
-  // |is_valid()|.
-  //
-  // The given |ImplPtr| is bound to the newly created channel. The binding is
-  // removed (and the |~ImplPtr| called) when the created binding has an error
-  // (e.g., if the remote endpoint of the channel sends an invalid message).
-  //
-  // Whether this method takes ownership of |impl| depends on |ImplPtr|. If
-  // |ImplPtr| is a raw pointer, then this method does not take ownership of
-  // |impl|. If |ImplPtr| is a |unique_ptr|, then running |~ImplPtr| when the
-  // binding generates an error will delete |impl| because |~ImplPtr| is
-  // |~unique_ptr|, which deletes |impl|.
-  InterfaceHandle<Interface> AddBinding(
-      ImplPtr impl, async_dispatcher_t* dispatcher = nullptr) {
-    InterfaceHandle<Interface> handle;
-    InterfaceRequest<Interface> request = handle.NewRequest();
-    if (!request)
-      return nullptr;
-    AddBinding(std::forward<ImplPtr>(impl), std::move(request), dispatcher);
-    return handle;
-  }
-
-  // Returns an InterfaceRequestHandler that binds the incoming
-  // InterfaceRequests this object.
-  InterfaceRequestHandler<Interface> GetHandler(
-      ImplPtr impl, async_dispatcher_t* dispatcher = nullptr) {
-    return [this, impl, dispatcher](InterfaceRequest<Interface> request) {
-      AddBinding(impl, std::move(request), dispatcher);
-    };
-  }
-
-  // Removes all the bindings from the set.
-  //
-  // Closes all the channels associated with this |BindingSet|.
-  // Bindings are destroyed AFTER it is removed from the bindings set. An
-  // example of when this is useful is if an error handler on a binding has
-  // some behavior where it needs to read from the binding set; the set would
-  // then properly reflect that the binding is not present in the set.
-  void CloseAll() {
-    auto bindings_local = std::move(bindings_);
-    bindings_.clear();
-  }
-
-  // The number of bindings in this |BindingSet|.
-  size_t size() const { return bindings_.size(); }
-
-  // Called when the last binding has been removed from this |BindingSet|.
-  //
-  // This function is not called by |CloseAll| or by |~BindingSet|.
-  void set_empty_set_handler(fit::closure empty_set_handler) {
-    empty_set_handler_ = std::move(empty_set_handler);
-  }
-
-  // The bindings stored in this set.
-  //
-  // This collection of bindings can be invalidated when a |Binding| in the
-  // set encounters a connection error because connection errors causes the
-  // |BindingSet| to remove the |Binding| from the set.
-  const StorageType& bindings() const { return bindings_; }
-
- private:
-  // Called when a binding has an error to remove the binding from the set.
-  void RemoveOnError(Binding* binding) {
-    auto it = std::find_if(bindings_.begin(), bindings_.end(),
-                           [binding](const std::unique_ptr<Binding>& b) {
-                             return b.get() == binding;
-                           });
-    ZX_DEBUG_ASSERT(it != bindings_.end());
-
-    {
-      // Move ownership of binding out of storage, such that the binding is
-      // destroyed AFTER it is removed from the bindings.
-      auto binding_local = std::move(*it);
-      binding_local->set_error_handler(nullptr);
-      bindings_.erase(it);
-    }
-
-    if (bindings_.empty() && empty_set_handler_)
-      empty_set_handler_();
-  }
-
-  StorageType bindings_;
-  fit::closure empty_set_handler_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_BINDING_SET_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/enum.h b/pkg/fidl_cpp/include/lib/fidl/cpp/enum.h
deleted file mode 100644
index 19ec1eb..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/enum.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_ENUM_H_
-#define LIB_FIDL_CPP_ENUM_H_
-
-#include <type_traits>
-
-namespace fidl {
-
-// Converts an enum value to its underlying type.
-template <typename TEnum>
-constexpr auto ToUnderlying(TEnum value) ->
-    typename std::underlying_type<TEnum>::type {
-  return static_cast<typename std::underlying_type<TEnum>::type>(value);
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_ENUM_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr.h b/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr.h
deleted file mode 100644
index e1af79a..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr.h
+++ /dev/null
@@ -1,305 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERFACE_PTR_H_
-#define LIB_FIDL_CPP_INTERFACE_PTR_H_
-
-#include <algorithm>
-#include <cstddef>
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/zx/channel.h>
-#include <zircon/assert.h>
-
-#include "lib/fidl/cpp/interface_handle.h"
-#include "lib/fidl/cpp/interface_request.h"
-#include "lib/fidl/cpp/internal/proxy_controller.h"
-
-namespace fidl {
-
-// A client interface to a remote implementation of |Interface|.
-//
-// An |InterfacePtr| implements |Interface| by proxying calls through a
-// |channel| to a remote implementation of |Interface|. Method calls on the
-// |Interface| proxy are encoded and sent through the bound channel to the
-// remote endpoint, which processes them. If the remote endpoint has not yet
-// been bound to an implementation, messages sent on the channel are buffered
-// by the channel, allowing for *pipelined* operation.
-//
-// The |InterfacePtr| also keeps state about the connection and about
-// outstanding request transactions that are expecting replies. When a the
-// |InterfacePtr| receives a reply to an outstanding transaction, the
-// |InterfacePtr| decodes the reply and calls the appropriate callback on the
-// thread on which the |InterfacePtr| was bound.
-//
-// You need to bind the |InterfacePtr| before calling any |Interface| methods.
-// There are a number of ways to bind the |InterfacePtr|.  See |NewRequest|,
-// |Bind|, and the |Bind| method on |InterfaceHandle|.
-//
-// If the underlying channel experiences an error, the |InterfacePtr| will
-// unbind from the channel and call its error handler.
-//
-// This class is thread-hostile, as is the local proxy it manages. All calls to
-// this class or the proxy should be from the thread on which the
-// |InterfacePtr| was bound. If you need to move the proxy to a different
-// thread, extract the |InterfaceHandle| by calling |Unbind|, and pass the
-// |InterfaceHandle| to a different thread, which the |InterfaceHandle| can be
-// bound to an |InterfacePtr| again. This operation destroys the state about
-// outstanding request transactions that are expecting replies.
-//
-// See also:
-//
-//  * |Binding|, which is the server analog of an |InterfacePtr|.
-//  * |SynchronousInterfacePtr|, which is a synchronous client interface to a
-//    remote implementation.
-template <typename Interface>
-class InterfacePtr {
- public:
-  using Proxy = typename Interface::Proxy_;
-
-  // Creates an unbound |InterfacePtr|.
-  InterfacePtr() : impl_(new Impl) {}
-  InterfacePtr(std::nullptr_t) : InterfacePtr() {}
-
-  InterfacePtr(const InterfacePtr& other) = delete;
-  InterfacePtr& operator=(const InterfacePtr& other) = delete;
-
-  InterfacePtr(InterfacePtr&& other) : impl_(std::move(other.impl_)) {
-    other.impl_.reset(new Impl);
-  }
-
-  InterfacePtr& operator=(InterfacePtr&& other) {
-    if (this != &other) {
-      impl_ = std::move(other.impl_);
-      other.impl_.reset(new Impl);
-    }
-    return *this;
-  }
-
-  // Bind the |InterfacePtr| to one endpoint of a newly created channel and
-  // return the other endpoint as an |InterfaceRequest|.
-  //
-  // Typically, the returned |InterfaceRequest| will be sent to a remote process
-  // to be bound to an implementation of |Interface| using a |Binding| object.
-  //
-  // After calling this method, clients can start calling methods on this
-  // |InterfacePtr|. The methods will write messages into the underlying
-  // channel created by |NewRequest|, where they will be buffered by the
-  // underlying channel until the |InterfaceRequest| is bound to an
-  // implementation of |Interface|, potentially in a remote process.
-  //
-  // Uses the given async_t (e.g., a message loop) in order to read messages
-  // from the channel and to monitor the channel for |ZX_CHANNEL_PEER_CLOSED|.
-  // If |dispatcher| is null, the current thread must have a default async_t.
-  //
-  // # Example
-  //
-  // Given the following interface:
-  //
-  //   interface Database {
-  //     OpenTable(request<Table> table);
-  //   };
-  //
-  // The client can use the |NewRequest| method to create the |InterfaceRequest|
-  // object needed by the |OpenTable| method:
-  //
-  //   DatabasePtr database = ...;  // Connect to database.
-  //   TablePtr table;
-  //   database->OpenTable(table.NewRequest());
-  //
-  // The client can call methods on |table| immediately.
-  InterfaceRequest<Interface> NewRequest(
-      async_dispatcher_t* dispatcher = nullptr) {
-    zx::channel h1;
-    zx::channel h2;
-    if (zx::channel::create(0, &h1, &h2) != ZX_OK ||
-        Bind(std::move(h1), dispatcher) != ZX_OK)
-      return nullptr;
-    return InterfaceRequest<Interface>(std::move(h2));
-  }
-
-  // Binds the |InterfacePtr| to the given |channel|.
-  //
-  // The |InterfacePtr| expects the remote end of the |channel| to speak the
-  // protocol defined by |Interface|. Unlike the |Bind| overload that takes a
-  // |InterfaceHandle| parameter, this |Bind| overload lacks type safety.
-  //
-  // If the |InterfacePtr| was prevously bound to another channel, that channel
-  // is closed. If the |channel| is invalid, then this method will effectively
-  // unbind the |InterfacePtr|. A more direct way to have that effect is to call
-  // |Unbind|.
-  //
-  // Uses the given async_t (e.g., a message loop) in order to read messages
-  // from the channel and to monitor the channel for |ZX_CHANNEL_PEER_CLOSED|.
-  // If |dispatcher| is null, the current thread must have a default async_t.
-  //
-  // Returns an error if the binding was not able to be created (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|).
-  zx_status_t Bind(zx::channel channel,
-                   async_dispatcher_t* dispatcher = nullptr) {
-    return impl_->controller.reader().Bind(std::move(channel), dispatcher);
-  }
-
-  // Binds the |InterfacePtr| to the given |InterfaceHandle|.
-  //
-  // The |InterfacePtr| expects the remote end of the |channel| to speak the
-  // protocol defined by |Interface|. Unlike the |Bind| overload that takes a
-  // |channel| parameter, this |Bind| overload provides type safety.
-  //
-  // If the |InterfacePtr| was prevously bound to another channel, that channel
-  // is closed. If the |InterfaceHandle| is invalid, then this method will
-  // effectively unbind the |InterfacePtr|. A more direct way to have that
-  // effect is to call |Unbind|.
-  //
-  // Uses the given async_t (e.g., a message loop) in order to read messages
-  // from the channel and to monitor the channel for |ZX_CHANNEL_PEER_CLOSED|.
-  // If |dispatcher| is null, the current thread must have a default async_t.
-  //
-  // Returns an error if the binding was not able to be created (e.g., because
-  // the |channel| lacks |ZX_RIGHT_WAIT|).
-  zx_status_t Bind(InterfaceHandle<Interface> handle,
-                   async_dispatcher_t* dispatcher = nullptr) {
-    return Bind(handle.TakeChannel(), dispatcher);
-  }
-
-  // Unbinds the underlying channel from the |InterfacePtr|.
-  //
-  // The underlying channel is returned as an |InterfaceHandle|, which is safe
-  // to transport to another thread or process. Any callbacks waiting for
-  // replies from the remote endpoint are discarded and any outstanding
-  // transaction state is erased.
-  //
-  // After this method returns, a subsequent call to |Bind| is required before
-  // calling any additional |Interface| methods.
-  InterfaceHandle<Interface> Unbind() {
-    return InterfaceHandle<Interface>(impl_->controller.reader().Unbind());
-  }
-
-  // Whether this |InterfacePtr| is currently bound to a channel.
-  //
-  // If the |InterfacePtr| is bound to a channel, the |InterfacePtr| has
-  // affinity for the thread on which it was bound and calls to |Interface|
-  // methods are proxied to the remote endpoint of the channel.
-  //
-  // See also:
-  //
-  //  * |Bind|, which binds a channel to this |InterfacePtr|.
-  //  * |Unbind|, which unbinds a channel from this |InterfacePtr|.
-  bool is_bound() const { return impl_->controller.reader().is_bound(); }
-
-  // Whether this |InterfacePtr| is currently bound to a channel.
-  //
-  // See |is_bound| for details.
-  explicit operator bool() const { return is_bound(); }
-
-  // The |Interface| proxy associated with this |InterfacePtr|.
-  //
-  // When this |InterfacePtr| is bound, method calls on this |Interface| will
-  // be proxied to the remote endpoint of the connection. Methods that expect
-  // replies will retain the supplied callbacks until the |InterfacePtr| either
-  // receives a reply to that transaction or the |InterfacePtr| is unbound from
-  // the channel.
-  //
-  // When this |InterfacePtr| is not bound, it is an error to call methods on
-  // the returned |Interface|.
-  //
-  // The returned |Interface| is thread-hostile and can be used only on the
-  // thread on which the |InterfacePtr| was bound.
-  Interface* get() const { return &impl_->proxy; }
-  Interface* operator->() const { return get(); }
-  Interface& operator*() const { return *get(); }
-
-  // An object on which to register for FIDL events.
-  //
-  // Arriving events are dispatched to the callbacks stored on this object.
-  // Events for unbound callbacks are ignored.
-  Proxy& events() const { return impl_->proxy; }
-
-#ifdef FIDL_ENABLE_LEGACY_WAIT_FOR_RESPONSE
-
-  // DEPRECATED: Using InterfaceSyncPtr instead. If used in a test, consider
-  // spinning the async::Loop instead.
-  //
-  // Blocks the calling thread until either a message arrives on the previously
-  // bound channel or an error occurs.
-  //
-  // Returns an error if waiting for the message, reading the message, or
-  // processing the message fails. If the error results in the channel being
-  // closed, the error handler will be called synchronously before this
-  // method returns.
-  //
-  // This method can be called only if this |InterfacePtr| is currently bound to
-  // a channel.
-  zx_status_t WaitForResponse() {
-    return WaitForResponseUntil(zx::time::infinite());
-  }
-
-  // DEPRECATED: Using InterfaceSyncPtr instead. If used in a test, consider
-  // spinning the async::Loop instead.
-  //
-  // Blocks the calling thread until either a message arrives on the previously
-  // bound channel, an error occurs, or the |deadline| is exceeded.
-  //
-  // Returns ZX_ERR_TIMED_OUT if the deadline is exceeded.
-  //
-  // Returns an error if waiting for the message, reading the message, or
-  // processing the message fails. If the error results in the channel being
-  // closed, the error handler will be called synchronously before this
-  // method returns.
-  //
-  // This method can be called only if this |InterfacePtr| is currently bound to
-  // a channel.
-  zx_status_t WaitForResponseUntil(zx::time deadline) {
-    return impl_->controller.reader().WaitAndDispatchOneMessageUntil(deadline);
-  }
-#endif
-
-  // Sets an error handler that will be called if an error causes the underlying
-  // channel to be closed.
-  //
-  // If the error is being reported because an error occurred on the local side
-  // of the channel, the zx_status_t of that error will be passed as the
-  // parameter to the handler.
-  //
-  // If an Epitaph was present on the channel, its error value will be passed as
-  // the parameter.  See the FIDL language specification for more detail on
-  // Epitaphs.
-  //
-  // For example, the error handler will be called if the remote side of the
-  // channel sends an invalid message. When the error handler is called, the
-  // |Binding| will no longer be bound to the channel.
-  void set_error_handler(fit::function<void(zx_status_t)> error_handler) {
-    impl_->controller.reader().set_error_handler(std::move(error_handler));
-  }
-
-  // The underlying channel.
-  const zx::channel& channel() const {
-    return impl_->controller.reader().channel();
-  }
-
-  // Closes the channel and sends an Epitaph with the given error.  See the FIDL
-  // language spec for information about Epitaphs.
-  //
-  // The return value can be any of the return values of zx_channel_write.
-  zx_status_t Close(zx_status_t epitaph_value) {
-    return impl_->controller.reader().Close(epitaph_value);
-  }
-
- private:
-  struct Impl;
-
-  std::unique_ptr<Impl> impl_;
-};
-
-template <typename T>
-struct InterfacePtr<T>::Impl {
-  Impl() : proxy(&controller) { controller.set_proxy(&proxy); }
-  internal::ProxyController controller;
-  mutable Proxy proxy;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERFACE_PTR_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr_set.h b/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr_set.h
deleted file mode 100644
index 8d54420..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr_set.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERFACE_PTR_SET_H_
-#define LIB_FIDL_CPP_INTERFACE_PTR_SET_H_
-
-#include <zircon/assert.h>
-#include <vector>
-
-#include "lib/fidl/cpp/interface_ptr.h"
-
-namespace fidl {
-
-// Contains a set of |InterfacePtr| objects, each with their own channels.
-//
-// An |InterfacePtr| is removed from the set and destroyed when its underlying
-// channel experiences an error. When the set is destroyed, all the underlying
-// channels are closed.
-//
-// An |InterfacePtrSet| is useful for broadcasting messages to a set of clients,
-// each with their own implementation of |Interface|.
-//
-// See also:
-//
-//  * |BindingSet|, which is the server analog of an |InterfacePtrSet|.
-template <typename Interface>
-class InterfacePtrSet {
- public:
-  using StorageType = std::vector<std::unique_ptr<InterfacePtr<Interface>>>;
-  using Ptr = InterfacePtr<Interface>;
-
-  // Creates an empty |InterfacePtrSet|.
-  InterfacePtrSet() = default;
-
-  InterfacePtrSet(const InterfacePtrSet& other) = delete;
-  InterfacePtrSet& operator=(const InterfacePtrSet& other) = delete;
-
-  // Adds the given |InterfacePtr| to the set.
-  //
-  // The |InterfacePtr| must already be bound to a channel. The |InterfacePtr|
-  // will be removed from the set when its underlying channel experiences an
-  // error.
-  void AddInterfacePtr(InterfacePtr<Interface> ptr) {
-    ZX_DEBUG_ASSERT(ptr.is_bound());
-    // Allocated a new |InterfacePtr| so that we can have a unique value to use
-    // as a key for removing the InterfacePtr. Otherwise, we'll lose track of
-    // the InterfacePtr when the vector resizes.
-    ptrs_.push_back(std::make_unique<Ptr>(std::move(ptr)));
-    auto* pointer = ptrs_.back().get();
-    pointer->set_error_handler(
-        [pointer, this](zx_status_t status) { this->RemoveOnError(pointer); });
-  }
-
-  // The |InterfacePtr| objects stored in this set.
-  //
-  // This collection of bindings can be invalidated when an |InterfacePtr| in
-  // the set encounters a connection error because connection errors causes the
-  // |InterfacePtrSet| to remove the |InterfacePtr| from the set.
-  const StorageType& ptrs() const { return ptrs_; }
-
-  // Closes all channels associated with |InterfacePtr| objects in the set.
-  //
-  // After this method returns, the set is empty.
-  void CloseAll() { ptrs_.clear(); }
-
-  // The number of |InterfacePtr| objects in the set.
-  //
-  // This number might be smaller than the number of |InterfacePtr| objects
-  // added to the set if some of the underlying channels have experienced an
-  // error.
-  size_t size() const { return ptrs_.size(); }
-
- private:
-  // Removes the given |pointer| from the set.
-  //
-  // Called from the error handler callback for |pointer|.
-  void RemoveOnError(Ptr* pointer) {
-    auto it = std::find_if(ptrs_.begin(), ptrs_.end(),
-                           [pointer](const std::unique_ptr<Ptr>& p) {
-                             return p.get() == pointer;
-                           });
-    ZX_DEBUG_ASSERT(it != ptrs_.end());
-    ptrs_.erase(it);
-  }
-
-  // We use |unique_ptr| rather than just |InterfacePtr| so that we can keep
-  // track of the |InterfacePtr| objects after the |vector| resizes and moves
-  // its contents to its new buffer.
-  StorageType ptrs_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERFACE_PTR_SET_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/header.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/header.h
deleted file mode 100644
index 60ec272..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/header.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_HEADER_H_
-#define LIB_FIDL_CPP_INTERNAL_HEADER_H_
-
-#include <functional>
-#include <ostream>
-
-#include <lib/fidl/cpp/array.h>
-#include <lib/fit/function.h>
-
-#ifdef __Fuchsia__
-#include <lib/zx/bti.h>
-#include <lib/zx/channel.h>
-#include <lib/zx/debuglog.h>
-#include <lib/zx/event.h>
-#include <lib/zx/eventpair.h>
-#include <lib/zx/fifo.h>
-#include <lib/zx/guest.h>
-#include <lib/zx/handle.h>
-#include <lib/zx/interrupt.h>
-#include <lib/zx/job.h>
-#include <lib/zx/log.h>
-#include <lib/zx/object.h>
-#include <lib/zx/pmt.h>
-#include <lib/zx/port.h>
-#include <lib/zx/process.h>
-#include <lib/zx/profile.h>
-#include <lib/zx/resource.h>
-#include <lib/zx/socket.h>
-#include <lib/zx/suspend_token.h>
-#include <lib/zx/task.h>
-#include <lib/zx/thread.h>
-#include <lib/zx/time.h>
-#include <lib/zx/timer.h>
-#include <lib/zx/vcpu.h>
-#include <lib/zx/vmar.h>
-#include <lib/zx/vmo.h>
-#endif
-
-#include "lib/fidl/cpp/coding_traits.h"
-#include "lib/fidl/cpp/enum.h"
-
-#ifdef __Fuchsia__
-#include "lib/fidl/cpp/interface_ptr.h"
-#include "lib/fidl/cpp/internal/proxy_controller.h"
-#include "lib/fidl/cpp/internal/stub_controller.h"
-#include "lib/fidl/cpp/internal/synchronous_proxy.h"
-#include "lib/fidl/cpp/synchronous_interface_ptr.h"
-#endif
-
-#include "lib/fidl/cpp/string.h"
-#include "lib/fidl/cpp/vector.h"
-
-// clone.h must be imported before any of the generated Clone methods are
-// defined, so that calls to Clone in clone.h are referencing the ADL
-// implementation and are not ambiguous.
-#include "lib/fidl/cpp/clone.h"
-
-#endif  // LIB_FIDL_CPP_INTERNAL_HEADER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/implementation.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/implementation.h
deleted file mode 100644
index 37a3bec..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/implementation.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_IMPLEMENTATION_H_
-#define LIB_FIDL_CPP_INTERNAL_IMPLEMENTATION_H_
-
-#include <lib/fidl/internal.h>
-#include <stdint.h>
-#include <zircon/assert.h>
-
-#include <limits>
-#include <memory>
-
-#include "lib/fidl/cpp/clone.h"
-#include "lib/fidl/cpp/comparison.h"
-#include "lib/fidl/cpp/encoder.h"
-#include "lib/fidl/cpp/internal/logging.h"
-#include "lib/fidl/cpp/traits.h"
-
-#endif  // LIB_FIDL_CPP_INTERNAL_IMPLEMENTATION_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_handler.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_handler.h
deleted file mode 100644
index 13660ad..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_handler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_MESSAGE_HANDLER_H_
-#define LIB_FIDL_CPP_INTERNAL_MESSAGE_HANDLER_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <zircon/types.h>
-
-namespace fidl {
-namespace internal {
-
-// An interface for receiving FIDL messages.
-//
-// Used by |MessageReader| to call back into its client whenever it reads a
-// message from the channel.
-class MessageHandler {
- public:
-  virtual ~MessageHandler();
-
-  // A new message has arrived.
-  //
-  // The memory backing the message will remain valid until this method returns,
-  // at which point the memory might or might not be deallocated.
-  virtual zx_status_t OnMessage(Message message) = 0;
-
-  // The channel from which the messages were being read is gone.
-  //
-  // The channel's peer might have been closed or the |MessageReader| might have
-  // unbound from the channel. In either case, implementations that keep
-  // per-channel state should reset their state when this method is called.
-  virtual void OnChannelGone();
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_MESSAGE_HANDLER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_reader.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_reader.h
deleted file mode 100644
index 5272231..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_reader.h
+++ /dev/null
@@ -1,147 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_MESSAGE_READER_H_
-#define LIB_FIDL_CPP_INTERNAL_MESSAGE_READER_H_
-
-#include <lib/async/wait.h>
-#include <lib/fidl/cpp/message.h>
-#include <lib/fidl/cpp/message_buffer.h>
-#include <lib/fit/function.h>
-#include <lib/zx/channel.h>
-
-#include <functional>
-#include <memory>
-#include <utility>
-
-#include "lib/fidl/cpp/internal/message_handler.h"
-
-namespace fidl {
-namespace internal {
-
-class MessageReader {
- public:
-  explicit MessageReader(MessageHandler* message_handler = nullptr);
-  ~MessageReader();
-
-  MessageReader(const MessageReader&) = delete;
-  MessageReader& operator=(const MessageReader&) = delete;
-
-  // Binds the given channel to this |MessageReader|.
-  //
-  // The |MessageReader| will wait asynchronously for messages on this channel
-  // and dispatch them to the message handler using |dispatcher|. After this
-  // method returns, the |MessageReader| will be waiting for incomming messages.
-  //
-  // If the |MessageReader| is already bound, the |MessageReader| will first
-  // be unbound.
-  //
-  // If |dispatcher| is null, the current thread must have a default async_t.
-  zx_status_t Bind(zx::channel channel,
-                   async_dispatcher_t* dispatcher = nullptr);
-
-  // Unbinds the channel from this |MessageReader|.
-  //
-  // The |MessageReader| will stop waiting for the messages on this channel.
-  //
-  // Returns the channel to which this |MessageReader| was previously bound, if
-  // any.
-  zx::channel Unbind();
-
-  // Unbinds the channel from this |MessageReader| and clears the error handler.
-  void Reset();
-
-  // Unbinds the channel from |other| and bindings it to this |MessageReader|.
-  //
-  // Also moves the error handler from |other| to this |MessageReader|.
-  //
-  // Useful for implementing move semantics for objects that have a
-  // |MessageReader|.
-  zx_status_t TakeChannelAndErrorHandlerFrom(MessageReader* other);
-
-  // Sends an epitaph with the given value, unbinds, and then closes the channel
-  // associated with this |MessageReader|.
-  //
-  // The |MessageReader| will send an Epitaph with the given error, unbind
-  // the channel, and then close it.
-  //
-  // The return value can be any of the return values of zx_channel_write.
-  zx_status_t Close(zx_status_t epitaph_value);
-
-  // Whether the |MessageReader| is currently bound.
-  //
-  // See |Bind()| and |Unbind()|.
-  bool is_bound() const { return channel_.is_valid(); }
-
-  // The channel to which this |MessageReader| is bound, if any.
-  const zx::channel& channel() const { return channel_; }
-
-  // Synchronously waits on |channel()| until either a message is available or
-  // the peer closes. If the channel is readable, reads a single message from
-  // the channel and dispatches it to the message handler.
-  //
-  // Returns |ZX_ERR_BAD_STATE| if this |MessageReader| is not bound, or if it
-  // receives a malformed Epitaph.
-  zx_status_t WaitAndDispatchOneMessageUntil(zx::time deadline);
-
-  // The given message handler is called whenever the |MessageReader| reads a
-  // message from the channel.
-  //
-  // The |Message| given to the message handler will be valid until the message
-  // handler returns.
-  //
-  // The handler should return ZX_OK if the message was handled and an error
-  // otherwise. If the handler returns ZX_OK, the |MessageReader| will continue
-  // to wait for messages.
-  //
-  // The handler can destroy the |MessageReader|, in which case the
-  // handler MUST return |ZX_ERR_STOP|. If the handler returns
-  // |ZX_ERR_SHOULD_WAIT|, the |MessageReader| will continue waiting. Other
-  // errors cause the |MessageReader| to unbind from the channel and call the
-  // error handler.
-  void set_message_handler(MessageHandler* message_handler) {
-    message_handler_ = message_handler;
-  }
-
-  // The given error handler is called whenever the |MessageReader| encounters
-  // an error on the channel.
-  //
-  // If the error is being reported because an error occurred on the local side
-  // of the channel, the zx_status_t of that error will be passed as the
-  // parameter to the handler.
-  //
-  // If an Epitaph was present on the channel, its error value will be passed as
-  // the parameter.  See the FIDL language specification for more detail on
-  // Epitaphs.
-  //
-  // For example, the error handler will be called if the remote side of the
-  // channel sends an invalid message. When the error handler is called, the
-  // |Binding| will no longer be bound to the channel.
-  //
-  // The handler can destroy the |MessageReader|.
-  void set_error_handler(fit::function<void(zx_status_t)> error_handler) {
-    error_handler_ = std::move(error_handler);
-  }
-
- private:
-  static void CallHandler(async_dispatcher_t* dispatcher, async_wait_t* wait,
-                          zx_status_t status, const zx_packet_signal_t* signal);
-  void OnHandleReady(async_dispatcher_t* dispatcher, zx_status_t status,
-                     const zx_packet_signal_t* signal);
-  zx_status_t ReadAndDispatchMessage(MessageBuffer* buffer);
-  void NotifyError(zx_status_t epitaph_value);
-  void Stop();
-
-  async_wait_t wait_;  // Must be first.
-  zx::channel channel_;
-  async_dispatcher_t* dispatcher_;
-  bool* should_stop_;  // See |Canary| in message_reader.cc.
-  MessageHandler* message_handler_;
-  fit::function<void(zx_status_t)> error_handler_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_MESSAGE_READER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/pending_response.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/pending_response.h
deleted file mode 100644
index 125a7d8..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/pending_response.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_PENDING_RESPONSE_H_
-#define LIB_FIDL_CPP_INTERNAL_PENDING_RESPONSE_H_
-
-#include <lib/fidl/cpp/message_builder.h>
-#include <zircon/types.h>
-
-namespace fidl {
-namespace internal {
-class WeakStubController;
-
-// A response to a FIDL message.
-//
-// When a server receives a message that expects a response, the stub receives a
-// |PendingResponse| object that the implementation can use to reply to the
-// message. A given |PendingResponse| object can be used to send a reply at
-// most once.
-//
-// If the |StubController| that processed the original message is destroyed or
-// unbound from the underlying channel (e.g., due to an error), the stub can
-// still safely call |Send|, but the response will not actually be sent to the
-// client.
-class PendingResponse {
- public:
-  // Creates a |PendingResponse| that does not need a response.
-  //
-  // The |needs_response()| method will return false.
-  PendingResponse();
-
-  // Creates a |PendingResponse| for a message with the given transaction ID.
-  //
-  // The |PendingResponse| object will take a reference to |weak_controller|,
-  // which it releases in its destructor.
-  PendingResponse(zx_txid_t txid, WeakStubController* weak_controller);
-
-  ~PendingResponse();
-
-  // |PendingResponse| objects are copiable.
-  //
-  // Each copy refers to the same logical reponse, which means |Send| should be
-  // called at most once among all the copies.
-  //
-  // The reason |PendingResponse| objects are copiable is so that they can be
-  // held by an std::function, which is also copyable. Typically, a
-  // |PendingResponse| object is held as a member of another object that
-  // implements operator(), which can be wrapped by std::function.
-  PendingResponse(const PendingResponse& other);
-  PendingResponse& operator=(const PendingResponse& other);
-
-  // |PendingResponse| objects are movable.
-  //
-  // Moving a |PendingResponse| object is more efficient that copying it because
-  // moving avoid churning the reference count of the associated
-  // |WeakStubController|.
-  PendingResponse(PendingResponse&& other);
-  PendingResponse& operator=(PendingResponse&& other);
-
-  // Whether the message that caused this |PendingResponse| object to be created
-  // expects a response.
-  //
-  // This method does not indiciate whether a response has or has not already
-  // been sent. That state is difficult to track because |PendingResponse| is
-  // copiable.
-  bool needs_response() const { return txid_; }
-
-  // Send a response.
-  //
-  // This function should be called at most once among all the copies of a given
-  // |PendingResponse| object.
-  //
-  // If the associated |WeakStubController| is no longer available (e.g., if it
-  // has been destroyed), this function will return |ZX_ERR_BAD_STATE|.
-  zx_status_t Send(const fidl_type_t* type, Message message);
-
- private:
-  // This class should be small enough to fit into the inline storage for an
-  // std::function to avoid allocating additional storage when processing
-  // messages. Currently, std::function has space for three pointers.
-  zx_txid_t txid_;
-  WeakStubController* weak_controller_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_PENDING_RESPONSE_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy.h
deleted file mode 100644
index cc72783..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_PROXY_H_
-#define LIB_FIDL_CPP_INTERNAL_PROXY_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <zircon/types.h>
-
-namespace fidl {
-namespace internal {
-
-// An interface for sending FIDL messages to a remote implementation.
-class Proxy {
- public:
-  virtual ~Proxy();
-
-  // A new message has arrived.
-  //
-  // The memory backing the message will remain valid until this method returns,
-  // at which point the memory might or might not be deallocated.
-  virtual zx_status_t Dispatch_(Message message) = 0;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_PROXY_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy_controller.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy_controller.h
deleted file mode 100644
index 070613f..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy_controller.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_PROXY_CONTROLLER_H_
-#define LIB_FIDL_CPP_INTERNAL_PROXY_CONTROLLER_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <lib/fidl/cpp/message_builder.h>
-
-#include <map>
-#include <memory>
-
-#include "lib/fidl/cpp/internal/message_handler.h"
-#include "lib/fidl/cpp/internal/message_reader.h"
-#include "lib/fidl/cpp/internal/proxy.h"
-
-namespace fidl {
-namespace internal {
-
-// Controls the client endpoint of a FIDL channel.
-//
-// A |ProxyController| controls the protocol-specific "proxy" object. Proxy
-// objects are used on the client endpoint of a FIDL channel to encode messages
-// into the channel and send them to the server endpoint, whose "stub" object
-// decodes them and dispatches them to an implementation of the protocol.
-class ProxyController : public MessageHandler {
- public:
-  ProxyController();
-  ~ProxyController();
-
-  ProxyController(const ProxyController&) = delete;
-  ProxyController& operator=(const ProxyController&) = delete;
-
-  ProxyController(ProxyController&&);
-  ProxyController& operator=(ProxyController&&);
-
-  // The |MessageReader| that is listening for responses to messages sent by
-  // this object.
-  MessageReader& reader() { return reader_; }
-  const MessageReader& reader() const { return reader_; }
-
-  // The protocol-specific object that decodes messages and dispatches them to
-  // an implementation of the protocol.
-  //
-  // The proxy must be set to a non-null value before messages are read from the
-  // underlying channel. Typically, the caller will set a non-null proxy before
-  // binding a channel to the |MessageReader|.
-  Proxy* proxy() const { return proxy_; }
-  void set_proxy(Proxy* proxy) { proxy_ = proxy; }
-
-  // Send a message over the channel.
-  //
-  // If |response_handler| is non-null, the message will be assigned a
-  // transaction identifier before being encoded and sent over the channel. The
-  // |response_handler| will be retained by the |ProxyController| until the
-  // |ProxyController| recieves a response to the message, at which time the
-  // |ProxyController| will call the |OnMessage| method of the
-  // |response_handler|.
-  //
-  // Returns an error if the message fails to encode properly or if the message
-  // cannot be written to the channel.
-  zx_status_t Send(const fidl_type_t* type, Message message,
-                   std::unique_ptr<MessageHandler> response_handler);
-
-  // Clears all the state associated with this |ProxyController|.
-  //
-  // After this method returns, the |ProxyController| is in the same state it
-  // would have been in if freshly constructed.
-  void Reset();
-
- private:
-  // Called by the |MessageReader| when a message arrives on the channel from
-  // the server.
-  //
-  // The message might be a response to a previously sent message or an
-  // unsolicited event.
-  zx_status_t OnMessage(Message message) final;
-
-  // Causes the |ProxyController| to |ClearPendingHandlers()|.
-  void OnChannelGone() final;
-
-  // Causes the |ProxyController| to destroy all pending response handlers and
-  // reset its transition identifiers.
-  void ClearPendingHandlers();
-
-  MessageReader reader_;
-  Proxy* proxy_ = nullptr;
-  std::map<zx_txid_t, std::unique_ptr<MessageHandler>> handlers_;
-  zx_txid_t next_txid_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_PROXY_CONTROLLER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub.h
deleted file mode 100644
index 448f995..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_STUB_H_
-#define LIB_FIDL_CPP_INTERNAL_STUB_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <zircon/types.h>
-
-#include "lib/fidl/cpp/internal/pending_response.h"
-
-namespace fidl {
-namespace internal {
-class StubController;
-
-// An interface for dispatching FIDL messages to a protocol implementation.
-//
-// Used by |StubController| to supply both a |Message| and a |PendingResponse|
-// object to protocol implementations.
-class Stub {
- public:
-  virtual ~Stub();
-
-  // A new message has arrived.
-  //
-  // If the message expects a response, the |PendingResponse| object's
-  // |needs_response()| method will return true.
-  //
-  // The memory backing the message will remain valid until this method returns,
-  // at which point the memory might or might not be deallocated.
-  //
-  // The |PendingResponse| object has affinity for the current thread and is not
-  // safe to transport to another thread.
-  virtual zx_status_t Dispatch_(Message message, PendingResponse response) = 0;
-
-  // The protocol-agnostic object that listens for incoming messages.
-  //
-  // The controller must be set to a non-null value before sending events
-  // through this stub.
-  StubController* controller() const { return controller_; }
-  void set_controller(StubController* controller) { controller_ = controller; }
-
- private:
-  StubController* controller_ = nullptr;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_STUB_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub_controller.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub_controller.h
deleted file mode 100644
index d89729e..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub_controller.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_
-#define LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_
-
-#include <memory>
-
-#include <lib/fidl/cpp/message.h>
-#include <lib/zx/channel.h>
-
-#include "lib/fidl/cpp/internal/message_handler.h"
-#include "lib/fidl/cpp/internal/message_reader.h"
-#include "lib/fidl/cpp/internal/stub.h"
-
-namespace fidl {
-namespace internal {
-class WeakStubController;
-
-// Controls the server endpoint of a FIDL channel.
-//
-// A |StubController| controls the protocol-specific "stub" object. Stub
-// objects are used on the server endpoint of a FIDL channel to decode messages
-// received over the channel and dispatch them to an implementation of the
-// protocol.
-class StubController : public MessageHandler {
- public:
-  StubController();
-  ~StubController();
-
-  StubController(const StubController&) = delete;
-  StubController& operator=(const StubController&) = delete;
-
-  // The |MessageReader| that is listening for messages sent by the client.
-  MessageReader& reader() { return reader_; }
-  const MessageReader& reader() const { return reader_; }
-
-  // The protocol-specific object that decodes messages and dispatches them to
-  // an implementation of the protocol.
-  //
-  // The stub must be set to a non-null value before messages are read from the
-  // underlying channel. Typically, the caller will set a non-null stub before
-  // binding a channel to the |MessageReader|.
-  Stub* stub() const { return stub_; }
-  void set_stub(Stub* stub) { stub_ = stub; }
-
-  // Send a message over the channel.
-  //
-  // Returns an error if the message fails to encode properly or if the message
-  // cannot be written to the channel.
-  zx_status_t Send(const fidl_type_t* type, Message message);
-
- private:
-  // Called by the |MessageReader| when a message arrives on the channel from
-  // the client.
-  //
-  // The message will be dispatched using the |stub()|. If the message expects a
-  // response, the |stub()| will also be given a |PendingResponse| object that
-  // can be used to send a reply to the message.
-  zx_status_t OnMessage(Message message) final;
-
-  // Causes the |StubController| to invalidate all outstanding weak pointers,
-  // preventing outstanding |PendingResponse| objects from sending messages on
-  // the channel that has gone away.
-  void OnChannelGone() final;
-
-  // Invalidate all outstanding weak pointers, preventing outstanding
-  // |PendingResponse| objects from sending messages.
-  void InvalidateWeakIfNeeded();
-
-  WeakStubController* weak_;
-  MessageReader reader_;
-  Stub* stub_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/weak_stub_controller.h b/pkg/fidl_cpp/include/lib/fidl/cpp/internal/weak_stub_controller.h
deleted file mode 100644
index cdfbb1d..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/internal/weak_stub_controller.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_WEAK_STUB_CONTROLLER_H_
-#define LIB_FIDL_CPP_INTERNAL_WEAK_STUB_CONTROLLER_H_
-
-#include <stdint.h>
-
-namespace fidl {
-namespace internal {
-class StubController;
-
-// A weak reference to a |StubController|.
-//
-// Used to link a |PendingResponse| object with a |StubController|. When the
-// |StubController| is destroyed (or unbound from the underling channel), the
-// weak reference is invalidated, preventing outstanding |PendingResponse|
-// objects from referencing the |StubController|.
-class WeakStubController {
- public:
-  // Creates a weak reference to a |StubController|.
-  //
-  // The created |WeakStubController| has a reference count of one, which means
-  // the creator is responsible for calling |Release| exactly once.
-  explicit WeakStubController(StubController* controller);
-
-  // Increment the refernence count for this object.
-  //
-  // Each call to this method imposes a requirement to eventually call |Release|
-  // exactly once.
-  void AddRef();
-
-  // Decrements the reference count for this object.
-  //
-  // When the reference count reaches zero, the object is destroyed.
-  void Release();
-
-  // Break the connection between this object and the |StubController|.
-  //
-  // After calling this method, |controller()| will return nullptr.
-  void Invalidate();
-
-  // The |StubController| to which this weak reference refers.
-  //
-  // After the weak reference has been invalidated, this method returns nullptr.
-  StubController* controller() const { return controller_; }
-
- private:
-  ~WeakStubController();
-
-  uint32_t ref_count_;  // starts at one
-  StubController* controller_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_WEAK_STUB_CONTROLLER_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/optional.h b/pkg/fidl_cpp/include/lib/fidl/cpp/optional.h
deleted file mode 100644
index 4dc6219..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/optional.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_OPTIONAL_H_
-#define LIB_FIDL_CPP_OPTIONAL_H_
-
-#include <memory>
-#include <utility>
-
-namespace fidl {
-
-template <typename T>
-std::unique_ptr<T> MakeOptional(T value) {
-  return std::make_unique<T>(std::move(value));
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_OPTIONAL_H_
diff --git a/pkg/fidl_cpp/include/lib/fidl/cpp/thread_safe_binding_set.h b/pkg/fidl_cpp/include/lib/fidl/cpp/thread_safe_binding_set.h
deleted file mode 100644
index a3b572c..0000000
--- a/pkg/fidl_cpp/include/lib/fidl/cpp/thread_safe_binding_set.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_THREAD_SAFE_BINDING_SET_H_
-#define LIB_FIDL_CPP_THREAD_SAFE_BINDING_SET_H_
-
-#include <algorithm>
-#include <memory>
-#include <mutex>
-#include <utility>
-#include <vector>
-
-#include <lib/async/dispatcher.h>
-#include <zircon/compiler.h>
-
-#include "lib/fidl/cpp/binding.h"
-
-namespace fidl {
-
-// Manages a set of bindings to implemenations owned by the bound channels.
-//
-// The implementation pointer type of the binding is also parameterized,
-// allowing the use of smart pointer types such as |std::unique_ptr<>| to
-// reference the implementation.
-//
-// This class is thread-safe; bindings may be added or cleared from any thread.
-//
-// See also:
-//
-//  * |BindingSet|, which is the thread-hostile analog that offers more
-//    functionality.
-//  * |InterfacePtrSet|, which is the client analog of |BindingSet|.
-template <typename Interface, typename ImplPtr = Interface*>
-class ThreadSafeBindingSet {
- public:
-  using Binding = ::fidl::Binding<Interface, ImplPtr>;
-  using StorageType = std::vector<std::unique_ptr<Binding>>;
-
-  ThreadSafeBindingSet() = default;
-
-  ThreadSafeBindingSet(const ThreadSafeBindingSet&) = delete;
-  ThreadSafeBindingSet& operator=(const ThreadSafeBindingSet&) = delete;
-
-  // Adds a binding to the set.
-  //
-  // The given |ImplPtr| is bound to the channel underlying the
-  // |InterfaceRequest|. The binding is removed (and the |~ImplPtr| called)
-  // when the created binding has an error (e.g., if the remote endpoint of
-  // the channel sends an invalid message).
-  //
-  // Whether this method takes ownership of |impl| depends on |ImplPtr|. If
-  // |ImplPtr| is a raw pointer, then this method does not take ownership of
-  // |impl|. If |ImplPtr| is a |unique_ptr|, then running |~ImplPtr| when the
-  // binding generates an error will delete |impl| because |~ImplPtr| is
-  // |~unique_ptr|, which deletes |impl|.
-  //
-  // The impl will use the given async_t (e.g., a message loop) in order to read
-  // messages from the channel and to monitor the channel for
-  // |ZX_CHANNEL_PEER_CLOSED|. It is not necessary to use the same async_t for
-  // each binding added.
-  void AddBinding(ImplPtr impl, InterfaceRequest<Interface> request,
-                  async_dispatcher_t* dispatcher) {
-    std::lock_guard<std::mutex> guard(lock_);
-    bindings_.push_back(std::make_unique<Binding>(
-        std::forward<ImplPtr>(impl), std::move(request), dispatcher));
-    auto* binding = bindings_.back().get();
-    // Set the connection error handler for the newly added Binding to be a
-    // function that will erase it from the vector.
-    binding->set_error_handler(
-        [binding, this](zx_status_t status) { this->RemoveOnError(binding); });
-  }
-
-  // Adds a binding to the set for the given implementation.
-  //
-  // Creates a channel for the binding and returns the client endpoint of
-  // the channel as an |InterfaceHandle|. If |AddBinding| fails to create the
-  // underlying channel, the returned |InterfaceHandle| will return false from
-  // |is_valid()|.
-  //
-  // The given |ImplPtr| is bound to the newly created channel. The binding is
-  // removed (and the |~ImplPtr| called) when the created binding has an error
-  // (e.g., if the remote endpoint of the channel sends an invalid message).
-  //
-  // Whether this method takes ownership of |impl| depends on |ImplPtr|. If
-  // |ImplPtr| is a raw pointer, then this method does not take ownership of
-  // |impl|. If |ImplPtr| is a |unique_ptr|, then running |~ImplPtr| when the
-  // binding generates an error will delete |impl| because |~ImplPtr| is
-  // |~unique_ptr|, which deletes |impl|.
-  InterfaceHandle<Interface> AddBinding(ImplPtr impl,
-                                        async_dispatcher_t* dispatcher) {
-    InterfaceHandle<Interface> handle;
-    InterfaceRequest<Interface> request = handle.NewRequest();
-    if (!request)
-      return nullptr;
-    AddBinding(std::forward<ImplPtr>(impl), std::move(request), dispatcher);
-    return handle;
-  }
-
-  // Removes all the bindings from the set.
-  //
-  // Closes all the channels associated with this |BindingSet|.
-  void CloseAll() {
-    std::lock_guard<std::mutex> guard(lock_);
-    bindings_.clear();
-  }
-
- private:
-  // Called when a binding has an error to remove the binding from the set.
-  void RemoveOnError(Binding* binding) {
-    std::lock_guard<std::mutex> guard(lock_);
-    auto it = std::find_if(bindings_.begin(), bindings_.end(),
-                           [binding](const std::unique_ptr<Binding>& b) {
-                             return b.get() == binding;
-                           });
-    ZX_DEBUG_ASSERT(it != bindings_.end());
-    (*it)->set_error_handler(nullptr);
-    bindings_.erase(it);
-  }
-
-  std::mutex lock_;
-  StorageType bindings_ __TA_GUARDED(lock_);
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_THREAD_SAFE_BINDING_SET_H_
diff --git a/pkg/fidl_cpp/internal/message_handler.cc b/pkg/fidl_cpp/internal/message_handler.cc
deleted file mode 100644
index fbcaa5a..0000000
--- a/pkg/fidl_cpp/internal/message_handler.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/message_handler.h"
-
-namespace fidl {
-namespace internal {
-
-MessageHandler::~MessageHandler() = default;
-
-void MessageHandler::OnChannelGone() {}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/message_reader.cc b/pkg/fidl_cpp/internal/message_reader.cc
deleted file mode 100644
index e4331f7..0000000
--- a/pkg/fidl_cpp/internal/message_reader.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/message_reader.h"
-
-#include <lib/async/default.h>
-#include <lib/fidl/cpp/message_buffer.h>
-#include <lib/fidl/epitaph.h>
-#include <zircon/assert.h>
-
-namespace fidl {
-namespace internal {
-namespace {
-
-constexpr zx_signals_t kSignals = ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED;
-
-// |Canary| is a stack-allocated object that observes when a |MessageReader| is
-// destroyed or unbound from the current channel.
-//
-// Because |WaitAndDispatchOneMessageUntil| can be called re-entrantly, we can
-// be in a state where there are N nested calls to |ReadAndDispatchMessage| on
-// the stack. While dispatching any of those messages, the client can destroy
-// the |MessageReader| or unbind it from the current channel. When that happens
-// we need to stop reading messages from the channel and unwind the stack
-// safely.
-//
-// The |Canary| works by storing a pointer to its |should_stop_| field in the
-// |MessageReader|.  Upon destruction or unbinding, the |MessageReader| writes
-// |true| into |should_stop_|. When we unwind the stack, the |Canary| forwards
-// that value to the next |Canary| on the stack.
-class Canary {
- public:
-  explicit Canary(bool** should_stop_slot)
-      : should_stop_slot_(should_stop_slot),
-        previous_should_stop_(*should_stop_slot_),
-        should_stop_(false) {
-    *should_stop_slot_ = &should_stop_;
-  }
-
-  ~Canary() {
-    if (should_stop_) {
-      // If we should stop, we need to propagate that information to the
-      // |Canary| higher up the stack, if any. We also cannot touch
-      // |*should_stop_slot_| because the |MessageReader| might have been
-      // destroyed (or bound to another channel).
-      if (previous_should_stop_)
-        *previous_should_stop_ = should_stop_;
-    } else {
-      // Otherwise, the |MessageReader| was not destroyed and is still bound to
-      // the same channel. We need to restore the previous |should_stop_|
-      // pointer so that a |Canary| further up the stack can still be informed
-      // about whether to stop.
-      *should_stop_slot_ = previous_should_stop_;
-    }
-  }
-
-  // Whether the |ReadAndDispatchMessage| that created the |Canary| should stop
-  // after dispatching the current message.
-  bool should_stop() const { return should_stop_; }
-
- private:
-  bool** should_stop_slot_;
-  bool* previous_should_stop_;
-  bool should_stop_;
-};
-
-}  // namespace
-
-static_assert(std::is_standard_layout<MessageReader>::value,
-              "We need offsetof to work");
-
-MessageReader::MessageReader(MessageHandler* message_handler)
-    : wait_{{ASYNC_STATE_INIT},
-            &MessageReader::CallHandler,
-            ZX_HANDLE_INVALID,
-            kSignals},
-      dispatcher_(nullptr),
-      should_stop_(nullptr),
-      message_handler_(message_handler),
-      error_handler_(nullptr) {}
-
-MessageReader::~MessageReader() {
-  Stop();
-  if (dispatcher_)
-    async_cancel_wait(dispatcher_, &wait_);
-}
-
-zx_status_t MessageReader::Bind(zx::channel channel,
-                                async_dispatcher_t* dispatcher) {
-  if (is_bound())
-    Unbind();
-  if (!channel)
-    return ZX_OK;
-  channel_ = std::move(channel);
-  if (dispatcher) {
-    dispatcher_ = dispatcher;
-  } else {
-    dispatcher_ = async_get_default_dispatcher();
-  }
-  ZX_ASSERT_MSG(dispatcher_ != nullptr,
-                "either |dispatcher| must be non-null, or "
-                "|async_get_default_dispatcher| must "
-                "be configured to return a non-null value");
-  wait_.object = channel_.get();
-  zx_status_t status = async_begin_wait(dispatcher_, &wait_);
-  if (status != ZX_OK)
-    Unbind();
-  return status;
-}
-
-zx::channel MessageReader::Unbind() {
-  if (!is_bound())
-    return zx::channel();
-  Stop();
-  async_cancel_wait(dispatcher_, &wait_);
-  wait_.object = ZX_HANDLE_INVALID;
-  dispatcher_ = nullptr;
-  zx::channel channel = std::move(channel_);
-  if (message_handler_)
-    message_handler_->OnChannelGone();
-  return channel;
-}
-
-void MessageReader::Reset() {
-  Unbind();
-  error_handler_ = nullptr;
-}
-
-zx_status_t MessageReader::TakeChannelAndErrorHandlerFrom(
-    MessageReader* other) {
-  zx_status_t status = Bind(other->Unbind(), other->dispatcher_);
-  if (status != ZX_OK)
-    return status;
-  error_handler_ = std::move(other->error_handler_);
-  return ZX_OK;
-}
-
-zx_status_t MessageReader::WaitAndDispatchOneMessageUntil(zx::time deadline) {
-  if (!is_bound())
-    return ZX_ERR_BAD_STATE;
-  zx_signals_t pending = ZX_SIGNAL_NONE;
-  zx_status_t status = channel_.wait_one(kSignals, deadline, &pending);
-  if (status == ZX_ERR_TIMED_OUT)
-    return status;
-  if (status != ZX_OK) {
-    NotifyError(status);
-    return status;
-  }
-
-  if (pending & ZX_CHANNEL_READABLE) {
-    MessageBuffer buffer;
-    return ReadAndDispatchMessage(&buffer);
-  }
-
-  ZX_DEBUG_ASSERT(pending & ZX_CHANNEL_PEER_CLOSED);
-  NotifyError(ZX_ERR_PEER_CLOSED);
-  return ZX_ERR_PEER_CLOSED;
-}
-
-void MessageReader::CallHandler(async_dispatcher_t* dispatcher,
-                                async_wait_t* wait, zx_status_t status,
-                                const zx_packet_signal_t* signal) {
-  static_assert(offsetof(MessageReader, wait_) == 0,
-                "The wait must be the first member for this cast to be valid.");
-  reinterpret_cast<MessageReader*>(wait)->OnHandleReady(dispatcher, status,
-                                                        signal);
-}
-
-void MessageReader::OnHandleReady(async_dispatcher_t* dispatcher,
-                                  zx_status_t status,
-                                  const zx_packet_signal_t* signal) {
-  if (status != ZX_OK) {
-    NotifyError(status);
-    return;
-  }
-
-  if (signal->observed & ZX_CHANNEL_READABLE) {
-    MessageBuffer buffer;
-    for (uint64_t i = 0; i < signal->count; i++) {
-      status = ReadAndDispatchMessage(&buffer);
-      // If ReadAndDispatchMessage returns ZX_ERR_STOP, that means the message
-      // handler has destroyed this object and we need to unwind without
-      // touching |this|.
-      if (status == ZX_ERR_SHOULD_WAIT)
-        break;
-      if (status != ZX_OK)
-        return;
-    }
-    status = async_begin_wait(dispatcher, &wait_);
-    if (status != ZX_OK) {
-      NotifyError(status);
-    }
-    return;
-  }
-
-  ZX_DEBUG_ASSERT(signal->observed & ZX_CHANNEL_PEER_CLOSED);
-  // Notice that we don't notify an error until we've drained all the messages
-  // out of the channel.
-  NotifyError(ZX_ERR_PEER_CLOSED);
-}
-
-zx_status_t MessageReader::ReadAndDispatchMessage(MessageBuffer* buffer) {
-  Message message = buffer->CreateEmptyMessage();
-  zx_status_t status = message.Read(channel_.get(), 0);
-  if (status == ZX_ERR_SHOULD_WAIT)
-    return status;
-  if (status != ZX_OK) {
-    NotifyError(status);
-    return status;
-  }
-
-  if (message.has_header() && message.ordinal() == FIDL_EPITAPH_ORDINAL) {
-    // This indicates the message is an epitaph, and that any epitaph-friendly
-    // error handlers should be invoked.  Note the epitaph error is stored in
-    // the header's reserved word.
-
-    // TODO(FIDL-322): Use a different error code to distinguish remote encoding
-    // errors from local ones.
-    if (message.bytes().actual() != sizeof(fidl_epitaph_t)) {
-      NotifyError(ZX_ERR_INVALID_ARGS);
-      return ZX_ERR_INVALID_ARGS;
-    }
-    fidl_epitaph_t* epitaph = message.GetBytesAs<fidl_epitaph_t>();
-    NotifyError(epitaph->hdr.reserved0);
-    return ZX_ERR_PEER_CLOSED;
-  }
-
-  if (!message_handler_)
-    return ZX_OK;
-  Canary canary(&should_stop_);
-  status = message_handler_->OnMessage(std::move(message));
-  if (canary.should_stop())
-    return ZX_ERR_STOP;
-  if (status != ZX_OK)
-    NotifyError(status);
-  return status;
-}
-
-zx_status_t MessageReader::Close(zx_status_t epitaph_value) {
-  if (!is_bound()) {
-    return ZX_ERR_BAD_STATE;
-  }
-
-  zx_status_t status = fidl_epitaph_write(channel_.get(), epitaph_value);
-  if (status != ZX_OK) {
-    return status;
-  }
-  Unbind();
-  return ZX_OK;
-}
-
-void MessageReader::NotifyError(zx_status_t epitaph_value) {
-  Unbind();
-  if (error_handler_) {
-    error_handler_(epitaph_value);
-  }
-}
-
-void MessageReader::Stop() {
-  if (should_stop_) {
-    *should_stop_ = true;
-    should_stop_ = nullptr;
-  }
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/pending_response.cc b/pkg/fidl_cpp/internal/pending_response.cc
deleted file mode 100644
index 3ac41ae..0000000
--- a/pkg/fidl_cpp/internal/pending_response.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/pending_response.h"
-
-#include "lib/fidl/cpp/internal/logging.h"
-#include "lib/fidl/cpp/internal/stub_controller.h"
-#include "lib/fidl/cpp/internal/weak_stub_controller.h"
-
-namespace fidl {
-namespace internal {
-
-PendingResponse::PendingResponse() : txid_(0), weak_controller_(nullptr) {}
-
-PendingResponse::PendingResponse(zx_txid_t txid,
-                                 WeakStubController* weak_controller)
-    : txid_(txid), weak_controller_(weak_controller) {
-  if (weak_controller_)
-    weak_controller_->AddRef();
-}
-
-PendingResponse::~PendingResponse() {
-  if (weak_controller_)
-    weak_controller_->Release();
-}
-
-PendingResponse::PendingResponse(const PendingResponse& other)
-    : PendingResponse(other.txid_, other.weak_controller_) {}
-
-PendingResponse& PendingResponse::operator=(const PendingResponse& other) {
-  if (this == &other)
-    return *this;
-  txid_ = other.txid_;
-  if (weak_controller_)
-    weak_controller_->Release();
-  weak_controller_ = other.weak_controller_;
-  if (weak_controller_)
-    weak_controller_->AddRef();
-  return *this;
-}
-
-PendingResponse::PendingResponse(PendingResponse&& other)
-    : txid_(other.txid_), weak_controller_(other.weak_controller_) {
-  other.weak_controller_ = nullptr;
-}
-
-PendingResponse& PendingResponse::operator=(PendingResponse&& other) {
-  if (this == &other)
-    return *this;
-  txid_ = other.txid_;
-  if (weak_controller_)
-    weak_controller_->Release();
-  weak_controller_ = other.weak_controller_;
-  other.weak_controller_ = nullptr;
-  return *this;
-}
-
-zx_status_t PendingResponse::Send(const fidl_type_t* type, Message message) {
-  if (!weak_controller_)
-    return ZX_ERR_BAD_STATE;
-  StubController* controller = weak_controller_->controller();
-  if (!controller)
-    return ZX_ERR_BAD_STATE;
-  message.set_txid(txid_);
-  const char* error_msg = nullptr;
-  zx_status_t status = message.Validate(type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_ENCODING_ERROR(message, type, error_msg);
-    return status;
-  }
-  zx_handle_t channel = controller->reader().channel().get();
-  return message.Write(channel, 0);
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/proxy.cc b/pkg/fidl_cpp/internal/proxy.cc
deleted file mode 100644
index 412aff7..0000000
--- a/pkg/fidl_cpp/internal/proxy.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/proxy.h"
-
-namespace fidl {
-namespace internal {
-
-Proxy::~Proxy() = default;
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/proxy_controller.cc b/pkg/fidl_cpp/internal/proxy_controller.cc
deleted file mode 100644
index bec764c..0000000
--- a/pkg/fidl_cpp/internal/proxy_controller.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/proxy_controller.h"
-
-#include <utility>
-
-#include "lib/fidl/cpp/internal/logging.h"
-
-namespace fidl {
-namespace internal {
-namespace {
-
-constexpr uint32_t kUserspaceTxidMask = 0x7FFFFFFF;
-
-}  // namespace
-
-ProxyController::ProxyController() : reader_(this), next_txid_(1) {}
-
-ProxyController::~ProxyController() = default;
-
-ProxyController::ProxyController(ProxyController&& other)
-    : reader_(this),
-      handlers_(std::move(other.handlers_)),
-      next_txid_(other.next_txid_) {
-  reader_.TakeChannelAndErrorHandlerFrom(&other.reader());
-  other.Reset();
-}
-
-ProxyController& ProxyController::operator=(ProxyController&& other) {
-  if (this != &other) {
-    reader_.TakeChannelAndErrorHandlerFrom(&other.reader());
-    handlers_ = std::move(other.handlers_);
-    next_txid_ = other.next_txid_;
-    other.Reset();
-  }
-  return *this;
-}
-
-zx_status_t ProxyController::Send(
-    const fidl_type_t* type, Message message,
-    std::unique_ptr<MessageHandler> response_handler) {
-  zx_txid_t txid = 0;
-  if (response_handler) {
-    txid = next_txid_++ & kUserspaceTxidMask;
-    while (!txid || handlers_.find(txid) != handlers_.end())
-      txid = next_txid_++ & kUserspaceTxidMask;
-    message.set_txid(txid);
-  }
-  const char* error_msg = nullptr;
-  zx_status_t status = message.Validate(type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_ENCODING_ERROR(message, type, error_msg);
-    return status;
-  }
-  status = message.Write(reader_.channel().get(), 0);
-  if (status != ZX_OK) {
-    FIDL_REPORT_CHANNEL_WRITING_ERROR(message, type, status);
-    return status;
-  }
-  if (response_handler)
-    handlers_.emplace(txid, std::move(response_handler));
-  return ZX_OK;
-}
-
-void ProxyController::Reset() {
-  reader_.Reset();
-  ClearPendingHandlers();
-}
-
-zx_status_t ProxyController::OnMessage(Message message) {
-  if (!message.has_header())
-    return ZX_ERR_INVALID_ARGS;
-  zx_txid_t txid = message.txid();
-  if (!txid) {
-    if (!proxy_)
-      return ZX_ERR_NOT_SUPPORTED;
-    return proxy_->Dispatch_(std::move(message));
-  }
-  auto it = handlers_.find(txid);
-  if (it == handlers_.end())
-    return ZX_ERR_NOT_FOUND;
-  std::unique_ptr<MessageHandler> handler = std::move(it->second);
-  handlers_.erase(it);
-  return handler->OnMessage(std::move(message));
-}
-
-void ProxyController::OnChannelGone() { ClearPendingHandlers(); }
-
-void ProxyController::ClearPendingHandlers() {
-  handlers_.clear();
-  next_txid_ = 1;
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/stub.cc b/pkg/fidl_cpp/internal/stub.cc
deleted file mode 100644
index 0ddec10..0000000
--- a/pkg/fidl_cpp/internal/stub.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/stub.h"
-
-namespace fidl {
-namespace internal {
-
-Stub::~Stub() = default;
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/stub_controller.cc b/pkg/fidl_cpp/internal/stub_controller.cc
deleted file mode 100644
index 2244229..0000000
--- a/pkg/fidl_cpp/internal/stub_controller.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/stub_controller.h"
-
-#include "lib/fidl/cpp/internal/logging.h"
-#include "lib/fidl/cpp/internal/pending_response.h"
-#include "lib/fidl/cpp/internal/weak_stub_controller.h"
-
-namespace fidl {
-namespace internal {
-
-StubController::StubController() : weak_(nullptr), reader_(this) {}
-
-StubController::~StubController() { InvalidateWeakIfNeeded(); }
-
-zx_status_t StubController::Send(const fidl_type_t* type, Message message) {
-  const char* error_msg = nullptr;
-  zx_status_t status = message.Validate(type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_ENCODING_ERROR(message, type, error_msg);
-    return status;
-  }
-  return message.Write(reader_.channel().get(), 0);
-}
-
-zx_status_t StubController::OnMessage(Message message) {
-  if (!message.has_header())
-    return ZX_ERR_INVALID_ARGS;
-  zx_txid_t txid = message.txid();
-  WeakStubController* weak = nullptr;
-  if (txid) {
-    if (!weak_)
-      weak_ = new WeakStubController(this);
-    weak = weak_;
-  }
-  return stub_->Dispatch_(std::move(message), PendingResponse(txid, weak));
-}
-
-void StubController::OnChannelGone() { InvalidateWeakIfNeeded(); }
-
-void StubController::InvalidateWeakIfNeeded() {
-  if (!weak_)
-    return;
-  weak_->Invalidate();
-  weak_->Release();
-  weak_ = nullptr;
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/internal/weak_stub_controller.cc b/pkg/fidl_cpp/internal/weak_stub_controller.cc
deleted file mode 100644
index 7693ef7..0000000
--- a/pkg/fidl_cpp/internal/weak_stub_controller.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/weak_stub_controller.h"
-
-namespace fidl {
-namespace internal {
-
-WeakStubController::WeakStubController(StubController* controller)
-    : ref_count_(1u), controller_(controller) {}
-
-WeakStubController::~WeakStubController() = default;
-
-void WeakStubController::AddRef() { ++ref_count_; }
-
-void WeakStubController::Release() {
-  if (--ref_count_ == 0)
-    delete this;
-}
-
-void WeakStubController::Invalidate() { controller_ = nullptr; }
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp/meta.json b/pkg/fidl_cpp/meta.json
deleted file mode 100644
index 37f840f..0000000
--- a/pkg/fidl_cpp/meta.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "deps": [
-    "fidl_cpp_sync", 
-    "async", 
-    "async-default", 
-    "fidl", 
-    "fidl-async", 
-    "fit", 
-    "zx"
-  ], 
-  "fidl_deps": [], 
-  "headers": [
-    "pkg/fidl_cpp/include/lib/fidl/cpp/binding.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/binding_set.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/enum.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/interface_ptr_set.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/header.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/implementation.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_handler.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/message_reader.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/pending_response.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/proxy_controller.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/stub_controller.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/internal/weak_stub_controller.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/optional.h", 
-    "pkg/fidl_cpp/include/lib/fidl/cpp/thread_safe_binding_set.h"
-  ], 
-  "include_dir": "pkg/fidl_cpp/include", 
-  "name": "fidl_cpp", 
-  "root": "pkg/fidl_cpp", 
-  "sources": [
-    "pkg/fidl_cpp/internal/message_handler.cc", 
-    "pkg/fidl_cpp/internal/message_reader.cc", 
-    "pkg/fidl_cpp/internal/pending_response.cc", 
-    "pkg/fidl_cpp/internal/proxy.cc", 
-    "pkg/fidl_cpp/internal/proxy_controller.cc", 
-    "pkg/fidl_cpp/internal/stub.cc", 
-    "pkg/fidl_cpp/internal/stub_controller.cc", 
-    "pkg/fidl_cpp/internal/weak_stub_controller.cc"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/fidl_cpp_base/clone.cc b/pkg/fidl_cpp_base/clone.cc
deleted file mode 100644
index 9b4e80a..0000000
--- a/pkg/fidl_cpp_base/clone.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/clone.h"
-
-namespace fidl {
-
-zx_status_t Clone(const StringPtr& value, StringPtr* result) {
-  if (!value) {
-    *result = StringPtr();
-  } else {
-    result->reset(*value);
-  }
-  return ZX_OK;
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/coding_traits.cc b/pkg/fidl_cpp_base/coding_traits.cc
deleted file mode 100644
index e66d8bd..0000000
--- a/pkg/fidl_cpp_base/coding_traits.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/coding_traits.h"
-
-namespace fidl {
-
-void EncodeNullVector(Encoder* encoder, size_t offset) {
-  fidl_vector_t* vector = encoder->GetPtr<fidl_vector_t>(offset);
-  vector->count = 0u;
-  vector->data = reinterpret_cast<void*>(FIDL_ALLOC_ABSENT);
-}
-
-void EncodeVectorPointer(Encoder* encoder, size_t count, size_t offset) {
-  fidl_vector_t* vector = encoder->GetPtr<fidl_vector_t>(offset);
-  vector->count = count;
-  vector->data = reinterpret_cast<void*>(FIDL_ALLOC_PRESENT);
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/decoder.cc b/pkg/fidl_cpp_base/decoder.cc
deleted file mode 100644
index bec4ee0..0000000
--- a/pkg/fidl_cpp_base/decoder.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/decoder.h"
-
-#include <utility>
-
-namespace fidl {
-
-Decoder::Decoder(Message message) : message_(std::move(message)) {}
-
-Decoder::~Decoder() = default;
-
-size_t Decoder::GetOffset(void* ptr) {
-  return GetOffset(reinterpret_cast<uintptr_t>(ptr));
-}
-
-size_t Decoder::GetOffset(uintptr_t ptr) {
-  // The |ptr| value comes from the message buffer, which we've already
-  // validated. That means it should coorespond to a valid offset within the
-  // message.
-  return ptr - reinterpret_cast<uintptr_t>(message_.bytes().data());
-}
-
-#ifdef __Fuchsia__
-void Decoder::DecodeHandle(zx::object_base* value, size_t offset) {
-  zx_handle_t* handle = GetPtr<zx_handle_t>(offset);
-  value->reset(*handle);
-  *handle = ZX_HANDLE_INVALID;
-}
-#endif
-
-uint8_t* Decoder::InternalGetPtr(size_t offset) {
-  return message_.bytes().data() + offset;
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/encoder.cc b/pkg/fidl_cpp_base/encoder.cc
deleted file mode 100644
index 01ffb44..0000000
--- a/pkg/fidl_cpp_base/encoder.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/encoder.h"
-
-#include <zircon/assert.h>
-#include <zircon/fidl.h>
-
-namespace fidl {
-namespace {
-
-size_t Align(size_t size) {
-  constexpr size_t alignment_mask = FIDL_ALIGNMENT - 1;
-  return (size + alignment_mask) & ~alignment_mask;
-}
-
-}  // namespace
-
-Encoder::Encoder(uint32_t ordinal) { EncodeMessageHeader(ordinal); }
-
-Encoder::~Encoder() = default;
-
-size_t Encoder::Alloc(size_t size) {
-  size_t offset = bytes_.size();
-  size_t new_size = bytes_.size() + Align(size);
-  ZX_ASSERT(new_size >= offset);
-  bytes_.resize(new_size);
-  return offset;
-}
-
-#ifdef __Fuchsia__
-void Encoder::EncodeHandle(zx::object_base* value, size_t offset) {
-  if (value->is_valid()) {
-    *GetPtr<zx_handle_t>(offset) = FIDL_HANDLE_PRESENT;
-    handles_.push_back(value->release());
-  } else {
-    *GetPtr<zx_handle_t>(offset) = FIDL_HANDLE_ABSENT;
-  }
-}
-#endif
-
-Message Encoder::GetMessage() {
-  return Message(BytePart(bytes_.data(), bytes_.size(), bytes_.size()),
-                 HandlePart(handles_.data(), handles_.size(), handles_.size()));
-}
-
-void Encoder::Reset(uint32_t ordinal) {
-  bytes_.clear();
-  handles_.clear();
-  EncodeMessageHeader(ordinal);
-}
-
-void Encoder::EncodeMessageHeader(uint32_t ordinal) {
-  size_t offset = Alloc(sizeof(fidl_message_header_t));
-  fidl_message_header_t* header = GetPtr<fidl_message_header_t>(offset);
-  header->ordinal = ordinal;
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/array.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/array.h
deleted file mode 100644
index aeb35e6..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/array.h
+++ /dev/null
@@ -1,98 +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.
-
-#ifndef LIB_FIDL_CPP_ARRAY_H_
-#define LIB_FIDL_CPP_ARRAY_H_
-
-#include <stddef.h>
-#include <string.h>
-
-#include <lib/fidl/cpp/comparison.h>
-
-namespace fidl {
-
-template <typename T, size_t N>
-class Array {
- public:
-  Array() { memset(data_, 0, sizeof(data_)); }
-
-  constexpr size_t size() const { return N; }
-
-  // TODO(FIDL-245) Remove this overload.
-  constexpr size_t count() const { return N; }
-
-  const T* data() const { return data_; }
-  T* data() { return data_; }
-
-  // TODO(FIDL-245) Remove this overload.
-  T* mutable_data() { return data_; }
-
-  const T& at(size_t offset) const { return data()[offset]; }
-  T& at(size_t offset) { return mutable_data()[offset]; }
-
-  const T& operator[](size_t offset) const { return at(offset); }
-  T& operator[](size_t offset) { return at(offset); }
-
-  T* begin() { return mutable_data(); }
-  const T* begin() const { return data(); }
-  const T* cbegin() const { return data(); }
-
-  T* end() { return mutable_data() + count(); }
-  const T* end() const { return data() + count(); }
-  const T* cend() const { return data() + count(); }
-
- private:
-  static_assert(N > 0, "fid::Array cannot have zero elements.");
-
-  T data_[N];
-};
-
-template <typename T, size_t N>
-bool operator==(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  for (size_t i = 0; i < N; ++i) {
-    if (!Equals(lhs[i], rhs[i])) {
-      return false;
-    }
-  }
-  return true;
-}
-
-template <typename T, size_t N>
-bool operator!=(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  return !(lhs == rhs);
-}
-
-template <typename T, size_t N>
-bool operator<(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  for (size_t i = 0; i < N; i++) {
-    if (lhs[i] != rhs[i]) {
-      return lhs[i] < rhs[i];
-    }
-  }
-  return false;
-}
-
-template <typename T, size_t N>
-bool operator>(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  for (size_t i = 0; i < N; i++) {
-    if (lhs[i] != rhs[i]) {
-      return lhs[i] > rhs[i];
-    }
-  }
-  return false;
-}
-
-template <typename T, size_t N>
-bool operator<=(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  return !(lhs > rhs);
-}
-
-template <typename T, size_t N>
-bool operator>=(const Array<T, N>& lhs, const Array<T, N>& rhs) {
-  return !(lhs < rhs);
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_ARRAY_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/clone.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/clone.h
deleted file mode 100644
index 8c1c108..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/clone.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_CLONE_H_
-#define LIB_FIDL_CPP_CLONE_H_
-
-#include <lib/fidl/cpp/array.h>
-#include <zircon/assert.h>
-#include <memory>
-#include "lib/fidl/cpp/string.h"
-#include "lib/fidl/cpp/traits.h"
-#include "lib/fidl/cpp/vector.h"
-
-namespace fidl {
-
-#ifdef __Fuchsia__
-namespace internal {
-
-template <typename T>
-inline typename std::enable_if<zx::object_traits<T>::supports_duplication,
-                               zx_status_t>::type
-CloneKernelObject(const zx::object<T>& object, zx::object<T>* result) {
-  return object.duplicate(ZX_RIGHT_SAME_RIGHTS, result);
-}
-
-template <typename T>
-inline typename std::enable_if<!zx::object_traits<T>::supports_duplication,
-                               zx_status_t>::type
-CloneKernelObject(const zx::object<T>& object, zx::object<T>* result) {
-  return ZX_ERR_ACCESS_DENIED;
-}
-
-}  // namespace internal
-#endif  // __Fuchsia__
-
-// Deep copies the contents of |value| into |result|.
-// This operation also attempts to duplicate any handles the value contains.
-//
-// Returns an error if the value could not be cloned, perhaps because a
-// handle was not duplicable.
-//
-// There are many overloads of this function with the following signature:
-//   zx_status_t Clone(const T& value, T* result);
-template <typename T>
-inline typename std::enable_if<IsPrimitive<T>::value, zx_status_t>::type Clone(
-    const T& value, T* result) {
-  *result = value;
-  return ZX_OK;
-}
-
-template <typename T>
-inline
-#ifdef __Fuchsia__
-    typename std::enable_if<!IsPrimitive<T>::value &&
-                                !std::is_base_of<zx::object_base, T>::value,
-                            zx_status_t>::type
-#else   // __Fuchsia__
-    typename std::enable_if<!IsPrimitive<T>::value, zx_status_t>::type
-#endif  // __Fuchsia__
-    Clone(const T& value, T* result) {
-  return value.Clone(result);
-}
-
-#ifdef __Fuchsia__
-template <typename T>
-zx_status_t Clone(const zx::object<T>& value, zx::object<T>* result) {
-  if (!value) {
-    result->reset();
-    return ZX_OK;
-  }
-  return internal::CloneKernelObject(value, result);
-}
-#endif  // __Fuchsia__
-
-template <typename T>
-inline zx_status_t Clone(const std::unique_ptr<T>& value,
-                         std::unique_ptr<T>* result) {
-  if (!value) {
-    result->reset();
-    return ZX_OK;
-  }
-  *result = std::make_unique<T>();
-  return Clone(*value, result->get());
-}
-
-template <typename T>
-inline typename std::enable_if<!IsPrimitive<T>::value, zx_status_t>::type Clone(
-    const VectorPtr<T>& value, VectorPtr<T>* result) {
-  if (!value) {
-    *result = VectorPtr<T>();
-    return ZX_OK;
-  }
-  result->resize(value->size());
-  for (size_t i = 0; i < value->size(); ++i) {
-    zx_status_t status = Clone(value->at(i), &(*result)->at(i));
-    if (status != ZX_OK)
-      return status;
-  }
-  return ZX_OK;
-}
-
-template <typename T>
-inline typename std::enable_if<IsPrimitive<T>::value, zx_status_t>::type Clone(
-    const VectorPtr<T>& value, VectorPtr<T>* result) {
-  if (!value) {
-    *result = VectorPtr<T>();
-    return ZX_OK;
-  }
-  result->reset(*value);
-  return ZX_OK;
-}
-
-template <typename T, size_t N>
-inline zx_status_t Clone(const Array<T, N>& value, Array<T, N>* result) {
-  for (size_t i = 0; i < N; ++i) {
-    zx_status_t status = Clone(value[i], &result->at(i));
-    if (status != ZX_OK)
-      return status;
-  }
-  return ZX_OK;
-}
-
-zx_status_t Clone(const StringPtr& value, StringPtr* result);
-
-// Returns a deep copy of |value|.
-// This operation also attempts to duplicate any handles the value contains.
-//
-// Crashes the program if the value could not be cloned, perhaps because a
-// handle was not duplicable.
-template <typename T>
-inline T Clone(const T& value) {
-  T clone;
-  zx_status_t status = Clone(value, &clone);
-  ZX_ASSERT(status == ZX_OK);
-  return clone;
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_CODING_TRAITS_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/coding_traits.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/coding_traits.h
deleted file mode 100644
index 0a51f5a..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/coding_traits.h
+++ /dev/null
@@ -1,165 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_CODING_TRAITS_H_
-#define LIB_FIDL_CPP_CODING_TRAITS_H_
-
-#include <lib/fidl/cpp/array.h>
-
-#include <memory>
-
-#include "lib/fidl/cpp/decoder.h"
-#include "lib/fidl/cpp/encoder.h"
-#include "lib/fidl/cpp/traits.h"
-#include "lib/fidl/cpp/vector.h"
-
-namespace fidl {
-
-template <typename T, class Enable = void>
-struct CodingTraits;
-
-template <typename T>
-struct CodingTraits<T, typename std::enable_if<IsPrimitive<T>::value>::type> {
-  static constexpr size_t encoded_size = sizeof(T);
-  inline static void Encode(Encoder* encoder, T* value, size_t offset) {
-    *encoder->GetPtr<T>(offset) = *value;
-  }
-  inline static void Decode(Decoder* decoder, T* value, size_t offset) {
-    *value = *decoder->GetPtr<T>(offset);
-  }
-};
-
-template <>
-struct CodingTraits<bool> {
-  static constexpr size_t encoded_size = sizeof(bool);
-  inline static void Encode(Encoder* encoder, bool* value, size_t offset) {
-    *encoder->GetPtr<bool>(offset) = *value;
-  }
-  inline static void Encode(Encoder* encoder, std::vector<bool>::iterator value,
-                            size_t offset) {
-    *encoder->GetPtr<bool>(offset) = *value;
-  }
-  inline static void Decode(Decoder* decoder, bool* value, size_t offset) {
-    *value = *decoder->GetPtr<bool>(offset);
-  }
-  inline static void Decode(Decoder* decoder, std::vector<bool>::iterator value,
-                            size_t offset) {
-    *value = *decoder->GetPtr<bool>(offset);
-  }
-};
-
-#ifdef __Fuchsia__
-template <typename T>
-struct CodingTraits<T, typename std::enable_if<
-                           std::is_base_of<zx::object_base, T>::value>::type> {
-  static constexpr size_t encoded_size = sizeof(zx_handle_t);
-  static void Encode(Encoder* encoder, zx::object_base* value, size_t offset) {
-    encoder->EncodeHandle(value, offset);
-  }
-  static void Decode(Decoder* decoder, zx::object_base* value, size_t offset) {
-    decoder->DecodeHandle(value, offset);
-  }
-};
-#endif
-
-template <typename T>
-struct CodingTraits<std::unique_ptr<T>> {
-  static constexpr size_t encoded_size = sizeof(uintptr_t);
-  static void Encode(Encoder* encoder, std::unique_ptr<T>* value,
-                     size_t offset) {
-    if (value->get()) {
-      *encoder->GetPtr<uintptr_t>(offset) = FIDL_ALLOC_PRESENT;
-      size_t size = CodingTraits<T>::encoded_size;
-      CodingTraits<T>::Encode(encoder, value->get(), encoder->Alloc(size));
-    } else {
-      *encoder->GetPtr<uintptr_t>(offset) = FIDL_ALLOC_ABSENT;
-    }
-  }
-  static void Decode(Decoder* decoder, std::unique_ptr<T>* value,
-                     size_t offset) {
-    uintptr_t ptr = *decoder->GetPtr<uintptr_t>(offset);
-    if (!ptr)
-      return value->reset();
-    *value = std::make_unique<T>();
-    CodingTraits<T>::Decode(decoder, value->get(), decoder->GetOffset(ptr));
-  }
-};
-
-void EncodeNullVector(Encoder* encoder, size_t offset);
-void EncodeVectorPointer(Encoder* encoder, size_t count, size_t offset);
-
-template <typename T>
-struct CodingTraits<VectorPtr<T>> {
-  static constexpr size_t encoded_size = sizeof(fidl_vector_t);
-  static void Encode(Encoder* encoder, VectorPtr<T>* value, size_t offset) {
-    if (value->is_null())
-      return EncodeNullVector(encoder, offset);
-    size_t count = (*value)->size();
-    EncodeVectorPointer(encoder, count, offset);
-    size_t stride = CodingTraits<T>::encoded_size;
-    size_t base = encoder->Alloc(count * stride);
-    for (size_t i = 0; i < count; ++i)
-      CodingTraits<T>::Encode(encoder, &(*value)->at(i), base + i * stride);
-  }
-  static void Decode(Decoder* decoder, VectorPtr<T>* value, size_t offset) {
-    fidl_vector_t* encoded = decoder->GetPtr<fidl_vector_t>(offset);
-    if (!encoded->data) {
-      *value = VectorPtr<T>();
-      return;
-    }
-    value->resize(encoded->count);
-    size_t stride = CodingTraits<T>::encoded_size;
-    size_t base = decoder->GetOffset(encoded->data);
-    size_t count = encoded->count;
-    for (size_t i = 0; i < count; ++i)
-      CodingTraits<T>::Decode(decoder, &(*value)->at(i), base + i * stride);
-  }
-};
-
-template <typename T, size_t N>
-struct CodingTraits<Array<T, N>> {
-  static constexpr size_t encoded_size = CodingTraits<T>::encoded_size * N;
-  static void Encode(Encoder* encoder, Array<T, N>* value, size_t offset) {
-    size_t stride = CodingTraits<T>::encoded_size;
-    for (size_t i = 0; i < N; ++i)
-      CodingTraits<T>::Encode(encoder, &value->at(i), offset + i * stride);
-  }
-  static void Decode(Decoder* decoder, Array<T, N>* value, size_t offset) {
-    size_t stride = CodingTraits<T>::encoded_size;
-    for (size_t i = 0; i < N; ++i)
-      CodingTraits<T>::Decode(decoder, &value->at(i), offset + i * stride);
-  }
-};
-
-template <typename T, size_t EncodedSize>
-struct EncodableCodingTraits {
-  static constexpr size_t encoded_size = EncodedSize;
-  static void Encode(Encoder* encoder, T* value, size_t offset) {
-    value->Encode(encoder, offset);
-  }
-  static void Decode(Decoder* decoder, T* value, size_t offset) {
-    T::Decode(decoder, value, offset);
-  }
-};
-
-template <typename T>
-void Encode(Encoder* encoder, T* value, size_t offset) {
-  CodingTraits<T>::Encode(encoder, value, offset);
-}
-
-template <typename T>
-void Decode(Decoder* decoder, T* value, size_t offset) {
-  CodingTraits<T>::Decode(decoder, value, offset);
-}
-
-template <typename T>
-T DecodeAs(Decoder* decoder, size_t offset) {
-  T value;
-  Decode(decoder, &value, offset);
-  return value;
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_CODING_TRAITS_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/comparison.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/comparison.h
deleted file mode 100644
index f89f352..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/comparison.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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.
-
-#ifndef GARNET_PUBLIC_LIB_FIDL_CPP_COMPARISON_H_
-#define GARNET_PUBLIC_LIB_FIDL_CPP_COMPARISON_H_
-
-#include <memory>
-
-// Comparisons that uses structure equality on on std::unique_ptr instead of
-// pointer equality.
-namespace fidl {
-
-template <class T>
-inline bool Equals(const T& lhs, const T& rhs) {
-  return lhs == rhs;
-}
-
-template <class T>
-inline bool Equals(const std::unique_ptr<T>& lhs,
-                   const std::unique_ptr<T>& rhs) {
-  if (lhs == nullptr || rhs == nullptr) {
-    return rhs == lhs;
-  }
-  return Equals<T>(*lhs, *rhs);
-}
-
-}  // namespace fidl
-
-#endif  // GARNET_PUBLIC_LIB_FIDL_CPP_COMPARISON_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/decoder.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/decoder.h
deleted file mode 100644
index 119dcd0..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/decoder.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_DECODER_H_
-#define LIB_FIDL_CPP_DECODER_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <zircon/fidl.h>
-
-#ifdef __Fuchsia__
-#include <lib/zx/object.h>
-#endif
-
-namespace fidl {
-
-class Decoder {
- public:
-  explicit Decoder(Message message);
-  ~Decoder();
-
-  template <typename T>
-  T* GetPtr(size_t offset) {
-    return reinterpret_cast<T*>(InternalGetPtr(offset));
-  }
-
-  size_t GetOffset(void* ptr);
-  size_t GetOffset(uintptr_t ptr);
-
-#ifdef __Fuchsia__
-  void DecodeHandle(zx::object_base* value, size_t offset);
-#endif
-
- private:
-  uint8_t* InternalGetPtr(size_t offset);
-
-  Message message_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_DECODER_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/encoder.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/encoder.h
deleted file mode 100644
index 00f543e..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/encoder.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_ENCODER_H_
-#define LIB_FIDL_CPP_ENCODER_H_
-
-#include <lib/fidl/cpp/message.h>
-
-#ifdef __Fuchsia__
-#include <lib/zx/object.h>
-#endif
-
-#include <zircon/fidl.h>
-
-#include <vector>
-
-namespace fidl {
-
-class Encoder {
- public:
-  enum NoHeader { NO_HEADER };
-
-  explicit Encoder(uint32_t ordinal);
-  explicit Encoder(NoHeader) {}
-  ~Encoder();
-
-  size_t Alloc(size_t size);
-
-  template <typename T>
-  T* GetPtr(size_t offset) {
-    return reinterpret_cast<T*>(bytes_.data() + offset);
-  }
-
-#ifdef __Fuchsia__
-  void EncodeHandle(zx::object_base* value, size_t offset);
-#endif
-
-  Message GetMessage();
-
-  void Reset(uint32_t ordinal);
-
-  size_t CurrentLength() const { return bytes_.size(); }
-
-  size_t CurrentHandleCount() const { return handles_.size(); }
-
-  std::vector<uint8_t> TakeBytes() { return std::move(bytes_); }
-
- private:
-  void EncodeMessageHeader(uint32_t ordinal);
-
-  std::vector<uint8_t> bytes_;
-  std::vector<zx_handle_t> handles_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_ENCODER_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/internal/logging.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/internal/logging.h
deleted file mode 100644
index 4ed4132..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/internal/logging.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_LOGGING_H_
-#define LIB_FIDL_CPP_INTERNAL_LOGGING_H_
-
-#include <lib/fidl/cpp/message.h>
-
-namespace fidl {
-namespace internal {
-
-void ReportEncodingError(const Message& message, const fidl_type_t* type,
-                         const char* error_msg, const char* file, int line);
-
-void ReportDecodingError(const Message& message, const fidl_type_t* type,
-                         const char* error_msg, const char* file, int line);
-
-void ReportChannelWritingError(const Message& message, const fidl_type_t* type,
-                               zx_status_t status, const char* file, int line);
-
-#define FIDL_REPORT_ENCODING_ERROR(message, type, error_msg)            \
-  ::fidl::internal::ReportEncodingError((message), (type), (error_msg), \
-                                        __FILE__, __LINE__)
-
-#define FIDL_REPORT_DECODING_ERROR(message, type, error_msg)            \
-  ::fidl::internal::ReportDecodingError((message), (type), (error_msg), \
-                                        __FILE__, __LINE__)
-
-#define FIDL_REPORT_CHANNEL_WRITING_ERROR(message, type, status)           \
-  ::fidl::internal::ReportChannelWritingError((message), (type), (status), \
-                                              __FILE__, __LINE__)
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_LOGGING_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/object_coding.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/object_coding.h
deleted file mode 100644
index 202b266..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/object_coding.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-#include "coding_traits.h"
-#include "encoder.h"
-
-namespace fidl {
-
-template <class T>
-zx_status_t EncodeObject(T* object, std::vector<uint8_t>* output,
-                         const char** error_msg_out) {
-  Encoder encoder(Encoder::NO_HEADER);
-  object->Encode(&encoder, encoder.Alloc(CodingTraits<T>::encoded_size));
-  if (encoder.CurrentHandleCount() != 0) {
-    if (error_msg_out != nullptr) {
-      *error_msg_out = "Cannot encode handles with object encoding";
-    }
-    return ZX_ERR_INVALID_ARGS;
-  }
-  *output = encoder.TakeBytes();
-  return ZX_OK;
-}
-
-template <class T>
-zx_status_t DecodeObject(uint8_t* bytes, size_t bytes_length, T* object,
-                         const char** error_msg_out) {
-  Message msg(BytePart(bytes, bytes_length, bytes_length), HandlePart());
-  zx_status_t status = msg.Decode(T::FidlType, error_msg_out);
-  if (status != ZX_OK) {
-    return status;
-  }
-  Decoder decoder(std::move(msg));
-  T::Decode(&decoder, object, 0);
-  return ZX_OK;
-}
-
-template <class T>
-zx_status_t ValidateObject(uint8_t* bytes, size_t bytes_length, T* object,
-                           const char** error_msg_out) {
-  return Message(BytePart(bytes, bytes_length, bytes_length), HandlePart())
-      .Validate(T::FidlType, error_msg_out);
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/string.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/string.h
deleted file mode 100644
index 3318bb7..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/string.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_STRING_H_
-#define LIB_FIDL_CPP_STRING_H_
-
-#include <lib/fidl/cpp/builder.h>
-#include <lib/fidl/cpp/string_view.h>
-
-#include <iosfwd>
-#include <string>
-#include <utility>
-
-#include <zircon/assert.h>
-
-#include "lib/fidl/cpp/coding_traits.h"
-#include "lib/fidl/cpp/traits.h"
-
-namespace fidl {
-
-// A representation of a FIDL string that owns the memory for the string.
-//
-// A StringPtr has three states: (1) null, (2) empty, (3) contains a string. In
-// the second state, operations that return an std::string return the empty
-// std::string. The null and empty states can be distinguished using the
-// |is_null| and |operator bool| methods.
-class StringPtr {
- public:
-  StringPtr();
-  StringPtr(const StringPtr& other);
-  StringPtr(StringPtr&& other);
-  StringPtr(std::string str);
-  StringPtr(const char* str);
-  StringPtr(const char* str, size_t length);
-  ~StringPtr();
-
-  StringPtr& operator=(const StringPtr&);
-  StringPtr& operator=(StringPtr&& other);
-
-  // Accesses the underlying std::string object.
-  const std::string& get() const { return str_; }
-
-  // Stores the given std::string in this StringPtr.
-  //
-  // After this method returns, the StringPtr is non-null.
-  void reset(std::string str) {
-    str_ = std::move(str);
-    is_null_ = false;
-  }
-
-  // Causes this StringPtr to become null.
-  void reset() {
-    str_.clear();
-    is_null_ = true;
-  }
-
-  void swap(StringPtr& other) {
-    using std::swap;
-    swap(str_, other.str_);
-    swap(is_null_, other.is_null_);
-  }
-
-  // Whether this StringPtr is null.
-  //
-  // The null state is separate from the empty state.
-  bool is_null() const { return is_null_ && str_.empty(); }
-
-  // Tests as true if non-null, false if null.
-  explicit operator bool() const { return !is_null_; }
-
-  // Provides access to the underlying std::string.
-  std::string* operator->() { return &str_; }
-  const std::string* operator->() const { return &str_; }
-
-  // Provides access to the underlying std::string.
-  const std::string& operator*() const { return str_; }
-
-  operator const std::string&() const { return str_; }
-
-  void Encode(Encoder* encoder, size_t offset);
-  static void Decode(Decoder* decoder, StringPtr* value, size_t offset);
-
- private:
-  std::string str_;
-  bool is_null_;
-};
-
-inline bool operator==(const StringPtr& a, const StringPtr& b) {
-  if (a.is_null()) {
-    return b.is_null();
-  }
-  return !b.is_null() && a.get() == b.get();
-}
-
-inline bool operator==(const char* a, const StringPtr& b) {
-  if (a == nullptr) {
-    return b.is_null();
-  }
-  return !b.is_null() && a == b.get();
-}
-
-inline bool operator==(const StringPtr& a, const char* b) {
-  if (a.is_null()) {
-    return b == nullptr;
-  }
-  return b != nullptr && a.get() == b;
-}
-
-inline bool operator!=(const StringPtr& a, const StringPtr& b) {
-  return !(a == b);
-}
-
-inline bool operator!=(const char* a, const StringPtr& b) { return !(a == b); }
-
-inline bool operator!=(const StringPtr& a, const char* b) { return !(a == b); }
-
-inline bool operator<(const StringPtr& a, const StringPtr& b) {
-  if (a.is_null() || b.is_null()) {
-    return !b.is_null();
-  }
-  return *a < *b;
-}
-
-inline bool operator<(const char* a, const StringPtr& b) {
-  if (a == nullptr || b.is_null()) {
-    return !b.is_null();
-  }
-  return a < *b;
-}
-
-inline bool operator<(const StringPtr& a, const char* b) {
-  if (a.is_null() || b == nullptr) {
-    return b != nullptr;
-  }
-  return *a < b;
-}
-
-inline bool operator>(const StringPtr& a, const StringPtr& b) {
-  if (a.is_null() || b.is_null()) {
-    return !a.is_null();
-  }
-  return *a > *b;
-}
-
-inline bool operator>(const char* a, const StringPtr& b) {
-  if (a == nullptr || b.is_null()) {
-    return a != nullptr;
-  }
-  return a > *b;
-}
-
-inline bool operator>(const StringPtr& a, const char* b) {
-  if (a.is_null() || b == nullptr) {
-    return a != nullptr;
-  }
-  return *a > b;
-}
-
-inline bool operator<=(const StringPtr& a, const StringPtr& b) {
-  return !(a > b);
-}
-
-inline bool operator<=(const char* a, const StringPtr& b) { return !(a > b); }
-
-inline bool operator<=(const StringPtr& a, const char* b) { return !(a > b); }
-
-inline bool operator>=(const StringPtr& a, const StringPtr& b) {
-  return !(a < b);
-}
-
-inline bool operator>=(const char* a, const StringPtr& b) { return !(a < b); }
-
-inline bool operator>=(const StringPtr& a, const char* b) { return !(a < b); }
-
-inline std::ostream& operator<<(std::ostream& out, const StringPtr& str) {
-  return out << str.get();
-}
-
-template <>
-struct CodingTraits<StringPtr>
-    : public EncodableCodingTraits<StringPtr, sizeof(fidl_string_t)> {};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_STRING_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/traits.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/traits.h
deleted file mode 100644
index 9ce7b3a..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/traits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_TRAITS_H_
-#define LIB_FIDL_CPP_TRAITS_H_
-
-#include <stdint.h>
-
-#include <type_traits>
-
-namespace fidl {
-
-// A type trait that indiciates whether the given type is a primitive FIDL
-// type.
-template <typename T>
-struct IsPrimitive : public std::false_type {};
-
-// clang-format off
-template <> struct IsPrimitive<bool> : public std::true_type {};
-template <> struct IsPrimitive<uint8_t> : public std::true_type {};
-template <> struct IsPrimitive<uint16_t> : public std::true_type {};
-template <> struct IsPrimitive<uint32_t> : public std::true_type {};
-template <> struct IsPrimitive<uint64_t> : public std::true_type {};
-template <> struct IsPrimitive<int8_t> : public std::true_type {};
-template <> struct IsPrimitive<int16_t> : public std::true_type {};
-template <> struct IsPrimitive<int32_t> : public std::true_type {};
-template <> struct IsPrimitive<int64_t> : public std::true_type {};
-template <> struct IsPrimitive<float> : public std::true_type {};
-template <> struct IsPrimitive<double> : public std::true_type {};
-// clang-format on
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_TRAITS_H_
diff --git a/pkg/fidl_cpp_base/include/lib/fidl/cpp/vector.h b/pkg/fidl_cpp_base/include/lib/fidl/cpp/vector.h
deleted file mode 100644
index 02d718c..0000000
--- a/pkg/fidl_cpp_base/include/lib/fidl/cpp/vector.h
+++ /dev/null
@@ -1,183 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_VECTOR_H_
-#define LIB_FIDL_CPP_VECTOR_H_
-
-#include <lib/fidl/cpp/builder.h>
-#include <lib/fidl/cpp/comparison.h>
-#include <lib/fidl/cpp/vector_view.h>
-
-#include <utility>
-#include <vector>
-
-#include <zircon/assert.h>
-
-#include "lib/fidl/cpp/traits.h"
-
-namespace fidl {
-
-// A representation of a FIDL vector that owns the memory for the vector.
-//
-// A VectorPtr has three states: (1) null, (2) empty, (3) contains data.  You
-// can check for the null state using the |is_null| method.
-template <typename T>
-class VectorPtr {
- public:
-  VectorPtr() : is_null_if_empty_(true) {}
-  ~VectorPtr() = default;
-  VectorPtr(std::nullptr_t) : is_null_if_empty_(true) {}
-  explicit VectorPtr(size_t size)
-      : vec_(std::vector<T>(size)), is_null_if_empty_(false) {}
-  explicit VectorPtr(std::vector<T> vec)
-      : vec_(std::move(vec)), is_null_if_empty_(false) {}
-
-  VectorPtr(const VectorPtr&) = delete;
-  VectorPtr& operator=(const VectorPtr&) = delete;
-
-  VectorPtr(VectorPtr&& other) = default;
-  VectorPtr& operator=(VectorPtr&& other) = default;
-
-  // Creates a VectorPtr of the given size.
-  //
-  // Equivalent to using the |VectorPtr(size_t)| constructor.
-  static VectorPtr New(size_t size) { return VectorPtr(size); }
-
-  // Accesses the underlying std::vector object.
-  const std::vector<T>& get() const { return vec_; }
-
-  // Takes the std::vector from the VectorPtr.
-  //
-  // After this method returns, the VectorPtr is null.
-  std::vector<T> take() {
-    is_null_if_empty_ = true;
-    return std::move(vec_);
-  }
-
-  // Stores the given std::vector in this VectorPtr.
-  //
-  // After this method returns, the VectorPtr is non-null.
-  void reset(std::vector<T> vec) {
-    vec_ = std::move(vec);
-    is_null_if_empty_ = false;
-  }
-
-  void reset() {
-    vec_.clear();
-    is_null_if_empty_ = true;
-  }
-
-  // Resizes the underlying std::vector in this VectorPtr to the given size.
-  //
-  // After this method returns, the VectorPtr is non-null.
-  void resize(size_t size) {
-    vec_.resize(size);
-    is_null_if_empty_ = false;
-  }
-
-  // Pushes |value| onto the back of this VectorPtr.
-  //
-  // If this vector was null, it will become non-null with a size of 1.
-  void push_back(const T& value) {
-    vec_.push_back(value);
-    is_null_if_empty_ = false;
-  }
-
-  // Pushes |value| onto the back of this VectorPtr.
-  //
-  // If this vector was null, it will become non-null with a size of 1.
-  void push_back(T&& value) {
-    vec_.push_back(std::forward<T>(value));
-    is_null_if_empty_ = false;
-  }
-
-  void swap(VectorPtr& other) {
-    using std::swap;
-    swap(vec_, other.vec_);
-    swap(is_null_if_empty_, other.is_null_if_empty_);
-  }
-
-  // Returns a copy of this VectorPtr.
-  //
-  // Unlike fidl::Clone, this function can never fail. However, this function
-  // works only if T is copiable.
-  VectorPtr Clone() const {
-    if (is_null())
-      return VectorPtr();
-    return VectorPtr(vec_);
-  }
-
-  // Whether this VectorPtr is null.
-  //
-  // The null state is separate from the empty state.
-  bool is_null() const { return is_null_if_empty_ && vec_.empty(); }
-
-  // Tests as true if non-null, false if null.
-  explicit operator bool() const { return !is_null(); }
-
-  // Provides access to the underlying std::vector.
-  std::vector<T>* operator->() { return &vec_; }
-  const std::vector<T>* operator->() const { return &vec_; }
-
-  // Provides access to the underlying std::vector.
-  std::vector<T>& operator*() { return vec_; }
-  const std::vector<T>& operator*() const { return vec_; }
-
-  operator const std::vector<T>&() const { return vec_; }
-
- private:
-  std::vector<T> vec_;
-  bool is_null_if_empty_;
-};
-
-template <class T>
-inline bool operator==(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  if (lhs.is_null() || rhs.is_null()) {
-    return lhs.is_null() == rhs.is_null();
-  }
-  if (lhs->size() != rhs->size()) {
-    return false;
-  }
-  for (size_t i = 0; i < lhs->size(); ++i) {
-    if (!Equals(lhs->at(i), rhs->at(i))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-template <class T>
-inline bool operator!=(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-template <class T>
-inline bool operator<(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  if (lhs.is_null() || rhs.is_null()) {
-    return !rhs.is_null();
-  }
-  return *lhs < *rhs;
-}
-
-template <class T>
-inline bool operator>(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  if (lhs.is_null() || rhs.is_null()) {
-    return !lhs.is_null();
-  }
-  return *lhs > *rhs;
-}
-
-template <class T>
-inline bool operator<=(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  return !(lhs > rhs);
-}
-
-template <class T>
-inline bool operator>=(const VectorPtr<T>& lhs, const VectorPtr<T>& rhs) {
-  return !(lhs < rhs);
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_VECTOR_H_
diff --git a/pkg/fidl_cpp_base/internal/logging.cc b/pkg/fidl_cpp_base/internal/logging.cc
deleted file mode 100644
index c9fd77d..0000000
--- a/pkg/fidl_cpp_base/internal/logging.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/logging.h"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-namespace fidl {
-namespace internal {
-
-void ReportEncodingError(const Message& message, const fidl_type_t* type,
-                         const char* error_msg, const char* file, int line) {
-  char type_name[1024];
-  size_t type_name_length =
-      fidl_format_type_name(type, type_name, sizeof(type_name));
-  fprintf(stderr,
-          "fidl encoding error at %s:%d: %s, "
-          "type %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
-          file, line, error_msg, static_cast<int>(type_name_length), type_name,
-          message.bytes().actual(), message.handles().actual());
-}
-
-void ReportDecodingError(const Message& message, const fidl_type_t* type,
-                         const char* error_msg, const char* file, int line) {
-  char type_name[1024];
-  size_t type_name_length =
-      fidl_format_type_name(type, type_name, sizeof(type_name));
-  fprintf(stderr,
-          "fidl decoding error at %s:%d: %s, "
-          "type %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
-          file, line, error_msg, static_cast<int>(type_name_length), type_name,
-          message.bytes().actual(), message.handles().actual());
-}
-
-void ReportChannelWritingError(const Message& message, const fidl_type_t* type,
-                               zx_status_t status, const char* file, int line) {
-  char type_name[1024];
-  size_t type_name_length =
-      fidl_format_type_name(type, type_name, sizeof(type_name));
-  fprintf(stderr,
-          "fidl channel writing error at %s:%d: zx_status_t %d, "
-          "type %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
-          file, line, status, static_cast<int>(type_name_length), type_name,
-          message.bytes().actual(), message.handles().actual());
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_base/meta.json b/pkg/fidl_cpp_base/meta.json
deleted file mode 100644
index 29eb264..0000000
--- a/pkg/fidl_cpp_base/meta.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "deps": [
-    "fit", 
-    "fidl", 
-    "fidl-async", 
-    "zx"
-  ], 
-  "fidl_deps": [], 
-  "headers": [
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/array.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/clone.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/coding_traits.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/comparison.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/decoder.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/encoder.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/internal/logging.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/object_coding.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/string.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/traits.h", 
-    "pkg/fidl_cpp_base/include/lib/fidl/cpp/vector.h"
-  ], 
-  "include_dir": "pkg/fidl_cpp_base/include", 
-  "name": "fidl_cpp_base", 
-  "root": "pkg/fidl_cpp_base", 
-  "sources": [
-    "pkg/fidl_cpp_base/clone.cc", 
-    "pkg/fidl_cpp_base/coding_traits.cc", 
-    "pkg/fidl_cpp_base/decoder.cc", 
-    "pkg/fidl_cpp_base/encoder.cc", 
-    "pkg/fidl_cpp_base/internal/logging.cc", 
-    "pkg/fidl_cpp_base/string.cc"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/fidl_cpp_base/string.cc b/pkg/fidl_cpp_base/string.cc
deleted file mode 100644
index 35b8f46..0000000
--- a/pkg/fidl_cpp_base/string.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/string.h"
-
-#include <string.h>
-
-#include "lib/fidl/cpp/encoder.h"
-
-namespace fidl {
-
-StringPtr::StringPtr() : is_null_(true) {}
-
-StringPtr::StringPtr(const StringPtr& other) = default;
-
-StringPtr::StringPtr(std::string str) : str_(std::move(str)), is_null_(false) {}
-
-StringPtr::StringPtr(const char* str)
-    : str_(str ? std::string(str) : std::string()), is_null_(!str) {}
-
-StringPtr::StringPtr(const char* str, size_t length)
-    : str_(str ? std::string(str, length) : std::string()), is_null_(!str) {}
-
-StringPtr::~StringPtr() = default;
-
-StringPtr::StringPtr(StringPtr&& other)
-    : str_(std::move(other.str_)), is_null_(other.is_null_) {}
-
-StringPtr& StringPtr::operator=(const StringPtr& other) = default;
-
-StringPtr& StringPtr::operator=(StringPtr&& other) {
-  str_ = std::move(other.str_);
-  is_null_ = other.is_null_;
-  return *this;
-}
-
-void StringPtr::Encode(Encoder* encoder, size_t offset) {
-  fidl_string_t* string = encoder->GetPtr<fidl_string_t>(offset);
-  if (is_null()) {
-    string->size = 0u;
-    string->data = reinterpret_cast<char*>(FIDL_ALLOC_ABSENT);
-  } else {
-    string->size = str_.size();
-    string->data = reinterpret_cast<char*>(FIDL_ALLOC_PRESENT);
-    size_t base = encoder->Alloc(str_.size());
-    char* payload = encoder->GetPtr<char>(base);
-    memcpy(payload, str_.data(), str_.size());
-  }
-}
-
-void StringPtr::Decode(Decoder* decoder, StringPtr* value, size_t offset) {
-  fidl_string_t* string = decoder->GetPtr<fidl_string_t>(offset);
-  if (string->data) {
-    value->reset(std::string(string->data, string->size));
-  } else {
-    *value = StringPtr();
-  }
-}
-
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_handle.h b/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_handle.h
deleted file mode 100644
index 2257a00..0000000
--- a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_handle.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERFACE_HANDLE_H_
-#define LIB_FIDL_CPP_INTERFACE_HANDLE_H_
-
-#include <lib/zx/channel.h>
-#include <zircon/assert.h>
-
-#include <cstddef>
-#include <utility>
-
-#include "lib/fidl/cpp/clone.h"
-#include "lib/fidl/cpp/coding_traits.h"
-#include "lib/fidl/cpp/interface_request.h"
-
-namespace fidl {
-class Builder;
-template <typename Interface>
-class InterfacePtr;
-template <typename Interface>
-class SynchronousInterfacePtr;
-
-// The client endpoint of a FIDL channel.
-//
-// The remote end of the channel expects this end of the channel to speak the
-// protocol associated with |Interface|. This type is the dual of
-// |InterfaceRequest|.
-//
-// Unlike an |InterfacePtr|, an |InterfaceHandle| does not have thread affinity
-// and can therefore be transferred to another thread or another process. To
-// create an |InterfacePtr| to send messages on this channel, call the |Bind()|
-// method, either on the |InterfaceHandle| or the |InterfacePtr| object.
-//
-// See also:
-//
-//  * |InterfaceRequest|, which is the server analog of an |InterfaceHandle|.
-template <typename Interface>
-class InterfaceHandle {
- public:
-  // Creates an |InterfaceHandle| whose underlying channel is invalid.
-  InterfaceHandle() = default;
-
-  // Creates an |InterfaceHandle| that wraps the given |channel|.
-  explicit InterfaceHandle(zx::channel channel)
-      : channel_(std::move(channel)) {}
-
-  InterfaceHandle(const InterfaceHandle& other) = delete;
-  InterfaceHandle& operator=(const InterfaceHandle& other) = delete;
-
-  InterfaceHandle(InterfaceHandle&& other)
-      : channel_(std::move(other.channel_)) {}
-
-  InterfaceHandle& operator=(InterfaceHandle&& other) {
-    channel_ = std::move(other.channel_);
-    return *this;
-  }
-
-  // Implicit conversion from nullptr to an |InterfaceHandle| without a valid
-  // |channel|.
-  InterfaceHandle(std::nullptr_t) {}
-
-  // Implicit conversion from |InterfacePtr| unbinds the channel from the
-  // |InterfacePtr|.
-  //
-  // Making this constructor templated ensures that it is not type-instantiated
-  // unless it is used, making the InterfacePtr<->InterfaceHandle codependency
-  // less fragile.
-  template <typename InterfacePtr = InterfacePtr<Interface>>
-  InterfaceHandle(InterfacePtr&& ptr) {
-    *this = ptr.Unbind();
-  }
-
-  // Creates a new channel, retains one endpoint in this |InterfaceHandle| and
-  // returns the other as an |InterfaceRequest|.
-  //
-  // Typically, the returned |InterfaceRequest| is passed to another process,
-  // which will implement the server endpoint for the |Interface| protocol.
-  //
-  // If |NewRequest| fails to create the underlying channel, the returned
-  // |InterfaceRequest| will return false from |is_valid()|.
-  InterfaceRequest<Interface> NewRequest() {
-    zx::channel h1, h2;
-    if (zx::channel::create(0, &h1, &h2) != ZX_OK)
-      return nullptr;
-    channel_ = std::move(h1);
-    return InterfaceRequest<Interface>(std::move(h2));
-  }
-
-  // Creates an |InterfacePtr| bound to the channel in this |InterfaceHandle|.
-  //
-  // This function transfers ownership of the underlying channel to the
-  // returned |InterfacePtr|, which means the |is_valid()| method will return
-  // false after this method returns.
-  //
-  // Requires the current thread to have a default async_t (e.g., a message
-  // loop) in order to read messages from the channel and to monitor the
-  // channel for |ZX_CHANNEL_PEER_CLOSED|.
-  //
-  // Making this method templated ensures that it is not type-instantiated
-  // unless it is used, making the InterfacePtr<->InterfaceHandle codependency
-  // less fragile.
-  template <typename InterfacePtr = InterfacePtr<Interface>>
-  inline InterfacePtr Bind() {
-    InterfacePtr ptr;
-    ptr.Bind(std::move(channel_));
-    return ptr;
-  }
-
-  template <typename SyncInterfacePtr = SynchronousInterfacePtr<Interface>>
-  inline SyncInterfacePtr BindSync() {
-    SyncInterfacePtr ptr;
-    ptr.Bind(std::move(channel_));
-    return ptr;
-  }
-
-  // Whether the underlying channel is valid.
-  bool is_valid() const { return !!channel_; }
-  explicit operator bool() const { return is_valid(); }
-
-  // Transfers ownership of the underlying channel to the caller.
-  zx::channel TakeChannel() { return std::move(channel_); }
-
-  // The underlying channel.
-  const zx::channel& channel() const { return channel_; }
-  void set_channel(zx::channel channel) { channel_ = std::move(channel); }
-
-  void Encode(Encoder* encoder, size_t offset) {
-    encoder->EncodeHandle(&channel_, offset);
-  }
-
-  static void Decode(Decoder* decoder, InterfaceHandle<Interface>* value,
-                     size_t offset) {
-    decoder->DecodeHandle(&value->channel_, offset);
-  }
-
- private:
-  zx::channel channel_;
-};
-
-// Equality.
-template <typename T>
-bool operator==(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return lhs.channel() == rhs.channel();
-}
-template <typename T>
-bool operator!=(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-// Comparisons.
-template <typename T>
-bool operator<(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return lhs.channel() < rhs.channel();
-}
-template <typename T>
-bool operator>(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return lhs.channel() > rhs.channel();
-}
-template <typename T>
-bool operator<=(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return !(lhs > rhs);
-}
-template <typename T>
-bool operator>=(const InterfaceHandle<T>& lhs, const InterfaceHandle<T>& rhs) {
-  return !(lhs < rhs);
-}
-
-template <typename T>
-struct CodingTraits<InterfaceHandle<T>>
-    : public EncodableCodingTraits<InterfaceHandle<T>, sizeof(zx_handle_t)> {};
-
-template <typename T>
-inline zx_status_t Clone(const InterfaceHandle<T>& value,
-                         InterfaceHandle<T>* result) {
-  if (!value) {
-    *result = InterfaceHandle<T>();
-    return ZX_OK;
-  }
-  return ZX_ERR_ACCESS_DENIED;
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERFACE_HANDLE_H_
diff --git a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_request.h b/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_request.h
deleted file mode 100644
index 45af19c..0000000
--- a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_request.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERFACE_REQUEST_H_
-#define LIB_FIDL_CPP_INTERFACE_REQUEST_H_
-
-#include <lib/fit/function.h>
-#include <lib/zx/channel.h>
-
-#include <cstddef>
-#include <utility>
-
-#include "lib/fidl/cpp/clone.h"
-#include "lib/fidl/cpp/coding_traits.h"
-
-namespace fidl {
-class Builder;
-
-// The server endpoint of a FIDL channel.
-//
-// The remote end of the channel expects this end of the channel to speak the
-// protocol associated with |Interface|. This type is the dual of
-// |InterfaceHandle|.
-//
-// An |InterfaceRequest| does not have thread affinity and can therefore be
-// transferred to another thread or another process. To bind an implementation
-// of |Interface| to this |InterfaceRequest|, use a |Binding| object.
-//
-// Typically, |InterfaceRequest| objects are created by a prospective client of
-// |Interface|, which then sends the |InterfaceRequest| to another process to
-// request that the remote process implement the |Interface|. This pattern
-// enables *pipelined* operation, in which the client can start calling methods
-// on an associated |InterfacePtr| immediately, before the |InterfaceRequest|
-// has reached the remote process and been bound to an implementation. These
-// method calls are buffered by the underlying channel until they are read by
-// the remote process.
-//
-// Example:
-//
-//   #include "foo.fidl.h"
-//
-//   class FooImpl : public Foo {
-//    public:
-//     explicit FooImpl(InterfaceRequest<Foo> request)
-//         : binding_(this, std::move(request)) {}
-//
-//     // Foo implementation here.
-//
-//    private:
-//     Binding<Foo> binding_;
-//   };
-//
-// After the |InterfaceRequest| has been bound to an implementation, the
-// implementation will receive method calls from the remote endpoint of the
-// channel on the thread on which the |InterfaceRequest| was bound.
-//
-// See also:
-//
-//  * |InterfaceHandle|, which is the client analog of an |InterfaceRequest|.
-template <typename Interface>
-class InterfaceRequest {
- public:
-  // Creates an |InterfaceHandle| whose underlying channel is invalid.
-  //
-  // Some protocols contain messages that permit such |InterfaceRequest|
-  // objects, which indicate that the client is not interested in the server
-  // providing an implementation of |Interface|.
-  InterfaceRequest() = default;
-
-  // Creates an |InterfaceHandle| that wraps the given |channel|.
-  explicit InterfaceRequest(zx::channel channel)
-      : channel_(std::move(channel)) {}
-
-  InterfaceRequest(const InterfaceRequest& other) = delete;
-  InterfaceRequest& operator=(const InterfaceRequest& other) = delete;
-
-  InterfaceRequest(InterfaceRequest&& other)
-      : channel_(std::move(other.channel_)) {}
-
-  InterfaceRequest& operator=(InterfaceRequest&& other) {
-    channel_ = std::move(other.channel_);
-    return *this;
-  }
-
-  // Implicit conversion from nullptr to an |InterfaceRequest| without an
-  // invalid |channel|.
-  InterfaceRequest(std::nullptr_t) {}
-
-  // Whether the underlying channel is valid.
-  bool is_valid() const { return !!channel_; }
-  explicit operator bool() const { return is_valid(); }
-
-  // Transfers ownership of the underlying channel to the caller.
-  zx::channel TakeChannel() { return std::move(channel_); }
-
-  // The underlying channel.
-  const zx::channel& channel() const { return channel_; }
-  void set_channel(zx::channel channel) { channel_ = std::move(channel); }
-
-  void Encode(Encoder* encoder, size_t offset) {
-    encoder->EncodeHandle(&channel_, offset);
-  }
-
-  static void Decode(Decoder* decoder, InterfaceRequest<Interface>* value,
-                     size_t offset) {
-    decoder->DecodeHandle(&value->channel_, offset);
-  }
-
- private:
-  zx::channel channel_;
-};
-
-// A |InterfaceRequestHandler<Interface>| is simply a function that
-// handles an interface request for |Interface|. If it determines that the
-// request should be "accepted", then it should "connect" ("take ownership
-// of") request. Otherwise, it can simply drop |request| (as implied by the
-// interface).
-template <typename Interface>
-using InterfaceRequestHandler =
-    fit::function<void(fidl::InterfaceRequest<Interface> request)>;
-
-// Equality.
-template <typename T>
-bool operator==(const InterfaceRequest<T>& lhs,
-                const InterfaceRequest<T>& rhs) {
-  return lhs.channel() == rhs.channel();
-}
-template <typename T>
-bool operator!=(const InterfaceRequest<T>& lhs,
-                const InterfaceRequest<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-// Comparaisons.
-template <typename T>
-bool operator<(const InterfaceRequest<T>& lhs, const InterfaceRequest<T>& rhs) {
-  return lhs.channel() < rhs.channel();
-}
-template <typename T>
-bool operator>(const InterfaceRequest<T>& lhs, const InterfaceRequest<T>& rhs) {
-  return lhs.channel() > rhs.channel();
-}
-template <typename T>
-bool operator<=(const InterfaceRequest<T>& lhs,
-                const InterfaceRequest<T>& rhs) {
-  return !(lhs > rhs);
-}
-template <typename T>
-bool operator>=(const InterfaceRequest<T>& lhs,
-                const InterfaceRequest<T>& rhs) {
-  return !(lhs < rhs);
-}
-
-template <typename T>
-struct CodingTraits<InterfaceRequest<T>>
-    : public EncodableCodingTraits<InterfaceRequest<T>, sizeof(zx_handle_t)> {};
-
-template <typename T>
-inline zx_status_t Clone(const InterfaceRequest<T>& value,
-                         InterfaceRequest<T>* result) {
-  if (!value) {
-    *result = InterfaceRequest<T>();
-    return ZX_OK;
-  }
-  return ZX_ERR_ACCESS_DENIED;
-}
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERFACE_REQUEST_H_
diff --git a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/internal/synchronous_proxy.h b/pkg/fidl_cpp_sync/include/lib/fidl/cpp/internal/synchronous_proxy.h
deleted file mode 100644
index ee77c99..0000000
--- a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/internal/synchronous_proxy.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_INTERNAL_SYNCHRONOUS_PROXY_H_
-#define LIB_FIDL_CPP_INTERNAL_SYNCHRONOUS_PROXY_H_
-
-#include <lib/fidl/cpp/message.h>
-#include <lib/zx/channel.h>
-#include <zircon/fidl.h>
-
-namespace fidl {
-namespace internal {
-
-// Manages the client state for a synchronous interface.
-//
-// A |SynchronousProxy| manages the client state for a sychronous interface.
-// This object validates messages before sending them to the remote endpoint,
-// and (optionally) blocks until it receives a reply.
-//
-// This object is thread-safe.
-class SynchronousProxy {
- public:
-  // Creates a |SynchronousProxy| that wraps the given channel.
-  explicit SynchronousProxy(zx::channel channel);
-  ~SynchronousProxy();
-
-  // Returns the underlying channel from this object.
-  //
-  // The |SynchronousProxy| does not attempt to synchronize this operation with
-  // |Send| or |Call|.
-  zx::channel TakeChannel();
-
-  // Validates that |message| matches the given |type| and sends the message
-  // through the underlying channel.
-  //
-  // Does not block.
-  //
-  // Returns an error if validation or writing fails.
-  zx_status_t Send(const fidl_type_t* type, Message message);
-
-  // Validate that |request| matches the given |request_type| and sends
-  // |request| through the underlying channel. Blocks until it receives a
-  // response, which is then decoded according to |response_type| and returned
-  // in |response_type|.
-  //
-  // Blocks until the remote endpoint replied.
-  //
-  // Returns an error if validation, writing, reading, or decoding fails.
-  zx_status_t Call(const fidl_type_t* request_type,
-                   const fidl_type_t* response_type, Message request,
-                   Message* response);
-
- private:
-  zx::channel channel_;
-};
-
-}  // namespace internal
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_INTERNAL_SYNCHRONOUS_PROXY_H_
diff --git a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/synchronous_interface_ptr.h b/pkg/fidl_cpp_sync/include/lib/fidl/cpp/synchronous_interface_ptr.h
deleted file mode 100644
index 7f9ff6c..0000000
--- a/pkg/fidl_cpp_sync/include/lib/fidl/cpp/synchronous_interface_ptr.h
+++ /dev/null
@@ -1,185 +0,0 @@
-// 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.
-
-#ifndef LIB_FIDL_CPP_SYNCHRONOUS_INTERFACE_PTR_H_
-#define LIB_FIDL_CPP_SYNCHRONOUS_INTERFACE_PTR_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <utility>
-
-#include "lib/fidl/cpp/interface_handle.h"
-
-namespace fidl {
-
-// A synchronous client interface to a remote implementation of |Interface|.
-//
-// An |SynchronousInterfacePtr| implements |Interface| by proxying calls through
-// a |channel| to a remote implementation of |Interface|. Method calls on the
-// |Interface| proxy are encoded and sent through the bound channel to the
-// remote endpoint, which processes them. If the method has a reply (including
-// any empty reply), the client blocks and waits for the remote endpoint to
-// reply.
-//
-// You need to bind the |SynchronousInterfacePtr| before calling any |Interface|
-// methods. There are a number of ways to bind the |SynchronousInterfacePtr|.
-// See |NewRequest|, |Bind|, and the |BindSync| method on |InterfaceHandle|.
-//
-// This class is thread-compatible. Once bound, the |SynchronousInterfacePtr|
-// can be used from multiple threads simultaneously. However, the
-// |SynchronousInterfacePtr| does not attempt to synchronize mutating operatios,
-// such as |Bind| or |Unbind|.
-//
-// |SynchronousInterfacePtr| does not require a |async_t| implementation and
-// does not bind to the default |async_dispatcher_t*| for the current thread,
-// unlike |InterfacePtr|.
-//
-// See also:
-//
-//  * |Binding|, which is the server analog of an |SynchronousInterfacePtr|.
-//  * |InterfacePtr|, which is an asynchronous interface to a remote
-//    implementation.
-template <typename Interface>
-class SynchronousInterfacePtr {
- public:
-  using InterfaceSync = typename Interface::Sync_;
-
-  // Creates an unbound |SynchronousInterfacePtr|.
-  SynchronousInterfacePtr() {}
-  SynchronousInterfacePtr(std::nullptr_t) {}
-
-  SynchronousInterfacePtr(const SynchronousInterfacePtr& other) = delete;
-  SynchronousInterfacePtr& operator=(const SynchronousInterfacePtr& other) =
-      delete;
-
-  SynchronousInterfacePtr(SynchronousInterfacePtr&& other) = default;
-  SynchronousInterfacePtr& operator=(SynchronousInterfacePtr&& other) = default;
-
-  // Bind the |SynchronousInterfacePtr| to one endpoint of a newly created
-  // channel and return the other endpoint as an |InterfaceRequest|.
-  //
-  // Typically, the returned |InterfaceRequest| will be sent to a remote process
-  // to be bound to an implementation of |Interface| using a |Binding| object.
-  //
-  // After calling this method, clients can start calling methods on this
-  // |SynchronousInterfacePtr|. However, methods that have replies will block
-  // until the remote implementation binds the |InterfaceRequest| and replies.
-  //
-  // # Example
-  //
-  // Given the following interface:
-  //
-  //   interface Database {
-  //     OpenTable(request<Table> table);
-  //   };
-  //
-  // The client can use the |NewRequest| method to create the |InterfaceRequest|
-  // object needed by the |OpenTable| method:
-  //
-  //   DatabasePtr database = ...;  // Connect to database.
-  //   TableSyncPtr table;
-  //   database->OpenTable(table.NewRequest());
-  //
-  // The client can call methods on |table| immediately. Messages that have
-  // replies will block until the Database implementation binds a Table
-  // implementation and replies.
-  InterfaceRequest<Interface> NewRequest() {
-    zx::channel h1;
-    zx::channel h2;
-    if (zx::channel::create(0, &h1, &h2) != ZX_OK)
-      return nullptr;
-    Bind(std::move(h1));
-    return InterfaceRequest<Interface>(std::move(h2));
-  }
-
-  // Binds the |SynchronousInterfacePtr| to the given |channel|.
-  //
-  // The |SynchronousInterfacePtr| expects the remote end of the |channel| to
-  // speak the protocol defined by |Interface|. Unlike the |Bind| overload that
-  // takes a |InterfaceHandle| parameter, this |Bind| overload lacks type
-  // safety.
-  //
-  // If the |SynchronousInterfacePtr| was prevously bound to another channel,
-  // that channel is closed. If the |channel| is invalid, then this method will
-  // effectively unbind the |SynchronousInterfacePtr|. A more direct way to have
-  // that effect is to call |Unbind|.
-  //
-  // Does not require the current thread to have a default async_t.
-  void Bind(zx::channel channel) {
-    if (!channel) {
-      proxy_.reset();
-      return;
-    }
-    proxy_.reset(new typename InterfaceSync::Proxy_(std::move(channel)));
-  }
-
-  // Binds the |SynchronousInterfacePtr| to the given |InterfaceHandle|.
-  //
-  // The |SynchronousInterfacePtr| expects the remote end of the |channel| to
-  // speak the protocol defined by |Interface|. Unlike the |Bind| overload that
-  // takes a |channel| parameter, this |Bind| overload provides type safety.
-  //
-  // If the |SynchronousInterfacePtr| was prevously bound to another channel,
-  // that channel is closed. If the |InterfaceHandle| is invalid, then this
-  // method will effectively unbind the |SynchronousInterfacePtr|. A more direct
-  // way to have that effect is to call |Unbind|.
-  //
-  // Does not require the current thread to have a default async_t.
-  void Bind(InterfaceHandle<Interface> handle) {
-    return Bind(handle.TakeChannel());
-  }
-
-  // Unbinds the underlying channel from the |SynchronousInterfacePtr|.
-  //
-  // The underlying channel is returned as an |InterfaceHandle|, which is safe
-  // to transport to another thread or process.
-  //
-  // After this method returns, a subsequent call to |Bind| is required before
-  // calling any additional |Interface| methods.
-  InterfaceHandle<Interface> Unbind() {
-    InterfaceHandle<Interface> handle(proxy_->proxy().TakeChannel());
-    proxy_.reset();
-    return handle;
-  }
-
-  // Whether this |SynchronousInterfacePtr| is currently bound to a channel.
-  //
-  // If the |SynchronousInterfacePtr| is bound to a channel, calls to
-  // |Interface| methods are proxied to the remote endpoint of the channel.
-  //
-  // See also:
-  //
-  //  * |Bind|, which binds a channel to this |SynchronousInterfacePtr|.
-  //  * |Unbind|, which unbinds a channel from this |SynchronousInterfacePtr|.
-  bool is_bound() const { return static_cast<bool>(proxy_); }
-
-  // Whether this |SynchronousInterfacePtr| is currently bound to a channel.
-  //
-  // See |is_bound| for details.
-  explicit operator bool() const { return is_bound(); }
-
-  // The |Interface| proxy associated with this |SynchronousInterfacePtr|.
-  //
-  // When this |SynchronousInterfacePtr| is bound, method calls on this
-  // |Interface| will be proxied to the remote endpoint of the connection.
-  // Methods that expect replies will block until the
-  // |SynchronousInterfacePtr| either receives a reply to that transaction.
-  //
-  // When this |SynchronousInterfacePtr| is not bound, this method returns
-  // nullptr.
-  //
-  // The returned |Interface| is thread-compatible and can be used from any
-  // thread.
-  InterfaceSync* get() const { return proxy_.get(); }
-  InterfaceSync* operator->() const { return get(); }
-  InterfaceSync& operator*() const { return *get(); }
-
- private:
-  std::unique_ptr<typename InterfaceSync::Proxy_> proxy_;
-};
-
-}  // namespace fidl
-
-#endif  // LIB_FIDL_CPP_SYNCHRONOUS_INTERFACE_PTR_H_
diff --git a/pkg/fidl_cpp_sync/internal/synchronous_proxy.cc b/pkg/fidl_cpp_sync/internal/synchronous_proxy.cc
deleted file mode 100644
index 0e42e56..0000000
--- a/pkg/fidl_cpp_sync/internal/synchronous_proxy.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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.
-
-#include "lib/fidl/cpp/internal/synchronous_proxy.h"
-
-#include <memory>
-#include <utility>
-
-#include "lib/fidl/cpp/internal/logging.h"
-
-namespace fidl {
-namespace internal {
-
-SynchronousProxy::SynchronousProxy(zx::channel channel)
-    : channel_(std::move(channel)) {}
-
-SynchronousProxy::~SynchronousProxy() = default;
-
-zx::channel SynchronousProxy::TakeChannel() { return std::move(channel_); }
-
-zx_status_t SynchronousProxy::Send(const fidl_type_t* type, Message message) {
-  const char* error_msg = nullptr;
-  zx_status_t status = message.Validate(type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_ENCODING_ERROR(message, type, error_msg);
-    return status;
-  }
-  return message.Write(channel_.get(), 0);
-}
-
-zx_status_t SynchronousProxy::Call(const fidl_type_t* request_type,
-                                   const fidl_type_t* response_type,
-                                   Message request, Message* response) {
-  const char* error_msg = nullptr;
-  zx_status_t status = request.Validate(request_type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_ENCODING_ERROR(request, request_type, error_msg);
-    return status;
-  }
-  status = request.Call(channel_.get(), 0, ZX_TIME_INFINITE, response);
-  if (status != ZX_OK)
-    return status;
-  status = response->Decode(response_type, &error_msg);
-  if (status != ZX_OK) {
-    FIDL_REPORT_DECODING_ERROR(*response, response_type, error_msg);
-    return status;
-  }
-  return ZX_OK;
-}
-
-}  // namespace internal
-}  // namespace fidl
diff --git a/pkg/fidl_cpp_sync/meta.json b/pkg/fidl_cpp_sync/meta.json
deleted file mode 100644
index c74ae9d..0000000
--- a/pkg/fidl_cpp_sync/meta.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "deps": [
-    "fidl_cpp_base", 
-    "fidl", 
-    "fidl-async", 
-    "fit", 
-    "zx"
-  ], 
-  "fidl_deps": [], 
-  "headers": [
-    "pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_handle.h", 
-    "pkg/fidl_cpp_sync/include/lib/fidl/cpp/interface_request.h", 
-    "pkg/fidl_cpp_sync/include/lib/fidl/cpp/internal/synchronous_proxy.h", 
-    "pkg/fidl_cpp_sync/include/lib/fidl/cpp/synchronous_interface_ptr.h"
-  ], 
-  "include_dir": "pkg/fidl_cpp_sync/include", 
-  "name": "fidl_cpp_sync", 
-  "root": "pkg/fidl_cpp_sync", 
-  "sources": [
-    "pkg/fidl_cpp_sync/internal/synchronous_proxy.cc"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/fit/barrier.cc b/pkg/fit/barrier.cc
new file mode 100644
index 0000000..76a8a71
--- /dev/null
+++ b/pkg/fit/barrier.cc
@@ -0,0 +1,26 @@
+// Copyright 2019 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.
+
+#include <lib/fit/barrier.h>
+
+namespace fit {
+
+barrier::barrier() {
+  // Capture a new consumer and intentionally abandon its associated
+  // completer so that a promise chained onto the consumer using
+  // |promise_or()| will become immediately runnable.
+  fit::bridge<> bridge;
+  prior_ = std::move(bridge.consumer);
+}
+
+barrier::~barrier() = default;
+
+fit::consumer<> barrier::swap_prior(fit::consumer<> new_prior) {
+  std::lock_guard<std::mutex> lock(mutex_);
+  fit::consumer<> old_prior = std::move(prior_);
+  prior_ = std::move(new_prior);
+  return old_prior;
+}
+
+}  // namespace fit
diff --git a/pkg/fit/include/lib/fit/barrier.h b/pkg/fit/include/lib/fit/barrier.h
new file mode 100644
index 0000000..59c3459
--- /dev/null
+++ b/pkg/fit/include/lib/fit/barrier.h
@@ -0,0 +1,106 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_BARRIER_H_
+#define LIB_FIT_BARRIER_H_
+
+#include <assert.h>
+
+#include <atomic>
+#include <mutex>
+
+#include "bridge.h"
+#include "promise.h"
+#include "thread_safety.h"
+
+namespace fit {
+
+// A barrier is utility class for monitoring pending promises and ensuring they have completed when
+// |barrier.sync| completes. This class is used to mark promises with |barrier.wrap|, without
+// changing their order, but allowing a caller to later invoke |sync| and ensure they have
+// completed.
+//
+// EXAMPLE
+//
+//      // Issue tracked work, wrapped by the barrier.
+//      fit::barrier barrier;
+//      auto work = fit::make_promise([] { do_work(); });
+//      executor.schedule_task(work.wrap_with(barrier));
+//
+//      auto more_work = fit::make_promise([] { do_work_but_more(); });
+//      executor.schedule_task(more_work.wrap_with(barrier));
+//
+//      // Ensure that all prior work completes, using the same barrier.
+//      barrier.sync().and_then([] {
+//          // |work| and |more_work| have been completed.
+//      });
+//
+// See documentation of |fit::promise| for more information.
+class barrier final {
+ public:
+  barrier();
+  ~barrier();
+
+  barrier(const barrier&) = delete;
+  barrier(barrier&&) = delete;
+  barrier& operator=(const barrier&) = delete;
+  barrier& operator=(barrier&&) = delete;
+
+  // Returns a new promise which, after invoking the original |promise|, may update sync() callers
+  // if they are waiting for all prior work to complete.
+  //
+  // This method is thread-safe.
+  template <typename Promise>
+  decltype(auto) wrap(Promise promise) {
+    assert(promise);
+
+    fit::bridge<> bridge;
+    auto prior = swap_prior(std::move(bridge.consumer));
+
+    // First, execute the originally provided promise.
+    //
+    // Note that execution of this original promise is not gated behind any interactions
+    // between other calls to |sync()| or |wrap()|.
+    return promise.then([prior = std::move(prior), completer = std::move(bridge.completer)](
+                            fit::context& context, typename Promise::result_type& result) mutable {
+      // Wait for all prior work to either terminate or be abandoned before terminating the
+      // completer.
+      //
+      // This means that when |sync()| invokes |swap_prior()|, that caller receives a chain
+      // of these promise-bound completer objects from all prior invocations of |wrap()|.
+      // When this chain completes, the sync promise can complete too, since it implies
+      // that all prior access to the barrier has completed.
+      context.executor()->schedule_task(prior.promise_or(fit::ok()).then(
+          [completer = std::move(completer)](const fit::result<>&) mutable { return; }));
+
+      return result;
+    });
+  }
+
+  // Returns a promise which completes after all previously wrapped work has completed.
+  //
+  // This method is thread-safe.
+  fit::promise<void, void> sync() {
+    // Swap the latest pending work with our own consumer; a subsequent request
+    // to sync should wait on this one.
+    fit::bridge<> bridge;
+    fit::consumer<> prior = swap_prior(std::move(bridge.consumer));
+    return prior.promise_or(fit::ok()).then(
+        [completer = std::move(bridge.completer)](const fit::result<>&) mutable {
+          return fit::make_ok_promise();
+        });
+  }
+
+ private:
+  fit::consumer<> swap_prior(fit::consumer<> new_prior);
+
+  std::mutex mutex_;
+
+  // Holds the consumption capability of the most recently wrapped promise.
+  fit::consumer<> prior_ FIT_GUARDED(mutex_);
+};
+
+}  // namespace fit
+
+#endif  // LIB_FIT_BARRIER_H_
diff --git a/pkg/fit/include/lib/fit/bridge.h b/pkg/fit/include/lib/fit/bridge.h
index 3fed908..08e0ddc 100644
--- a/pkg/fit/include/lib/fit/bridge.h
+++ b/pkg/fit/include/lib/fit/bridge.h
@@ -13,9 +13,9 @@
 // by the association of two distinct participants: a completer and a consumer.
 //
 // - The completer is responsible for reporting completion of an asynchronous
-//   task and providing its result.  See |completer()| and |fit::completer|.
+//   task and providing its result.  See |completer| and |fit::completer|.
 // - The consumer is responsible for consuming the result of the asynchronous
-//   task.  See |consumer()| and |fit::consumer|.
+//   task.  See |consumer| and |fit::consumer|.
 //
 // This class is often used for binding a |fit::promise| to a callback,
 // facilitating interoperation of promises with functions that asynchronously
@@ -41,7 +41,7 @@
 //
 // The consumption capability has a single owner represented by |fit::consumer|.
 // Its owner may exercise the capability to consume the task's result (as a
-/// promise), it may transfer the capability by moving it to another consumer
+// promise), it may transfer the capability by moving it to another consumer
 // instance, or it may cause the asynchronous task to be "canceled" by
 // discarding the capability, implying that the task's result can never be
 // consumed.  When this occurs, the associated completer's
@@ -50,7 +50,7 @@
 //
 // DECOUPLING
 //
-// See |fit::schedule_for_consumer()| for a helper which uses a bridge to
+// See |fit::schedule_for_consumer| for a helper which uses a bridge to
 // decouple completion and consumption of a task's result so they can be
 // performed on different executors.
 //
@@ -79,8 +79,8 @@
 //
 //     fit::promise<size_t> promise_read(uint8_t* buffer, size_t num_bytes) {
 //         fit::bridge<size_t> bridge;
-//         read_async(num_bytes, buffer, bridge.completer().bind());
-//         return bridge.consumer().promise_or(::fit::error());
+//         read_async(num_bytes, buffer, bridge.completer.bind());
+//         return bridge.consumer.promise_or(::fit::error());
 //     }
 //
 // Finally we can chain additional asynchronous tasks to be performed upon
@@ -89,7 +89,7 @@
 //     uint8_t buffer[4096];
 //     void my_program(fit::executor* executor) {
 //         auto promise = promise_read(buffer, sizeof(buffer))
-//             .and_then([] (size_t bytes_read) {
+//             .and_then([] (const size_t& bytes_read) {
 //                 // consume contents of buffer
 //             })
 //             .or_else() {
@@ -109,23 +109,23 @@
 //     fit::promise<size_t, int> promise_write(uint8_t* buffer, size_t num_bytes) {
 //         fit::bridge<size_t, int> bridge;
 //         write_async(num_bytes, buffer,
-//             [completer = std::move(bridge.completer())](size_t bytes_written, int error) {
+//             [completer = std::move(bridge.completer)](size_t bytes_written, int error) {
 //             if (bytes_written == 0) {
 //                 completer.complete_error(error);
 //                 return;
 //             }
 //             completer.complete_ok(bytes_written);
 //         });
-//         return bridge.consumer().promise_or(::fit::error(ERR_ABANDONED));
+//         return bridge.consumer.promise_or(::fit::error(ERR_ABANDONED));
 //     }
 //
 //     uint8_t buffer[4096];
 //     void my_program(fit::executor* executor) {
 //         auto promise = promise_write(buffer, sizeof(buffer))
-//             .and_then([] (size_t bytes_written) {
+//             .and_then([] (const size_t& bytes_written) {
 //                 // consume contents of buffer
 //             })
-//             .or_else(int error) {
+//             .or_else(const int& error) {
 //                 // handle error case
 //             });
 //         executor->schedule_task(std::move(promise));
@@ -134,42 +134,31 @@
 // See documentation of |fit::promise| for more information.
 template <typename V, typename E>
 class bridge final {
-    using bridge_state = ::fit::internal::bridge_state<V, E>;
+ public:
+  using value_type = V;
+  using error_type = E;
+  using result_type = result<value_type, error_type>;
+  using completer_type = ::fit::completer<V, E>;
+  using consumer_type = ::fit::consumer<V, E>;
 
-public:
-    using value_type = V;
-    using error_type = E;
-    using result_type = result<value_type, error_type>;
-    using completer_type = ::fit::completer<V, E>;
-    using consumer_type = ::fit::consumer<V, E>;
+  // Creates a bridge representing a new asynchronous task formed by the
+  // association of a completer and consumer.
+  bridge() {
+    ::fit::internal::bridge_state<V, E>::create(&completer.completion_ref_,
+                                                &consumer.consumption_ref_);
+  }
+  bridge(bridge&& other) = default;
+  bridge(const bridge& other) = delete;
+  ~bridge() = default;
 
-    // Creates a bridge representing a new asynchronous task formed by the
-    // association of a completer and consumer.
-    bridge() {
-        bridge_state::create(&completer_.completion_ref_,
-                             &consumer_.consumption_ref_);
-    }
-    bridge(bridge&& other) = default;
-    ~bridge() = default;
+  bridge& operator=(bridge&& other) = default;
+  bridge& operator=(const bridge& other) = delete;
 
-    bridge& operator=(bridge&& other) = default;
+  // The bridge's completer capability.
+  completer_type completer;
 
-    // Gets a reference to the bridge's completer capability.
-    // The completer can be moved out of the bridge, if desired.
-    completer_type& completer() { return completer_; }
-    const completer_type& completer() const { return completer_; }
-
-    // Gets a reference to the bridge's consumer capability.
-    // The consumer can be moved out of the bridge, if desired.
-    consumer_type& consumer() { return consumer_; }
-    const consumer_type& consumer() const { return consumer_; }
-
-    bridge(const bridge& other) = delete;
-    bridge& operator=(const bridge& other) = delete;
-
-private:
-    completer_type completer_;
-    consumer_type consumer_;
+  // The bridge's consumer capability.
+  consumer_type consumer;
 };
 
 // Provides a result upon completion of an asynchronous task.
@@ -194,130 +183,121 @@
 // Defaults to |void|.
 template <typename V, typename E>
 class completer final {
-    using bridge_state = ::fit::internal::bridge_state<V, E>;
-    using completion_ref = typename bridge_state::completion_ref;
+  using bridge_state = ::fit::internal::bridge_state<V, E>;
+  using completion_ref = typename bridge_state::completion_ref;
 
-public:
-    using value_type = V;
-    using error_type = E;
-    using result_type = ::fit::result<V, E>;
+ public:
+  using value_type = V;
+  using error_type = E;
+  using result_type = ::fit::result<V, E>;
 
-    completer() = default;
-    completer(completer&& other) = default;
-    ~completer() = default;
+  completer() = default;
+  completer(completer&& other) = default;
+  ~completer() = default;
 
-    completer& operator=(completer&& other) = default;
+  completer& operator=(completer&& other) = default;
 
-    // Returns true if this instance currently owns the unique capability for
-    // reporting completion of the task.
-    explicit operator bool() const { return !!completion_ref_; }
+  // Returns true if this instance currently owns the unique capability for
+  // reporting completion of the task.
+  explicit operator bool() const { return !!completion_ref_; }
 
-    // Returns true if the associated |consumer| has canceled the task.
-    // This method returns a snapshot of the current cancelation state.
-    // Note that the task may be canceled concurrently at any time.
-    bool was_canceled() const {
-        assert(completion_ref_);
-        return completion_ref_.get()->was_canceled();
-    }
+  // Returns true if the associated |consumer| has canceled the task.
+  // This method returns a snapshot of the current cancellation state.
+  // Note that the task may be canceled concurrently at any time.
+  bool was_canceled() const {
+    assert(completion_ref_);
+    return completion_ref_.get()->was_canceled();
+  }
 
-    // Explicitly abandons the task, meaning that it will never be completed.
-    // See |fit::bridge| for details about abandonment.
-    void abandon() {
-        assert(completion_ref_);
-        completion_ref_ = completion_ref();
-    }
+  // Explicitly abandons the task, meaning that it will never be completed.
+  // See |fit::bridge| for details about abandonment.
+  void abandon() {
+    assert(completion_ref_);
+    completion_ref_ = completion_ref();
+  }
 
-    // Reports that the task has completed successfully.
-    // This method takes no arguments if |value_type| is void, otherwise it
-    // takes one argument which must be assignable to |value_type|.
-    template <typename VV = value_type,
-              typename = std::enable_if_t<std::is_void<VV>::value>>
-    void complete_ok() {
-        assert(completion_ref_);
-        bridge_state* state = completion_ref_.get();
-        state->complete_or_abandon(std::move(completion_ref_),
-                                   ::fit::ok());
-    }
-    template <typename VV = value_type,
-              typename = std::enable_if_t<!std::is_void<VV>::value>>
-    void complete_ok(VV value) {
-        assert(completion_ref_);
-        bridge_state* state = completion_ref_.get();
-        state->complete_or_abandon(std::move(completion_ref_),
-                                   ::fit::ok<value_type>(std::forward<VV>(value)));
-    }
+  // Reports that the task has completed successfully.
+  // This method takes no arguments if |value_type| is void, otherwise it
+  // takes one argument which must be assignable to |value_type|.
+  template <typename VV = value_type, typename = std::enable_if_t<std::is_void<VV>::value>>
+  void complete_ok() {
+    assert(completion_ref_);
+    bridge_state* state = completion_ref_.get();
+    state->complete_or_abandon(std::move(completion_ref_), ::fit::ok());
+  }
+  template <typename VV = value_type, typename = std::enable_if_t<!std::is_void<VV>::value>>
+  void complete_ok(VV value) {
+    assert(completion_ref_);
+    bridge_state* state = completion_ref_.get();
+    state->complete_or_abandon(std::move(completion_ref_),
+                               ::fit::ok<value_type>(std::forward<VV>(value)));
+  }
 
-    // Reports that the task has completed with an error.
-    // This method takes no arguments if |error_type| is void, otherwise it
-    // takes one argument which must be assignable to |error_type|.
-    template <typename EE = error_type,
-              typename = std::enable_if_t<std::is_void<EE>::value>>
-    void complete_error() {
-        assert(completion_ref_);
-        bridge_state* state = completion_ref_.get();
-        state->complete_or_abandon(std::move(completion_ref_),
-                                   ::fit::error());
-    }
-    template <typename EE = error_type,
-              typename = std::enable_if_t<!std::is_void<EE>::value>>
-    void complete_error(EE error) {
-        assert(completion_ref_);
-        bridge_state* state = completion_ref_.get();
-        state->complete_or_abandon(std::move(completion_ref_),
-                                   ::fit::error<error_type>(std::forward<EE>(error)));
-    }
+  // Reports that the task has completed with an error.
+  // This method takes no arguments if |error_type| is void, otherwise it
+  // takes one argument which must be assignable to |error_type|.
+  template <typename EE = error_type, typename = std::enable_if_t<std::is_void<EE>::value>>
+  void complete_error() {
+    assert(completion_ref_);
+    bridge_state* state = completion_ref_.get();
+    state->complete_or_abandon(std::move(completion_ref_), ::fit::error());
+  }
+  template <typename EE = error_type, typename = std::enable_if_t<!std::is_void<EE>::value>>
+  void complete_error(EE error) {
+    assert(completion_ref_);
+    bridge_state* state = completion_ref_.get();
+    state->complete_or_abandon(std::move(completion_ref_),
+                               ::fit::error<error_type>(std::forward<EE>(error)));
+  }
 
-    // Reports that the task has completed or been abandoned.
-    // See |fit::bridge| for details about abandonment.
-    //
-    // The result state determines the task's final disposition.
-    // - |fit::result_state::ok|: The task completed successfully.
-    // - |fit::result_state::error|: The task completed with an error.
-    // - |fit::result_state::pending|: The task was abandoned.
-    void complete_or_abandon(result_type result) {
-        assert(completion_ref_);
-        bridge_state* state = completion_ref_.get();
-        state->complete_or_abandon(std::move(completion_ref_),
-                                   std::move(result));
-    }
+  // Reports that the task has completed or been abandoned.
+  // See |fit::bridge| for details about abandonment.
+  //
+  // The result state determines the task's final disposition.
+  // - |fit::result_state::ok|: The task completed successfully.
+  // - |fit::result_state::error|: The task completed with an error.
+  // - |fit::result_state::pending|: The task was abandoned.
+  void complete_or_abandon(result_type result) {
+    assert(completion_ref_);
+    bridge_state* state = completion_ref_.get();
+    state->complete_or_abandon(std::move(completion_ref_), std::move(result));
+  }
 
-    // Returns a callback that reports completion of the asynchronous task along
-    // with its result when invoked.  This method is typically used to bind
-    // completion of a task to a callback that has zero or one argument.
-    //
-    // If |value_type| is void, the returned callback's signature is: void(void)
-    // Otherwise, the returned callback's signature is: void(value_type).
-    //
-    // The returned callback is thread-safe and move-only.
-    ::fit::internal::bridge_bind_callback<V, E> bind() {
-        assert(completion_ref_);
-        return ::fit::internal::bridge_bind_callback<V, E>(
-            std::move(completion_ref_));
-    }
+  // Returns a callback that reports completion of the asynchronous task along
+  // with its result when invoked.  This method is typically used to bind
+  // completion of a task to a callback that has zero or one argument.
+  //
+  // If |value_type| is void, the returned callback's signature is: void(void)
+  // Otherwise, the returned callback's signature is: void(value_type).
+  //
+  // The returned callback is thread-safe and move-only.
+  ::fit::internal::bridge_bind_callback<V, E> bind() {
+    assert(completion_ref_);
+    return ::fit::internal::bridge_bind_callback<V, E>(std::move(completion_ref_));
+  }
 
-    // A variant of |bind()| that can be used to bind a completion of a task
-    // to a callback that has zero or more arguments by wrapping the callback's
-    // arguments into a tuple when producing the task's result.
-    //
-    // The |value_type| must be a tuple type.
-    // Given a |value_type| of std::tuple<Args...>, the returned callback's
-    // signature is: void(Args...).  Note that the tuple's fields are
-    // unpacked as individual arguments of the callback.
-    //
-    // The returned callback is thread-safe and move-only.
-    ::fit::internal::bridge_bind_tuple_callback<V, E> bind_tuple() {
-        assert(completion_ref_);
-        return ::fit::internal::bridge_bind_tuple_callback<V, E>(
-            std::move(completion_ref_));
-    }
+  // A variant of |bind()| that can be used to bind a completion of a task
+  // to a callback that has zero or more arguments by wrapping the callback's
+  // arguments into a tuple when producing the task's result.
+  //
+  // The |value_type| must be a tuple type.
+  // Given a |value_type| of std::tuple<Args...>, the returned callback's
+  // signature is: void(Args...).  Note that the tuple's fields are
+  // unpacked as individual arguments of the callback.
+  //
+  // The returned callback is thread-safe and move-only.
+  ::fit::internal::bridge_bind_tuple_callback<V, E> bind_tuple() {
+    assert(completion_ref_);
+    return ::fit::internal::bridge_bind_tuple_callback<V, E>(std::move(completion_ref_));
+  }
 
-    completer(const completer& other) = delete;
-    completer& operator=(const completer& other) = delete;
+  completer(const completer& other) = delete;
+  completer& operator=(const completer& other) = delete;
 
-private:
-    friend class bridge<V, E>;
+ private:
+  friend class bridge<V, E>;
 
-    completion_ref completion_ref_;
+  completion_ref completion_ref_;
 };
 
 // Consumes the result of an asynchronous task.
@@ -342,81 +322,78 @@
 // Defaults to |void|.
 template <typename V, typename E>
 class consumer final {
-    using bridge_state = ::fit::internal::bridge_state<V, E>;
-    using consumption_ref = typename bridge_state::consumption_ref;
+  using bridge_state = ::fit::internal::bridge_state<V, E>;
+  using consumption_ref = typename bridge_state::consumption_ref;
 
-public:
-    using value_type = V;
-    using error_type = E;
-    using result_type = ::fit::result<V, E>;
+ public:
+  using value_type = V;
+  using error_type = E;
+  using result_type = ::fit::result<V, E>;
 
-    consumer() = default;
-    consumer(consumer&& other) = default;
-    ~consumer() = default;
+  consumer() = default;
+  consumer(consumer&& other) = default;
+  ~consumer() = default;
 
-    consumer& operator=(consumer&& other) = default;
+  consumer& operator=(consumer&& other) = default;
 
-    // Returns true if this instance currently owns the unique capability for
-    // consuming the result of the task upon its completion.
-    explicit operator bool() const { return !!consumption_ref_; }
+  // Returns true if this instance currently owns the unique capability for
+  // consuming the result of the task upon its completion.
+  explicit operator bool() const { return !!consumption_ref_; }
 
-    // Explicitly cancels the task, meaning that its result will never be consumed.
-    // See |fit::bridge| for details about cancelation.
-    void cancel() {
-        assert(consumption_ref_);
-        consumption_ref_ = consumption_ref();
-    }
+  // Explicitly cancels the task, meaning that its result will never be consumed.
+  // See |fit::bridge| for details about cancellation.
+  void cancel() {
+    assert(consumption_ref_);
+    consumption_ref_ = consumption_ref();
+  }
 
-    // Returns true if the associated |completer| has abandoned the task.
-    // This method returns a snapshot of the current abandonment state.
-    // Note that the task may be abandoned concurrently at any time.
-    bool was_abandoned() const {
-        assert(consumption_ref_);
-        return consumption_ref_.get()->was_abandoned();
-    }
+  // Returns true if the associated |completer| has abandoned the task.
+  // This method returns a snapshot of the current abandonment state.
+  // Note that the task may be abandoned concurrently at any time.
+  bool was_abandoned() const {
+    assert(consumption_ref_);
+    return consumption_ref_.get()->was_abandoned();
+  }
 
-    // Returns an unboxed promise which resumes execution once this task has
-    // completed.  If the task is abandoned by its completer, the promise
-    // will not produce a result, thereby causing subsequent tasks associated
-    // with the promise to also be abandoned and eventually destroyed if
-    // they cannot make progress without the promised result.
-    promise_impl<typename bridge_state::promise_continuation>
-    promise() {
-        assert(consumption_ref_);
-        return make_promise_with_continuation(
-            typename bridge_state::promise_continuation(
-                std::move(consumption_ref_)));
-    }
+  // Returns an unboxed promise which resumes execution once this task has
+  // completed.  If the task is abandoned by its completer, the promise
+  // will not produce a result, thereby causing subsequent tasks associated
+  // with the promise to also be abandoned and eventually destroyed if
+  // they cannot make progress without the promised result.
+  promise_impl<typename bridge_state::promise_continuation> promise() {
+    assert(consumption_ref_);
+    return make_promise_with_continuation(
+        typename bridge_state::promise_continuation(std::move(consumption_ref_)));
+  }
 
-    // A variant of |promise()| that allows a default result to be provided when
-    // the task is abandoned by its completer.  Typically this is used to cause
-    // the promise to return an error when the task is abandoned instead of
-    // causing subsequent tasks associated with the promise to also be abandoned.
-    //
-    // The state of |result_if_abandoned| determines the promise's behavior
-    // in case of abandonment.
-    //
-    // - |fit::result_state::ok|: Reports a successful result.
-    // - |fit::result_state::error|: Reports a failure result.
-    // - |fit::result_state::pending|: Does not report a result, thereby
-    //   causing subsequent tasks associated with the promise to also be
-    //   abandoned and eventually destroyed if they cannot make progress
-    //   without the promised result.
-    promise_impl<typename bridge_state::promise_continuation>
-    promise_or(result_type result_if_abandoned) {
-        assert(consumption_ref_);
-        return make_promise_with_continuation(
-            typename bridge_state::promise_continuation(
-                std::move(consumption_ref_), std::move(result_if_abandoned)));
-    }
+  // A variant of |promise()| that allows a default result to be provided when
+  // the task is abandoned by its completer.  Typically this is used to cause
+  // the promise to return an error when the task is abandoned instead of
+  // causing subsequent tasks associated with the promise to also be abandoned.
+  //
+  // The state of |result_if_abandoned| determines the promise's behavior
+  // in case of abandonment.
+  //
+  // - |fit::result_state::ok|: Reports a successful result.
+  // - |fit::result_state::error|: Reports a failure result.
+  // - |fit::result_state::pending|: Does not report a result, thereby
+  //   causing subsequent tasks associated with the promise to also be
+  //   abandoned and eventually destroyed if they cannot make progress
+  //   without the promised result.
+  promise_impl<typename bridge_state::promise_continuation> promise_or(
+      result_type result_if_abandoned) {
+    assert(consumption_ref_);
+    return make_promise_with_continuation(typename bridge_state::promise_continuation(
+        std::move(consumption_ref_), std::move(result_if_abandoned)));
+  }
 
-    consumer(const consumer& other) = delete;
-    consumer& operator=(const consumer& other) = delete;
+  consumer(const consumer& other) = delete;
+  consumer& operator=(const consumer& other) = delete;
 
-private:
-    friend class bridge<V, E>;
+ private:
+  friend class bridge<V, E>;
 
-    consumption_ref consumption_ref_;
+  consumption_ref consumption_ref_;
 };
 
 // Schedules |promise| to run on |executor| and returns a |consumer| which
@@ -463,26 +440,23 @@
 //         executor->schedule_task(
 //             m->perform_calculation(16)
 //                 .promise_or(fit::error())
-//                 .and_then([] (int result) { printf("done: %d\n", result); })
+//                 .and_then([] (const int& result) { printf("done: %d\n", result); })
 //                 .or_else([] { puts("failed or abandoned"); }));
 //     }
 //
 template <typename Promise>
-inline consumer<typename Promise::value_type, typename Promise::error_type>
-schedule_for_consumer(fit::executor* executor, Promise promise) {
-    assert(executor);
-    assert(promise);
-    fit::bridge<typename Promise::value_type,
-                typename Promise::error_type>
-        bridge;
-    executor->schedule_task(
-        promise.then([completer = std::move(bridge.completer())](
-                         typename Promise::result_type& result) mutable {
-            completer.complete_or_abandon(std::move(result));
-        }));
-    return std::move(bridge.consumer());
+inline consumer<typename Promise::value_type, typename Promise::error_type> schedule_for_consumer(
+    fit::executor* executor, Promise promise) {
+  assert(executor);
+  assert(promise);
+  fit::bridge<typename Promise::value_type, typename Promise::error_type> bridge;
+  executor->schedule_task(promise.then(
+      [completer = std::move(bridge.completer)](typename Promise::result_type& result) mutable {
+        completer.complete_or_abandon(std::move(result));
+      }));
+  return std::move(bridge.consumer);
 }
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_BRIDGE_H_
+#endif  // LIB_FIT_BRIDGE_H_
diff --git a/pkg/fit/include/lib/fit/bridge_internal.h b/pkg/fit/include/lib/fit/bridge_internal.h
index 8f805ee..fe8b321 100644
--- a/pkg/fit/include/lib/fit/bridge_internal.h
+++ b/pkg/fit/include/lib/fit/bridge_internal.h
@@ -36,203 +36,184 @@
 // - When both refs are dropped, the bridge state is destroyed.
 template <typename V, typename E>
 class bridge_state final {
-public:
-    class completion_ref;
-    class consumption_ref;
-    class promise_continuation;
+ public:
+  class completion_ref;
+  class consumption_ref;
+  class promise_continuation;
 
-    using result_type = result<V, E>;
+  using result_type = result<V, E>;
 
-    ~bridge_state() = default;
+  ~bridge_state() = default;
 
-    static void create(completion_ref* out_completion_ref,
-                       consumption_ref* out_consumption_ref);
+  static void create(completion_ref* out_completion_ref, consumption_ref* out_consumption_ref);
 
-    bool was_canceled() const;
-    bool was_abandoned() const;
-    void complete_or_abandon(completion_ref ref, result_type result);
+  bool was_canceled() const;
+  bool was_abandoned() const;
+  void complete_or_abandon(completion_ref ref, result_type result);
 
-    bridge_state(const bridge_state&) = delete;
-    bridge_state(bridge_state&&) = delete;
-    bridge_state& operator=(const bridge_state&) = delete;
-    bridge_state& operator=(bridge_state&&) = delete;
+  bridge_state(const bridge_state&) = delete;
+  bridge_state(bridge_state&&) = delete;
+  bridge_state& operator=(const bridge_state&) = delete;
+  bridge_state& operator=(bridge_state&&) = delete;
 
-private:
-    enum class disposition {
-        pending,
-        abandoned,
-        completed,
-        canceled,
-        returned
-    };
+ private:
+  enum class disposition { pending, abandoned, completed, canceled, returned };
 
-    bridge_state() = default;
+  bridge_state() = default;
 
-    void drop_completion_ref(bool was_completed);
-    void drop_consumption_ref(bool was_consumed);
-    void drop_ref_and_maybe_delete_self();
-    void set_result_if_abandoned(result_type result_if_abandoned);
-    result_type await_result(consumption_ref* ref, ::fit::context& context);
-    void deliver_result() FIT_REQUIRES(mutex_);
+  void drop_completion_ref(bool was_completed);
+  void drop_consumption_ref(bool was_consumed);
+  void drop_ref_and_maybe_delete_self();
+  void set_result_if_abandoned(result_type result_if_abandoned);
+  result_type await_result(consumption_ref* ref, ::fit::context& context);
 
-    mutable std::mutex mutex_;
+  mutable std::mutex mutex_;
 
-    // Ref-count for completion and consumption.
-    // There can only be one of each ref type so the initial count is 2.
-    std::atomic<uint32_t> ref_count_{2};
+  // Ref-count for completion and consumption.
+  // There can only be one of each ref type so the initial count is 2.
+  std::atomic<uint32_t> ref_count_{2};
 
-    // The disposition of the bridge.
-    disposition disposition_ FIT_GUARDED(mutex_) = {disposition::pending};
+  // The disposition of the bridge.
+  // TODO(fxbug.dev/4139): It should be possible to implement a lock-free algorithm
+  // so as to eliminate the re-entrance hazards by introducing additional
+  // intermediate dispositions such that |task_| and |result| could be
+  // safely accessed while in those states.
+  disposition disposition_ FIT_GUARDED(mutex_) = {disposition::pending};
 
-    // The suspended task.
-    // Invariant: Only valid when disposition is |pending|.
-    suspended_task task_ FIT_GUARDED(mutex_);
+  // The suspended task.
+  // Invariant: Only valid when disposition is |pending|.
+  suspended_task task_ FIT_GUARDED(mutex_);
 
-    // The result in flight.
-    // Invariant: Only valid when disposition is |pending|, |completed|,
-    // or |abandoned|.
-    result_type result_ FIT_GUARDED(mutex_);
+  // The result in flight.
+  // Invariant: Only valid when disposition is |pending|, |completed|,
+  // or |abandoned|.
+  result_type result_ FIT_GUARDED(mutex_);
 };
 
 // The unique capability held by a bridge's completer.
 template <typename V, typename E>
 class bridge_state<V, E>::completion_ref final {
-public:
-    completion_ref()
-        : state_(nullptr) {}
+ public:
+  completion_ref() : state_(nullptr) {}
 
-    explicit completion_ref(bridge_state* state)
-        : state_(state) {} // adopts existing reference
+  explicit completion_ref(bridge_state* state) : state_(state) {}  // adopts existing reference
 
-    completion_ref(completion_ref&& other)
-        : state_(other.state_) {
-        other.state_ = nullptr;
-    }
+  completion_ref(completion_ref&& other) : state_(other.state_) { other.state_ = nullptr; }
 
-    ~completion_ref() {
-        if (state_)
-            state_->drop_completion_ref(false /*was_completed*/);
-    }
+  ~completion_ref() {
+    if (state_)
+      state_->drop_completion_ref(false /*was_completed*/);
+  }
 
-    completion_ref& operator=(completion_ref&& other) {
-        if (&other == this)
-            return *this;
-        if (state_)
-            state_->drop_completion_ref(false /*was_completed*/);
-        state_ = other.state_;
-        other.state_ = nullptr;
-        return *this;
-    }
+  completion_ref& operator=(completion_ref&& other) {
+    if (&other == this)
+      return *this;
+    if (state_)
+      state_->drop_completion_ref(false /*was_completed*/);
+    state_ = other.state_;
+    other.state_ = nullptr;
+    return *this;
+  }
 
-    explicit operator bool() const { return !!state_; }
+  explicit operator bool() const { return !!state_; }
 
-    bridge_state* get() const { return state_; }
+  bridge_state* get() const { return state_; }
 
-    void drop_after_completion() {
-        state_->drop_completion_ref(true /*was_completed*/);
-        state_ = nullptr;
-    }
+  void drop_after_completion() {
+    state_->drop_completion_ref(true /*was_completed*/);
+    state_ = nullptr;
+  }
 
-    completion_ref(const completion_ref& other) = delete;
-    completion_ref& operator=(const completion_ref& other) = delete;
+  completion_ref(const completion_ref& other) = delete;
+  completion_ref& operator=(const completion_ref& other) = delete;
 
-private:
-    bridge_state* state_;
+ private:
+  bridge_state* state_;
 };
 
 // The unique capability held by a bridge's consumer.
 template <typename V, typename E>
 class bridge_state<V, E>::consumption_ref final {
-public:
-    consumption_ref()
-        : state_(nullptr) {}
+ public:
+  consumption_ref() : state_(nullptr) {}
 
-    explicit consumption_ref(bridge_state* state)
-        : state_(state) {} // adopts existing reference
+  explicit consumption_ref(bridge_state* state) : state_(state) {}  // adopts existing reference
 
-    consumption_ref(consumption_ref&& other)
-        : state_(other.state_) {
-        other.state_ = nullptr;
-    }
+  consumption_ref(consumption_ref&& other) : state_(other.state_) { other.state_ = nullptr; }
 
-    ~consumption_ref() {
-        if (state_)
-            state_->drop_consumption_ref(false /*was_consumed*/);
-    }
+  ~consumption_ref() {
+    if (state_)
+      state_->drop_consumption_ref(false /*was_consumed*/);
+  }
 
-    consumption_ref& operator=(consumption_ref&& other) {
-        if (&other == this)
-            return *this;
-        if (state_)
-            state_->drop_consumption_ref(false /*was_consumed*/);
-        state_ = other.state_;
-        other.state_ = nullptr;
-        return *this;
-    }
+  consumption_ref& operator=(consumption_ref&& other) {
+    if (&other == this)
+      return *this;
+    if (state_)
+      state_->drop_consumption_ref(false /*was_consumed*/);
+    state_ = other.state_;
+    other.state_ = nullptr;
+    return *this;
+  }
 
-    explicit operator bool() const { return !!state_; }
+  explicit operator bool() const { return !!state_; }
 
-    bridge_state* get() const { return state_; }
+  bridge_state* get() const { return state_; }
 
-    void drop_after_consumption() {
-        state_->drop_consumption_ref(true /*was_consumed*/);
-        state_ = nullptr;
-    }
+  void drop_after_consumption() {
+    state_->drop_consumption_ref(true /*was_consumed*/);
+    state_ = nullptr;
+  }
 
-    consumption_ref(const consumption_ref& other) = delete;
-    consumption_ref& operator=(const consumption_ref& other) = delete;
+  consumption_ref(const consumption_ref& other) = delete;
+  consumption_ref& operator=(const consumption_ref& other) = delete;
 
-private:
-    bridge_state* state_;
+ private:
+  bridge_state* state_;
 };
 
 // The continuation produced by |consumer::promise()| and company.
 template <typename V, typename E>
 class bridge_state<V, E>::promise_continuation final {
-public:
-    explicit promise_continuation(consumption_ref ref)
-        : ref_(std::move(ref)) {}
+ public:
+  explicit promise_continuation(consumption_ref ref) : ref_(std::move(ref)) {}
 
-    promise_continuation(consumption_ref ref,
-                         result_type result_if_abandoned)
-        : ref_(std::move(ref)) {
-        ref_.get()->set_result_if_abandoned(std::move(result_if_abandoned));
-    }
+  promise_continuation(consumption_ref ref, result_type result_if_abandoned)
+      : ref_(std::move(ref)) {
+    ref_.get()->set_result_if_abandoned(std::move(result_if_abandoned));
+  }
 
-    result_type operator()(::fit::context& context) {
-        return ref_.get()->await_result(&ref_, context);
-    }
+  result_type operator()(::fit::context& context) {
+    return ref_.get()->await_result(&ref_, context);
+  }
 
-private:
-    consumption_ref ref_;
+ private:
+  consumption_ref ref_;
 };
 
 // The callback produced by |completer::bind()|.
 template <typename V, typename E>
 class bridge_bind_callback final {
-    using bridge_state = bridge_state<V, E>;
+  using callback_bridge_state = bridge_state<V, E>;
 
-public:
-    explicit bridge_bind_callback(typename bridge_state::completion_ref ref)
-        : ref_(std::move(ref)) {}
+ public:
+  explicit bridge_bind_callback(typename callback_bridge_state::completion_ref ref)
+      : ref_(std::move(ref)) {}
 
-    template <typename VV = V,
-              typename = std::enable_if_t<std::is_void<VV>::value>>
-    void operator()() {
-        bridge_state* state = ref_.get();
-        state->complete_or_abandon(std::move(ref_), ::fit::ok());
-    }
+  template <typename VV = V, typename = std::enable_if_t<std::is_void<VV>::value>>
+  void operator()() {
+    callback_bridge_state* state = ref_.get();
+    state->complete_or_abandon(std::move(ref_), ::fit::ok());
+  }
 
-    template <typename VV = V,
-              typename = std::enable_if_t<!std::is_void<VV>::value>>
-    void operator()(VV value) {
-        bridge_state* state = ref_.get();
-        state->complete_or_abandon(std::move(ref_),
-                                   ::fit::ok<V>(std::forward<VV>(value)));
-    }
+  template <typename VV = V, typename = std::enable_if_t<!std::is_void<VV>::value>>
+  void operator()(VV value) {
+    callback_bridge_state* state = ref_.get();
+    state->complete_or_abandon(std::move(ref_), ::fit::ok<V>(std::forward<VV>(value)));
+  }
 
-private:
-    typename bridge_state::completion_ref ref_;
+ private:
+  typename callback_bridge_state::completion_ref ref_;
 };
 
 // The callback produced by |completer::bind_tuple()|.
@@ -240,154 +221,169 @@
 class bridge_bind_tuple_callback;
 template <typename... Args, typename E>
 class bridge_bind_tuple_callback<std::tuple<Args...>, E> final {
-    using bridge_state = bridge_state<std::tuple<Args...>, E>;
+  using tuple_callback_bridge_state = bridge_state<std::tuple<Args...>, E>;
 
-public:
-    explicit bridge_bind_tuple_callback(typename bridge_state::completion_ref ref)
-        : ref_(std::move(ref)) {}
+ public:
+  explicit bridge_bind_tuple_callback(typename tuple_callback_bridge_state::completion_ref ref)
+      : ref_(std::move(ref)) {}
 
-    void operator()(Args... args) {
-        bridge_state* state = ref_.get();
-        state->complete_or_abandon(
-            std::move(ref_),
-            ::fit::ok(std::make_tuple<Args...>(std::forward<Args>(args)...)));
-    }
+  void operator()(Args... args) {
+    tuple_callback_bridge_state* state = ref_.get();
+    state->complete_or_abandon(std::move(ref_),
+                               ::fit::ok(std::make_tuple<Args...>(std::forward<Args>(args)...)));
+  }
 
-private:
-    typename bridge_state::completion_ref ref_;
+ private:
+  typename tuple_callback_bridge_state::completion_ref ref_;
 };
 
 template <typename V, typename E>
 void bridge_state<V, E>::create(completion_ref* out_completion_ref,
                                 consumption_ref* out_consumption_ref) {
-    bridge_state* state = new bridge_state();
-    *out_completion_ref = completion_ref(state);
-    *out_consumption_ref = consumption_ref(state);
+  bridge_state* state = new bridge_state();
+  *out_completion_ref = completion_ref(state);
+  *out_consumption_ref = consumption_ref(state);
 }
 
 template <typename V, typename E>
 bool bridge_state<V, E>::was_canceled() const {
-    std::lock_guard<std::mutex> lock(mutex_);
-    return disposition_ == disposition::canceled;
+  std::lock_guard<std::mutex> lock(mutex_);
+  return disposition_ == disposition::canceled;
 }
 
 template <typename V, typename E>
 bool bridge_state<V, E>::was_abandoned() const {
-    std::lock_guard<std::mutex> lock(mutex_);
-    return disposition_ == disposition::abandoned;
+  std::lock_guard<std::mutex> lock(mutex_);
+  return disposition_ == disposition::abandoned;
 }
 
 template <typename V, typename E>
 void bridge_state<V, E>::drop_completion_ref(bool was_completed) {
-    if (!was_completed) {
-        // The task was abandoned.
-        std::lock_guard<std::mutex> lock(mutex_);
-        assert(disposition_ == disposition::pending ||
-               disposition_ == disposition::canceled);
-        if (disposition_ == disposition::pending) {
-            disposition_ = disposition::abandoned;
-            deliver_result();
-        }
+  suspended_task task_to_notify;
+  bool should_resume_task = false;
+  if (!was_completed) {
+    // The task was abandoned.
+    std::lock_guard<std::mutex> lock(mutex_);
+    assert(disposition_ == disposition::pending || disposition_ == disposition::canceled);
+    if (disposition_ == disposition::pending) {
+      disposition_ = disposition::abandoned;
+      task_to_notify.swap(task_);
+      should_resume_task = !result_.is_pending();
     }
-    drop_ref_and_maybe_delete_self();
+  }
+
+  // Drop or resume |task_to_notify| and drop the ref outside of the lock.
+  // This guards against re-entrance in case the consumption ref is
+  // dropped as a side-effect of these operations.
+  if (task_to_notify && should_resume_task) {
+    task_to_notify.resume_task();
+  }
+  drop_ref_and_maybe_delete_self();
 }
 
 template <typename V, typename E>
 void bridge_state<V, E>::drop_consumption_ref(bool was_consumed) {
-    if (!was_consumed) {
-        // The task was canceled.
-        std::lock_guard<std::mutex> lock(mutex_);
-        assert(disposition_ == disposition::pending ||
-               disposition_ == disposition::completed ||
-               disposition_ == disposition::abandoned);
-        if (disposition_ == disposition::pending) {
-            disposition_ = disposition::canceled;
-            result_ = ::fit::pending();
-            task_.reset(); // there is no task to wake up anymore
-        }
+  suspended_task task_to_drop;
+  result_type result_to_drop;
+  if (!was_consumed) {
+    // The task was canceled.
+    std::lock_guard<std::mutex> lock(mutex_);
+    assert(disposition_ == disposition::pending || disposition_ == disposition::completed ||
+           disposition_ == disposition::abandoned);
+    if (disposition_ == disposition::pending) {
+      disposition_ = disposition::canceled;
+      task_to_drop.swap(task_);
+      result_to_drop.swap(result_);
     }
-    drop_ref_and_maybe_delete_self();
+  }
+
+  // Drop |task_to_drop|, drop |result_to_drop|, and drop the ref
+  // outside of the lock.
+  // This guards against re-entrance in case the completion ref is
+  // dropped as a side-effect of these operations.
+  drop_ref_and_maybe_delete_self();
 }
 
 template <typename V, typename E>
 void bridge_state<V, E>::drop_ref_and_maybe_delete_self() {
-    uint32_t count = ref_count_.fetch_sub(1u, std::memory_order_release) - 1u;
-    assert(count >= 0);
-    if (count == 0) {
-        std::atomic_thread_fence(std::memory_order_acquire);
-        delete this;
-    }
+  uint32_t count = ref_count_.fetch_sub(1u, std::memory_order_release);
+  assert(count > 0);
+  if (count == 1) {
+    std::atomic_thread_fence(std::memory_order_acquire);
+    delete this;
+  }
 }
 
 template <typename V, typename E>
-void bridge_state<V, E>::complete_or_abandon(completion_ref ref,
-                                             result_type result) {
-    assert(ref.get() == this);
-    if (result.is_pending())
-        return; // let the ref go out of scope to abandon the task
+void bridge_state<V, E>::complete_or_abandon(completion_ref ref, result_type result) {
+  assert(ref.get() == this);
+  if (result.is_pending())
+    return;  // let the ref go out of scope to abandon the task
 
-    {
-        std::lock_guard<std::mutex> lock(mutex_);
-        assert(disposition_ == disposition::pending ||
-               disposition_ == disposition::canceled);
-        if (disposition_ == disposition::pending) {
-            disposition_ = disposition::completed;
-            result_ = std::move(result);
-            deliver_result();
-        }
-    }
-    // drop the reference ouside of the lock
-    ref.drop_after_completion();
-}
-
-template <typename V, typename E>
-void bridge_state<V, E>::set_result_if_abandoned(
-    result_type result_if_abandoned) {
-    if (result_if_abandoned.is_pending())
-        return; // nothing to do
-
+  suspended_task task_to_notify;
+  bool should_resume_task = false;
+  {
     std::lock_guard<std::mutex> lock(mutex_);
-    assert(disposition_ == disposition::pending ||
-           disposition_ == disposition::completed ||
+    assert(disposition_ == disposition::pending || disposition_ == disposition::canceled);
+    if (disposition_ == disposition::pending) {
+      disposition_ = disposition::completed;
+      result.swap(result_);
+      task_to_notify.swap(task_);
+      should_resume_task = !result_.is_pending();
+    }
+  }
+
+  // Drop or resume |task_to_notify|, drop any prior result that
+  // was swapped into |result|, and drop the ref outside of the lock.
+  // This guards against re-entrance in case the consumption ref is
+  // dropped as a side-effect of these operations.
+  if (task_to_notify && should_resume_task) {
+    task_to_notify.resume_task();
+  }
+  ref.drop_after_completion();
+}
+
+template <typename V, typename E>
+void bridge_state<V, E>::set_result_if_abandoned(result_type result_if_abandoned) {
+  if (result_if_abandoned.is_pending())
+    return;  // nothing to do
+
+  std::lock_guard<std::mutex> lock(mutex_);
+  assert(disposition_ == disposition::pending || disposition_ == disposition::completed ||
+         disposition_ == disposition::abandoned);
+  if (disposition_ == disposition::pending || disposition_ == disposition::abandoned) {
+    result_if_abandoned.swap(result_);
+  }
+
+  // Drop any prior value that was swapped into |result_if_abandoned|
+  // outside of the lock.
+}
+
+template <typename V, typename E>
+typename bridge_state<V, E>::result_type bridge_state<V, E>::await_result(consumption_ref* ref,
+                                                                          ::fit::context& context) {
+  assert(ref->get() == this);
+  suspended_task task_to_drop;
+  result_type result;
+  {
+    std::lock_guard<std::mutex> lock(mutex_);
+    assert(disposition_ == disposition::pending || disposition_ == disposition::completed ||
            disposition_ == disposition::abandoned);
-    if (disposition_ == disposition::pending ||
-        disposition_ == disposition::abandoned) {
-        result_ = std::move(result_if_abandoned);
+    if (disposition_ == disposition::pending) {
+      task_to_drop.swap(task_);
+      task_ = context.suspend_task();  // assuming this isn't re-entrant
+      return ::fit::pending();
     }
+    disposition_ = disposition::returned;
+    result = std::move(result_);
+  }
+
+  // Drop |task_to_drop| and the ref outside of the lock.
+  ref->drop_after_consumption();
+  return result;
 }
 
-template <typename V, typename E>
-typename bridge_state<V, E>::result_type bridge_state<V, E>::await_result(
-    consumption_ref* ref, ::fit::context& context) {
-    assert(ref->get() == this);
-    result_type result;
-    {
-        std::lock_guard<std::mutex> lock(mutex_);
-        assert(disposition_ == disposition::pending ||
-               disposition_ == disposition::completed ||
-               disposition_ == disposition::abandoned);
-        if (disposition_ == disposition::pending) {
-            task_ = context.suspend_task();
-            return ::fit::pending();
-        }
-        disposition_ = disposition::returned;
-        result = std::move(result_);
-    }
-    // drop the reference ouside of the lock
-    ref->drop_after_consumption();
-    return result;
-}
-
-template <typename V, typename E>
-void bridge_state<V, E>::deliver_result() {
-    if (result_.is_pending()) {
-        task_.reset(); // the task has been canceled
-    } else {
-        task_.resume_task(); // we have a result so wake up the task
-    }
-}
-
-} // namespace internal
+}  // namespace internal
 
 template <typename V = void, typename E = void>
 class bridge;
@@ -396,6 +392,6 @@
 template <typename V = void, typename E = void>
 class consumer;
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_BRIDGE_INTERNAL_H_
+#endif  // LIB_FIT_BRIDGE_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/constructors_internal.h b/pkg/fit/include/lib/fit/constructors_internal.h
new file mode 100644
index 0000000..e11fbce
--- /dev/null
+++ b/pkg/fit/include/lib/fit/constructors_internal.h
@@ -0,0 +1,101 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_CONSTRUCTORS_INTERNAL_H_
+#define LIB_FIT_CONSTRUCTORS_INTERNAL_H_
+
+#include <type_traits>
+#include <utility>
+
+#include "utility_internal.h"
+
+namespace fit {
+namespace internal {
+
+// Mixin that implicitly deletes the subclass default constructor when type T
+// is not default constructible.
+template <typename T, bool = std::is_default_constructible<T>::value>
+struct modulate_default_constructor {};
+template <typename T>
+struct modulate_default_constructor<T, false> {
+  constexpr modulate_default_constructor() = delete;
+};
+
+// Mixin that implicitly deletes the subclass copy constructor when type T is
+// not copy constructible.
+template <size_t Index, typename T, bool = std::is_copy_constructible<T>::value>
+struct modulate_copy_constructor {};
+template <size_t Index, typename T>
+struct modulate_copy_constructor<Index, T, false> {
+  constexpr modulate_copy_constructor() = default;
+  constexpr modulate_copy_constructor(const modulate_copy_constructor&) = delete;
+  constexpr modulate_copy_constructor& operator=(const modulate_copy_constructor&) = default;
+  constexpr modulate_copy_constructor(modulate_copy_constructor&&) = default;
+  constexpr modulate_copy_constructor& operator=(modulate_copy_constructor&&) = default;
+};
+
+// Mixin that implicitly deletes the subclass copy assignment operator when type
+// T is not copy assignable.
+template <size_t Index, typename T, bool = std::is_copy_assignable<T>::value>
+struct modulate_copy_assignment {};
+template <size_t Index, typename T>
+struct modulate_copy_assignment<Index, T, false> {
+  constexpr modulate_copy_assignment() = default;
+  constexpr modulate_copy_assignment(const modulate_copy_assignment&) = default;
+  constexpr modulate_copy_assignment& operator=(const modulate_copy_assignment&) = delete;
+  constexpr modulate_copy_assignment(modulate_copy_assignment&&) = default;
+  constexpr modulate_copy_assignment& operator=(modulate_copy_assignment&&) = default;
+};
+
+// Mixin that implicitly deletes the subclass move constructor when type T is
+// not move constructible.
+template <size_t Index, typename T, bool = std::is_move_constructible<T>::value>
+struct modulate_move_constructor {};
+template <size_t Index, typename T>
+struct modulate_move_constructor<Index, T, false> {
+  constexpr modulate_move_constructor() = default;
+  constexpr modulate_move_constructor(const modulate_move_constructor&) = default;
+  constexpr modulate_move_constructor& operator=(const modulate_move_constructor&) = default;
+  constexpr modulate_move_constructor(modulate_move_constructor&&) = delete;
+  constexpr modulate_move_constructor& operator=(modulate_move_constructor&&) = default;
+};
+
+// Mixin that implicitly deletes the subclass move assignment operator when type
+// T is not move assignable.
+template <size_t Index, typename T, bool = std::is_move_assignable<T>::value>
+struct modulate_move_assignment {};
+template <size_t Index, typename T>
+struct modulate_move_assignment<Index, T, false> {
+  constexpr modulate_move_assignment() = default;
+  constexpr modulate_move_assignment(const modulate_move_assignment&) = default;
+  constexpr modulate_move_assignment& operator=(const modulate_move_assignment&) = default;
+  constexpr modulate_move_assignment(modulate_move_assignment&&) = default;
+  constexpr modulate_move_assignment& operator=(modulate_move_assignment&&) = delete;
+};
+
+// Utility that takes an index sequence and an equally sized parameter pack and
+// mixes in each of the above copy/move construction/assignment modulators for
+// each type in Ts. The indices are used to avoid duplicate direct base errors
+// by ensuring that each mixin type is unique, even when there are duplicate
+// types within the parameter pack Ts.
+template <typename IndexSequence, typename... Ts>
+struct modulate_copy_and_move_index;
+
+template <size_t... Is, typename... Ts>
+struct modulate_copy_and_move_index<std::index_sequence<Is...>, Ts...>
+    : modulate_copy_constructor<Is, Ts>...,
+      modulate_copy_assignment<Is, Ts>...,
+      modulate_move_constructor<Is, Ts>...,
+      modulate_move_assignment<Is, Ts>... {};
+
+// Mixin that modulates the subclass copy/move constructors and assignment
+// operators based on the copy/move characteristics of each type in Ts.
+template <typename... Ts>
+struct modulate_copy_and_move
+    : modulate_copy_and_move_index<std::index_sequence_for<Ts...>, Ts...> {};
+
+}  // namespace internal
+}  // namespace fit
+
+#endif  //  LIB_FIT_CONSTRUCTORS_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/defer.h b/pkg/fit/include/lib/fit/defer.h
index 7d85048..850a6f6 100644
--- a/pkg/fit/include/lib/fit/defer.h
+++ b/pkg/fit/include/lib/fit/defer.h
@@ -7,6 +7,7 @@
 
 #include <utility>
 
+#include "function.h"
 #include "nullable.h"
 
 namespace fit {
@@ -21,88 +22,84 @@
 // See |fit::defer()| for idiomatic usage.
 template <typename T>
 class deferred_action final {
-public:
-    // Creates a deferred action without a pending target.
-    deferred_action() = default;
-    explicit deferred_action(decltype(nullptr)) {}
+ public:
+  // Creates a deferred action without a pending target.
+  deferred_action() = default;
+  explicit deferred_action(decltype(nullptr)) {}
 
-    // Creates a deferred action with a pending target.
-    explicit deferred_action(T target)
-        : target_(std::move(target)) {}
+  // Creates a deferred action with a pending target.
+  explicit deferred_action(T target) : target_(std::move(target)) {}
 
-    // Creates a deferred action with a pending target moved from another
-    // deferred action, leaving the other one without a pending target.
-    deferred_action(deferred_action&& other) = default;
+  // Creates a deferred action with a pending target moved from another
+  // deferred action, leaving the other one without a pending target.
+  deferred_action(deferred_action&& other) : target_(std::move(other.target_)) {
+    other.target_.reset();
+  }
 
-    // Invokes and releases the deferred action's pending target (if any).
-    ~deferred_action() {
-        call();
+  // Invokes and releases the deferred action's pending target (if any).
+  ~deferred_action() { call(); }
+
+  // Returns true if the deferred action has a pending target.
+  explicit operator bool() const { return !!target_; }
+
+  // Invokes and releases the deferred action's pending target (if any),
+  // then move-assigns it from another deferred action, leaving the latter
+  // one without a pending target.
+  deferred_action& operator=(deferred_action&& other) {
+    if (&other == this)
+      return *this;
+    call();
+    target_ = std::move(other.target_);
+    other.target_.reset();
+    return *this;
+  }
+
+  // Invokes and releases the deferred action's pending target (if any).
+  void call() {
+    if (target_) {
+      // Move to a local to guard against re-entrance.
+      T local_target = std::move(*target_);
+      target_.reset();
+      local_target();
     }
+  }
 
-    // Returns true if the deferred action has a pending target.
-    explicit operator bool() const {
-        return !!target_;
-    }
+  // Releases the deferred action's pending target (if any) without
+  // invoking it.
+  void cancel() { target_.reset(); }
+  deferred_action& operator=(decltype(nullptr)) {
+    cancel();
+    return *this;
+  }
 
-    // Invokes and releases the deferred action's pending target (if any),
-    // then move-assigns it from another deferred action, leaving the latter
-    // one without a pending target.
-    deferred_action& operator=(deferred_action&& other) {
-        if (&other == this)
-            return *this;
-        call();
-        target_ = std::move(other.target_);
-        return *this;
-    }
+  // Assigns a new target to the deferred action.
+  deferred_action& operator=(T target) {
+    target_ = std::move(target);
+    return *this;
+  }
 
-    // Invokes and releases the deferred action's pending target (if any).
-    void call() {
-        if (target_) {
-            // Move to a local to guard against re-entrance.
-            T local_target = std::move(*target_);
-            target_.reset();
-            local_target();
-        }
-    }
+  deferred_action(const deferred_action& other) = delete;
+  deferred_action& operator=(const deferred_action& other) = delete;
 
-    // Releases the deferred action's pending target (if any) without
-    // invoking it.
-    void cancel() {
-        target_.reset();
-    }
-    deferred_action& operator=(decltype(nullptr)) {
-        cancel();
-        return *this;
-    }
-
-    // Assigns a new target to the deferred action.
-    deferred_action& operator=(T target) {
-        target_ = std::move(target);
-        return *this;
-    }
-
-    deferred_action(const deferred_action& other) = delete;
-    deferred_action& operator=(const deferred_action& other) = delete;
-
-private:
-    nullable<T> target_;
+ private:
+  nullable<T> target_;
 };
 
 template <typename T>
 bool operator==(const deferred_action<T>& action, decltype(nullptr)) {
-    return !action;
+  return !action;
 }
 template <typename T>
 bool operator==(decltype(nullptr), const deferred_action<T>& action) {
-    return !action;
+  return !action;
 }
 template <typename T>
 bool operator!=(const deferred_action<T>& action, decltype(nullptr)) {
-    return !!action;
+  return !!action;
 }
 template <typename T>
 bool operator!=(decltype(nullptr), const deferred_action<T>& action) {
-    return !!action;
+  return !!action;
 }
 
 // Defers execution of a function-like callable target with no arguments
@@ -130,9 +127,18 @@
 // }
 template <typename T>
 inline deferred_action<T> defer(T target) {
-    return deferred_action<T>(std::move(target));
+  return deferred_action<T>(std::move(target));
 }
 
-} // namespace fit
+// Alias for a deferred_action using a fit::callback.
+using deferred_callback = deferred_action<fit::callback<void()>>;
 
-#endif // LIB_FIT_DEFER_H_
+// Defers execution of a fit::callback with no arguments. See |fit::defer| for
+// details.
+inline deferred_callback defer_callback(fit::callback<void()> target) {
+  return deferred_callback(std::move(target));
+}
+
+}  // namespace fit
+
+#endif  // LIB_FIT_DEFER_H_
diff --git a/pkg/fit/include/lib/fit/function.h b/pkg/fit/include/lib/fit/function.h
index 5aaecca..16febf9 100644
--- a/pkg/fit/include/lib/fit/function.h
+++ b/pkg/fit/include/lib/fit/function.h
@@ -5,18 +5,17 @@
 #ifndef LIB_FIT_FUNCTION_H_
 #define LIB_FIT_FUNCTION_H_
 
-#include <memory>
-#include <type_traits>
-
 #include "function_internal.h"
-#include "nullable.h"
+#include "utility_internal.h"
 
 namespace fit {
 
-template <size_t inline_target_size, bool require_inline,
-          typename Result, typename... Args>
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 class function_impl;
 
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+class callback_impl;
+
 // The default size allowance for storing a target inline within a function
 // object, in bytes.  This default allows for inline storage of targets
 // as big as two pointers, such as an object pointer and a pointer to a member
@@ -25,9 +24,15 @@
 
 // A |fit::function| is a move-only polymorphic function wrapper.
 //
-// |fit::function<T>| behaves like |std::function<T>| except that it is move-only
-// instead of copyable so it can hold targets which cannot be copied, such as
-// mutable lambdas.
+// If you need a class with similar characteristics that also ensures
+// "run-once" semantics (such as callbacks shared with timeouts, or for
+// service requests with redundant, failover, or fallback service providers),
+// see |fit::callback|.
+//
+// |fit::function<T>| behaves like |std::function<T>| except that it is
+// move-only instead of copyable, so it can hold targets that cannot be copied,
+// such as mutable lambdas, and immutable lambdas that capture move-only
+// objects.
 //
 // Targets of up to |inline_target_size| bytes in size (rounded up for memory
 // alignment) are stored inline within the function object without incurring
@@ -45,271 +50,444 @@
 // fit within a function without requiring heap allocation.
 // Defaults to |default_inline_target_size|.
 //
-// Class members are documented in |fit::function_impl|.
+// Class members are documented in |fit::function_impl|, below.
 //
 // EXAMPLES
 //
-// - https://fuchsia.googlesource.com/zircon/+/master/system/utest/fit/examples/function_example1.cpp
-// - https://fuchsia.googlesource.com/zircon/+/master/system/utest/fit/examples/function_example2.cpp
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/zircon/system/ulib/fit/test/examples/function_example1.cc
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/zircon/system/ulib/fit/test/examples/function_example2.cc
 //
 template <typename T, size_t inline_target_size = default_inline_target_size>
-using function = function_impl<inline_target_size, false, T>;
+using function = function_impl<inline_target_size,
+                               /*require_inline=*/false, T>;
 
-// A move-only callable object wrapper which forces callables to be stored inline
+// A move-only callable object wrapper that forces callables to be stored inline
 // and never performs heap allocation.
 //
-// Behaves just like |fit::function<T, inline_target_size>| except that attempting
-// to store a target larger than |inline_target_size| will fail to compile.
+// Behaves just like |fit::function<T, inline_target_size>| except that
+// attempting to store a target larger than |inline_target_size| will fail to
+// compile.
 template <typename T, size_t inline_target_size = default_inline_target_size>
-using inline_function = function_impl<inline_target_size, true, T>;
+using inline_function = function_impl<inline_target_size,
+                                      /*require_inline=*/true, T>;
 
 // Synonym for a function which takes no arguments and produces no result.
 using closure = function<void()>;
 
-// Function implementation details.
-// See |fit::function| documentation for more information.
-template <size_t inline_target_size, bool require_inline,
-          typename Result, typename... Args>
-class function_impl<inline_target_size, require_inline, Result(Args...)> final {
-    using ops_type = const ::fit::internal::target_ops<Result, Args...>*;
-    using storage_type = typename std::aligned_storage<
-        (inline_target_size >= sizeof(void*)
-             ? inline_target_size
-             : sizeof(void*))>::type; // avoid including <algorithm> just for max
-    template <typename Callable>
-    using target_type = ::fit::internal::target<
-        Callable,
-        (sizeof(Callable) <= sizeof(storage_type)),
-        Result, Args...>;
-    using null_target_type = target_type<decltype(nullptr)>;
+// A |fit::callback| is a move-only polymorphic function wrapper that also
+// ensures "run-once" semantics (such as callbacks shared with timeouts, or for
+// service requests with redundant, failover, or fallback service providers).
+// A |fit::callback| releases it's resources after the first call, and can be
+// inspected before calling, so a potential caller can know if it should call
+// the function, or skip the call because the target was already called.
+//
+// If you need a move-only function class with typical function characteristics,
+// that permits multiple invocations of the same function, see |fit::function|.
+//
+// |fit::callback<T>| behaves like |std::function<T>| except:
+//
+//   1. It is move-only instead of copyable, so it can hold targets that cannot
+//      be copied, such as mutable lambdas, and immutable lambdas that capture
+//      move-only objects.
+//   2. On the first call to invoke a |fit::callback|, the target function held
+//      by the |fit::callback| cannot be called again.
+//
+// When a |fit::callback| is invoked for the first time, the target function is
+// released and destructed, along with any resources owned by that function
+// (typically the objects captured by a lambda).
+//
+// A |fit::callback| in the "already called" state has the same state as a
+// |fit::callback| that has been assigned to |nullptr|. It can be compared to
+// |nullptr| (via "==" or "!=", and its "operator bool()" returns false, which
+// provides a convenient way to gate whether or not the |fit::callback| should
+// be called. (Note that invoking an empty |fit::callback| or |fit::function|
+// will cause a program abort!)
+//
+// As an example, sharing |fit::callback| between both a service and a timeout
+// might look something like this:
+//
+//  void service_with_timeout(fit::callback<void(bool)> cb, uint timeout_ms) {
+//    service_request([cb = cb.share()]() mutable { if (cb) cb(false); });
+//    timeout(timeout_ms, [cb = std::move(cb)]() mutable { if (cb) cb(true); });
+//  }
+//
+// Since |fit::callback| objects are move-only, and not copyable, duplicate
+// references to the same |fit::callback| can be obtained via share(), as shown
+// in the example above. This method converts the |fit::callback| into a
+// reference-counted version of the |fit::callback| and returns a copy of the
+// reference as another |fit::callback| with the same target function.
+//
+// What is notable about |fit::callback<T>.share()| is that invoking any shared
+// copy will "nullify" all shared copies, as shown in the example.
+//
+// Note that |fit::callback| is NOT thread-safe by default. If multi-threaded
+// support is required, you would need to implement your own mutex, or similar
+// guard, before checking and calling a |fit::callback|.
+//
+// Targets of up to |inline_target_size| bytes in size (rounded up for memory
+// alignment) are stored inline within the callback object without incurring
+// any heap allocation.  Larger callable objects will be moved to the heap as
+// required.
+//
+// See also |fit::inline_callback<T, size>| for more control over allocation
+// behavior.
+//
+// SYNOPSIS
+//
+// |T| is the callback's signature.  e.g. void(int, std::string).
+//
+// |inline_target_size| is the minimum size of target that is guaranteed to
+// fit within a callback without requiring heap allocation.
+// Defaults to |default_inline_target_size|.
+//
+// Class members are documented in |fit::callback_impl|, below.
+//
+template <typename T, size_t inline_target_size = default_inline_target_size>
+using callback = callback_impl<inline_target_size, /*require_inline=*/false, T>;
 
-public:
-    // The function's result type.
-    using result_type = Result;
+// A move-only, run-once, callable object wrapper that forces callables to be
+// stored inline and never performs heap allocation.
+//
+// Behaves just like |fit::callback<T, inline_target_size>| except that
+// attempting to store a target larger than |inline_target_size| will fail to
+// compile.
+template <typename T, size_t inline_target_size = default_inline_target_size>
+using inline_callback = callback_impl<inline_target_size,
+                                      /*require_inline=*/true, T>;
 
-    // // Creates a function with an empty target.
-    function_impl() {
-        initialize_null_target();
-    }
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+class function_impl<inline_target_size, require_inline, Result(Args...)> final
+    : private ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)> {
+  using base = ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)>;
 
-    // Creates a function with an empty target.
-    function_impl(decltype(nullptr)) {
-        initialize_null_target();
-    }
+  // function_base requires private access during share()
+  friend class ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)>;
 
-    // Creates a function bound to the specified function pointer.
-    // If target == nullptr, assigns an empty target.
-    function_impl(Result (*target)(Args...)) {
-        initialize_target(target);
-    }
+  // supports target() for shared functions
+  friend const void* ::fit::internal::get_target_type_id<>(
+      const function_impl<inline_target_size, require_inline, Result(Args...)>&);
 
-    // Creates a function bound to the specified callable object.
-    // If target == nullptr, assigns an empty target.
-    //
-    // For functors, we need to capture the raw type but also restrict on the existence of an
-    // appropriate operator () to resolve overloads and implicit casts properly.
-    template <typename Callable,
-              typename = std::enable_if_t<
-                  std::is_convertible<
-                      decltype(std::declval<Callable&>()(
-                          std::declval<Args>()...)),
-                      result_type>::value>>
-    function_impl(Callable target) {
-        initialize_target(std::move(target));
-    }
+  template <typename U>
+  using not_self_type = ::fit::internal::not_same_type<function_impl, U>;
 
-    // Creates a function with a target moved from another function,
-    // leaving the other function with an empty target.
-    function_impl(function_impl&& other) {
-        move_target_from(std::move(other));
-    }
+  template <typename... Conditions>
+  using requires_conditions = ::fit::internal::requires_conditions<Conditions...>;
 
-    // Destroys the function, releasing its target.
-    ~function_impl() {
-        destroy_target();
-    }
+  template <typename... Conditions>
+  using assignment_requires_conditions =
+      ::fit::internal::assignment_requires_conditions<function_impl&, Conditions...>;
 
-    // Returns true if the function has a non-empty target.
-    explicit operator bool() const {
-        return ops_ != &null_target_type::ops;
-    };
+ public:
+  // The function's result type.
+  using typename base::result_type;
 
-    // Invokes the function's target.
-    // Aborts if the function's target is empty.
-    Result operator()(Args... args) const {
-        return ops_->invoke(&bits_, std::forward<Args>(args)...);
-    }
+  // Initializes an empty (null) function. Attempting to call an empty
+  // function will abort the program.
+  function_impl() = default;
 
-    // Assigns an empty target.
-    function_impl& operator=(decltype(nullptr)) {
-        destroy_target();
-        initialize_null_target();
-        return *this;
-    }
+  // Creates a function with an empty target (same outcome as the default
+  // constructor).
+  function_impl(decltype(nullptr)) : base(nullptr) {}
 
-    // Assigns the function's target.
-    // If target == nullptr, assigns an empty target.
-    template <typename Callable,
-              typename = std::enable_if_t<
-                  std::is_convertible<
-                      decltype(std::declval<Callable&>()(
-                          std::declval<Args>()...)),
-                      result_type>::value>>
-    function_impl& operator=(Callable target) {
-        destroy_target();
-        initialize_target(std::move(target));
-        return *this;
-    }
+  // Creates a function bound to the specified function pointer.
+  // If target == nullptr, assigns an empty target.
+  function_impl(Result (*target)(Args...)) : base(target) {}
 
-    // Assigns the function with a target moved from another function,
-    // leaving the other function with an empty target.
-    function_impl& operator=(function_impl&& other) {
-        if (&other == this)
-            return *this;
-        destroy_target();
-        move_target_from(std::move(other));
-        return *this;
-    }
+  // Creates a function bound to the specified callable object.
+  // If target == nullptr, assigns an empty target.
+  //
+  // For functors, we need to capture the raw type but also restrict on the
+  // existence of an appropriate operator () to resolve overloads and implicit
+  // casts properly.
+  //
+  // Note that specializations of this template method that take fit::callback
+  // objects as the target Callable are deleted (see below).
+  template <typename Callable,
+            requires_conditions<
+                std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                    result_type>,
+                not_self_type<Callable>> = true>
+  function_impl(Callable&& target) : base(std::forward<Callable>(target)) {}
 
-    // Swaps the functions' targets.
-    void swap(function_impl& other) {
-        if (&other == this)
-            return;
-        ops_type temp_ops = ops_;
-        storage_type temp_bits;
-        ops_->move(&bits_, &temp_bits);
+  // Deletes the specializations of function_impl(Callable) that would allow
+  // a |fit::function| to be constructed from a |fit::callback|. This prevents
+  // unexpected behavior of a |fit::function| that would otherwise fail after
+  // one call. To explicitly allow this, simply wrap the |fit::callback| in a
+  // pass-through lambda before passing it to the |fit::function|.
+  template <size_t other_inline_target_size, bool other_require_inline>
+  function_impl(
+      ::fit::callback_impl<other_inline_target_size, other_require_inline, Result(Args...)>) =
+      delete;
 
-        ops_ = other.ops_;
-        other.ops_->move(&other.bits_, &bits_);
+  // Creates a function with a target moved from another function,
+  // leaving the other function with an empty target.
+  function_impl(function_impl&& other) : base(static_cast<base&&>(other)) {}
 
-        other.ops_ = temp_ops;
-        temp_ops->move(&temp_bits, &other.bits_);
-    }
+  // Destroys the function, releasing its target.
+  ~function_impl() = default;
 
-    // Returns a pointer to the function's target.
-    template <typename Callable>
-    Callable* target() {
-        check_target_type<Callable>();
-        return static_cast<Callable*>(ops_->get(&bits_));
-    }
+  // Assigns the function to an empty target. Attempting to invoke the
+  // function will abort the program.
+  function_impl& operator=(decltype(nullptr)) {
+    base::assign(nullptr);
+    return *this;
+  }
 
-    // Returns a pointer to the function's target.
-    template <typename Callable>
-    const Callable* target() const {
-        check_target_type<Callable>();
-        return static_cast<Callable*>(ops_->get(&bits_));
-    }
+  // Assigns the function to the specified callable object. If target ==
+  // nullptr, assigns an empty target.
+  //
+  // For functors, we need to capture the raw type but also restrict on the
+  // existence of an appropriate operator () to resolve overloads and implicit
+  // casts properly.
+  //
+  // Note that specializations of this template method that take fit::callback
+  // objects as the target Callable are deleted (see below).
+  template <typename Callable>
+  assignment_requires_conditions<
+      std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                          result_type>,
+      not_self_type<Callable>>
+  operator=(Callable&& target) {
+    base::assign(std::forward<Callable>(target));
+    return *this;
+  }
 
-    // Returns a new function object which invokes the same target.
-    // The target itself is not copied; it is moved to the heap and its
-    // lifetime is extended until all references have been released.
-    //
-    // Note: This method is not supported on |fit::inline_function<>|
-    //       because it may incur a heap allocation which is contrary to
-    //       the stated purpose of |fit::inline_function<>|.
-    function_impl share() {
-        static_assert(!require_inline, "Inline functions cannot be shared.");
-        // TODO(jeffbrown): Replace shared_ptr with a better ref-count mechanism.
-        // TODO(jeffbrown): This definition breaks the client's ability to use
-        // |target()| because the target's type has changed.  We could fix this
-        // by defining a new target type (and vtable) for shared targets
-        // although it would be nice to avoid memory overhead and code expansion
-        // when sharing is not used.
-        struct ref {
-            std::shared_ptr<function_impl> target;
-            Result operator()(Args... args) {
-                return (*target)(std::forward<Args>(args)...);
-            }
-        };
-        if (ops_ != &target_type<ref>::ops) {
-            if (ops_ == &null_target_type::ops) {
-                return nullptr;
-            }
-            auto target = ref{std::make_shared<function_impl>(std::move(*this))};
-            *this = std::move(target);
-        }
-        return function_impl(*static_cast<ref*>(ops_->get(&bits_)));
-    }
+  // Deletes the specializations of operator=(Callable) that would allow
+  // a |fit::function| to be assigned from a |fit::callback|. This
+  // prevents unexpected behavior of a |fit::function| that would otherwise
+  // fail after one call. To explicitly allow this, simply wrap the
+  // |fit::callback| in a pass-through lambda before assigning it to the
+  // |fit::function|.
+  template <size_t other_inline_target_size, bool other_require_inline>
+  function_impl& operator=(
+      ::fit::callback_impl<other_inline_target_size, other_require_inline, Result(Args...)>) =
+      delete;
 
-    function_impl(const function_impl& other) = delete;
-    function_impl& operator=(const function_impl& other) = delete;
+  // Move assignment
+  function_impl& operator=(function_impl&& other) {
+    if (&other == this)
+      return *this;
+    base::assign(static_cast<base&&>(other));
+    return *this;
+  }
 
-private:
-    // assumes target is uninitialized
-    void initialize_null_target() {
-        ops_ = &null_target_type::ops;
-    }
+  // Swaps the functions' targets.
+  void swap(function_impl& other) { base::swap(other); }
 
-    // assumes target is uninitialized
-    template <typename Callable>
-    void initialize_target(Callable target) {
-        static_assert(!require_inline || sizeof(Callable) <= inline_target_size,
-                      "Callable too large to store inline as requested.");
-        if (is_null(target)) {
-            initialize_null_target();
-        } else {
-            ops_ = &target_type<Callable>::ops;
-            target_type<Callable>::initialize(&bits_, std::move(target));
-        }
-    }
+  // Returns a pointer to the function's target.
+  using base::target;
 
-    // leaves target uninitialized
-    void destroy_target() {
-        ops_->destroy(&bits_);
-    }
+  // Returns true if the function has a non-empty target.
+  using base::operator bool;
 
-    // leaves other target initialized to null
-    void move_target_from(function_impl&& other) {
-        ops_ = other.ops_;
-        other.ops_->move(&other.bits_, &bits_);
-        other.initialize_null_target();
-    }
+  // Invokes the function's target.
+  // Aborts if the function's target is empty.
+  Result operator()(Args... args) const { return base::invoke(std::forward<Args>(args)...); }
 
-    template <typename Callable>
-    void check_target_type() const {
-        if (ops_ != &target_type<Callable>::ops)
-            abort();
-    }
-
-    ops_type ops_;
-    mutable storage_type bits_;
-}; // namespace fit
+  // Returns a new function object that invokes the same target.
+  // The target itself is not copied; it is moved to the heap and its
+  // lifetime is extended until all references have been released.
+  //
+  // Note: This method is not supported on |fit::inline_function<>|
+  //       because it may incur a heap allocation which is contrary to
+  //       the stated purpose of |fit::inline_function<>|.
+  function_impl share() {
+    function_impl copy;
+    base::template share_with<function_impl>(copy);
+    return copy;
+  }
+};
 
 template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 void swap(function_impl<inline_target_size, require_inline, Result, Args...>& a,
           function_impl<inline_target_size, require_inline, Result, Args...>& b) {
-    a.swap(b);
+  a.swap(b);
 }
 
 template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 bool operator==(const function_impl<inline_target_size, require_inline, Result, Args...>& f,
                 decltype(nullptr)) {
-    return !f;
+  return !f;
 }
 template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 bool operator==(decltype(nullptr),
                 const function_impl<inline_target_size, require_inline, Result, Args...>& f) {
-    return !f;
+  return !f;
 }
 template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 bool operator!=(const function_impl<inline_target_size, require_inline, Result, Args...>& f,
                 decltype(nullptr)) {
-    return !!f;
+  return !!f;
 }
 template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
 bool operator!=(decltype(nullptr),
                 const function_impl<inline_target_size, require_inline, Result, Args...>& f) {
-    return !!f;
+  return !!f;
 }
 
-// Returns a Callable object which invokes a member function of an object.
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+class callback_impl<inline_target_size, require_inline, Result(Args...)> final
+    : private ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)> {
+  using base = ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)>;
+
+  // function_base requires private access during share()
+  friend class ::fit::internal::function_base<inline_target_size, require_inline, Result(Args...)>;
+
+  // supports target() for shared functions
+  friend const void* ::fit::internal::get_target_type_id<>(
+      const callback_impl<inline_target_size, require_inline, Result(Args...)>&);
+
+  template <typename U>
+  using not_self_type = ::fit::internal::not_same_type<callback_impl, U>;
+
+  template <typename... Conditions>
+  using requires_conditions = ::fit::internal::requires_conditions<Conditions...>;
+
+  template <typename... Conditions>
+  using assignment_requires_conditions =
+      ::fit::internal::assignment_requires_conditions<callback_impl&, Conditions...>;
+
+ public:
+  // The callback function's result type.
+  using typename base::result_type;
+
+  // Initializes an empty (null) callback. Attempting to call an empty
+  // callback will abort the program.
+  callback_impl() = default;
+
+  // Creates a callback with an empty target (same outcome as the default
+  // constructor).
+  callback_impl(decltype(nullptr)) : base(nullptr) {}
+
+  // Creates a callback bound to the specified function pointer.
+  // If target == nullptr, assigns an empty target.
+  callback_impl(Result (*target)(Args...)) : base(target) {}
+
+  // Creates a callback bound to the specified callable object.
+  // If target == nullptr, assigns an empty target.
+  //
+  // For functors, we need to capture the raw type but also restrict on the
+  // existence of an appropriate operator () to resolve overloads and implicit
+  // casts properly.
+  template <typename Callable,
+            requires_conditions<
+                std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                                    result_type>,
+                not_self_type<Callable>> = true>
+  callback_impl(Callable&& target) : base(std::forward<Callable>(target)) {}
+
+  // Creates a callback with a target moved from another callback,
+  // leaving the other callback with an empty target.
+  callback_impl(callback_impl&& other) : base(static_cast<base&&>(other)) {}
+
+  // Destroys the callback, releasing its target.
+  ~callback_impl() = default;
+
+  // Assigns the callback to an empty target. Attempting to invoke the
+  // callback will abort the program.
+  callback_impl& operator=(decltype(nullptr)) {
+    base::assign(nullptr);
+    return *this;
+  }
+
+  // Assigns the callback to the specified callable object. If target ==
+  // nullptr, assigns an empty target.
+  //
+  // For functors, we need to capture the raw type but also restrict on the
+  // existence of an appropriate operator () to resolve overloads and implicit
+  // casts properly.
+  template <typename Callable>
+  assignment_requires_conditions<
+      std::is_convertible<decltype(std::declval<Callable&>()(std::declval<Args>()...)),
+                          result_type>,
+      not_self_type<Callable>>
+  operator=(Callable&& target) {
+    base::assign(std::forward<Callable>(target));
+    return *this;
+  }
+
+  // Move assignment
+  callback_impl& operator=(callback_impl&& other) {
+    if (&other == this)
+      return *this;
+    base::assign(static_cast<base&&>(other));
+    return *this;
+  }
+
+  // Swaps the callbacks' targets.
+  void swap(callback_impl& other) { base::swap(other); }
+
+  // Returns a pointer to the callback's target.
+  using base::target;
+
+  // Returns true if the callback has a non-empty target.
+  using base::operator bool;
+
+  // Invokes the callback's target.
+  // Aborts if the callback's target is empty.
+  // |fit::callback| must be non-const to invoke. Before the target function
+  // is actually called, the fit::callback will be set to the default empty
+  // state (== nullptr, and operator bool() will subsequently return |false|).
+  // The target function will then be released after the function is called.
+  // If the callback was shared, any remaining copies will also be cleared.
+  Result operator()(Args... args) {
+    auto temp = std::move(*this);
+    return temp.invoke(std::forward<Args>(args)...);
+  }
+
+  // Returns a new callback object that invokes the same target.
+  // The target itself is not copied; it is moved to the heap and its
+  // lifetime is extended until all references have been released.
+  // For |fit::callback| (unlike fit::function), the first invocation of the
+  // callback will release all references to the target. All callbacks
+  // derived from the same original callback (via share()) will be cleared,
+  // as if set to |nullptr|, and "operator bool()" will return false.
+  //
+  // Note: This method is not supported on |fit::inline_function<>|
+  //       because it may incur a heap allocation which is contrary to
+  //       the stated purpose of |fit::inline_function<>|.
+  callback_impl share() {
+    callback_impl copy;
+    base::template share_with<callback_impl>(copy);
+    return copy;
+  }
+};
+
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+void swap(callback_impl<inline_target_size, require_inline, Result, Args...>& a,
+          callback_impl<inline_target_size, require_inline, Result, Args...>& b) {
+  a.swap(b);
+}
+
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+bool operator==(const callback_impl<inline_target_size, require_inline, Result, Args...>& f,
+                decltype(nullptr)) {
+  return !f;
+}
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+bool operator==(decltype(nullptr),
+                const callback_impl<inline_target_size, require_inline, Result, Args...>& f) {
+  return !f;
+}
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+bool operator!=(const callback_impl<inline_target_size, require_inline, Result, Args...>& f,
+                decltype(nullptr)) {
+  return !!f;
+}
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+bool operator!=(decltype(nullptr),
+                const callback_impl<inline_target_size, require_inline, Result, Args...>& f) {
+  return !!f;
+}
+
+// Returns a Callable object that invokes a member function of an object.
 template <typename R, typename T, typename... Args>
 auto bind_member(T* instance, R (T::*fn)(Args...)) {
-    return [instance, fn](Args... args) {
-        return (instance->*fn)(std::forward<Args>(args)...);
-    };
+  return [instance, fn](Args... args) { return (instance->*fn)(std::forward<Args>(args)...); };
 }
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_FUNCTION_H_
+#endif  // LIB_FIT_FUNCTION_H_
diff --git a/pkg/fit/include/lib/fit/function_internal.h b/pkg/fit/include/lib/fit/function_internal.h
index ddcefef..6d67522 100644
--- a/pkg/fit/include/lib/fit/function_internal.h
+++ b/pkg/fit/include/lib/fit/function_internal.h
@@ -8,6 +8,10 @@
 #include <stddef.h>
 #include <stdlib.h>
 
+#include <memory>
+
+#include "nullable.h"
+
 #include <new>
 #include <type_traits>
 #include <utility>
@@ -17,105 +21,386 @@
 
 template <typename Result, typename... Args>
 struct target_ops final {
-    void* (*get)(void* bits);
-    Result (*invoke)(void* bits, Args... args);
-    void (*move)(void* from_bits, void* to_bits);
-    void (*destroy)(void* bits);
+  const void* (*target_type_id)(void* bits, const void* impl_ops);
+  void* (*get)(void* bits);
+  Result (*invoke)(void* bits, Args... args);
+  void (*move)(void* from_bits, void* to_bits);
+  void (*destroy)(void* bits);
 };
 
-template <typename Callable, bool is_inline, typename Result, typename... Args>
+template <typename Callable, bool is_inline, bool is_shared, typename Result, typename... Args>
 struct target;
 
-template <typename Result, typename... Args>
-struct target<decltype(nullptr), true, Result, Args...> final {
-    static Result invoke(void* bits, Args... args) {
-        abort();
-    }
+inline const void* unshared_target_type_id(void* bits, const void* impl_ops) { return impl_ops; }
 
-    static const target_ops<Result, Args...> ops;
+// vtable for nullptr (empty target function)
+
+template <typename Result, typename... Args>
+struct target<decltype(nullptr),
+              /*is_inline=*/true, /*is_shared=*/false, Result, Args...>
+    final {
+  static Result invoke(void* bits, Args... args) { __builtin_abort(); }
+
+  static const target_ops<Result, Args...> ops;
 };
 
-inline void* null_target_get(void* bits) {
-    return nullptr;
-}
+inline void* null_target_get(void* bits) { return nullptr; }
 inline void null_target_move(void* from_bits, void* to_bits) {}
 inline void null_target_destroy(void* bits) {}
 
 template <typename Result, typename... Args>
-constexpr target_ops<Result, Args...> target<decltype(nullptr), true, Result, Args...>::ops = {
-    &null_target_get,
-    &target::invoke,
-    &null_target_move,
+constexpr target_ops<Result, Args...> target<decltype(nullptr),
+                                             /*is_inline=*/true,
+                                             /*is_shared=*/false, Result, Args...>::ops = {
+    &unshared_target_type_id, &null_target_get, &target::invoke, &null_target_move,
     &null_target_destroy};
 
-template <typename Callable, typename Result, typename... Args>
-struct target<Callable, true, Result, Args...> final {
-    static void initialize(void* bits, Callable&& target) {
-        new (bits) Callable(std::move(target));
-    }
-    static Result invoke(void* bits, Args... args) {
-        auto& target = *static_cast<Callable*>(bits);
-        return target(std::forward<Args>(args)...);
-    }
-    static void move(void* from_bits, void* to_bits) {
-        auto& from_target = *static_cast<Callable*>(from_bits);
-        new (to_bits) Callable(std::move(from_target));
-        from_target.~Callable();
-    }
-    static void destroy(void* bits) {
-        auto& target = *static_cast<Callable*>(bits);
-        target.~Callable();
-    }
+// vtable for inline target function
 
-    static const target_ops<Result, Args...> ops;
+template <typename Callable, typename Result, typename... Args>
+struct target<Callable,
+              /*is_inline=*/true, /*is_shared=*/false, Result, Args...>
+    final {
+  template <typename Callable_>
+  static void initialize(void* bits, Callable_&& target) {
+    new (bits) Callable(std::forward<Callable_>(target));
+  }
+  static Result invoke(void* bits, Args... args) {
+    auto& target = *static_cast<Callable*>(bits);
+    return target(std::forward<Args>(args)...);
+  }
+  static void move(void* from_bits, void* to_bits) {
+    auto& from_target = *static_cast<Callable*>(from_bits);
+    new (to_bits) Callable(std::move(from_target));
+    from_target.~Callable();
+  }
+  static void destroy(void* bits) {
+    auto& target = *static_cast<Callable*>(bits);
+    target.~Callable();
+  }
+
+  static const target_ops<Result, Args...> ops;
 };
 
-inline void* inline_target_get(void* bits) {
-    return bits;
-}
+inline void* inline_target_get(void* bits) { return bits; }
 
 template <typename Callable, typename Result, typename... Args>
-constexpr target_ops<Result, Args...> target<Callable, true, Result, Args...>::ops = {
-    &inline_target_get,
-    &target::invoke,
-    &target::move,
-    &target::destroy};
+constexpr target_ops<Result, Args...> target<Callable,
+                                             /*is_inline=*/true,
+                                             /*is_shared=*/false, Result, Args...>::ops = {
+    &unshared_target_type_id, &inline_target_get, &target::invoke, &target::move, &target::destroy};
+
+// vtable for pointer to target function
 
 template <typename Callable, typename Result, typename... Args>
-struct target<Callable, false, Result, Args...> final {
-    static void initialize(void* bits, Callable&& target) {
-        auto ptr = static_cast<Callable**>(bits);
-        *ptr = new Callable(std::move(target));
-    }
-    static Result invoke(void* bits, Args... args) {
-        auto& target = **static_cast<Callable**>(bits);
-        return target(std::forward<Args>(args)...);
-    }
-    static void move(void* from_bits, void* to_bits) {
-        auto from_ptr = static_cast<Callable**>(from_bits);
-        auto to_ptr = static_cast<Callable**>(to_bits);
-        *to_ptr = *from_ptr;
-    }
-    static void destroy(void* bits) {
-        auto ptr = static_cast<Callable**>(bits);
-        delete *ptr;
-    }
+struct target<Callable,
+              /*is_inline=*/false, /*is_shared=*/false, Result, Args...>
+    final {
+  template <typename Callable_>
+  static void initialize(void* bits, Callable_&& target) {
+    auto ptr = static_cast<Callable**>(bits);
+    *ptr = new Callable(std::forward<Callable_>(target));
+  }
+  static Result invoke(void* bits, Args... args) {
+    auto& target = **static_cast<Callable**>(bits);
+    return target(std::forward<Args>(args)...);
+  }
+  static void move(void* from_bits, void* to_bits) {
+    auto from_ptr = static_cast<Callable**>(from_bits);
+    auto to_ptr = static_cast<Callable**>(to_bits);
+    *to_ptr = *from_ptr;
+  }
+  static void destroy(void* bits) {
+    auto ptr = static_cast<Callable**>(bits);
+    delete *ptr;
+  }
 
-    static const target_ops<Result, Args...> ops;
+  static const target_ops<Result, Args...> ops;
 };
 
-inline void* heap_target_get(void* bits) {
-    return *static_cast<void**>(bits);
-}
+inline void* heap_target_get(void* bits) { return *static_cast<void**>(bits); }
 
 template <typename Callable, typename Result, typename... Args>
-constexpr target_ops<Result, Args...> target<Callable, false, Result, Args...>::ops = {
-    &heap_target_get,
-    &target::invoke,
-    &target::move,
-    &target::destroy};
+constexpr target_ops<Result, Args...> target<Callable,
+                                             /*is_inline=*/false,
+                                             /*is_shared=*/false, Result, Args...>::ops = {
+    &unshared_target_type_id, &heap_target_get, &target::invoke, &target::move, &target::destroy};
 
-} // namespace internal
-} // namespace fit
+// vtable for fit::function std::shared_ptr to target function
 
-#endif // LIB_FIT_FUNCTION_INTERNAL_H_
+template <typename SharedFunction>
+const void* get_target_type_id(const SharedFunction& function_or_callback) {
+  return function_or_callback.target_type_id();
+}
+
+// For this vtable,
+// Callable by definition will be either a fit::function or fit::callback
+template <typename SharedFunction, typename Result, typename... Args>
+struct target<SharedFunction,
+              /*is_inline=*/false, /*is_shared=*/true, Result, Args...>
+    final {
+  static void initialize(void* bits, SharedFunction target) {
+    new (bits) std::shared_ptr<SharedFunction>(
+        std::move(std::make_shared<SharedFunction>(std::move(target))));
+  }
+  static void copy_shared_ptr(void* from_bits, void* to_bits) {
+    auto& from_shared_ptr = *static_cast<std::shared_ptr<SharedFunction>*>(from_bits);
+    new (to_bits) std::shared_ptr<SharedFunction>(from_shared_ptr);
+  }
+  static const void* target_type_id(void* bits, const void* impl_ops) {
+    auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+    return ::fit::internal::get_target_type_id(function_or_callback);
+  }
+  static void* get(void* bits) {
+    auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+    return function_or_callback.template target<SharedFunction>(
+        /*check=*/false);  // void* will fail the check
+  }
+  static Result invoke(void* bits, Args... args) {
+    auto& function_or_callback = **static_cast<std::shared_ptr<SharedFunction>*>(bits);
+    return function_or_callback(std::forward<Args>(args)...);
+  }
+  static void move(void* from_bits, void* to_bits) {
+    auto from_shared_ptr = std::move(*static_cast<std::shared_ptr<SharedFunction>*>(from_bits));
+    new (to_bits) std::shared_ptr<SharedFunction>(std::move(from_shared_ptr));
+  }
+  static void destroy(void* bits) { static_cast<std::shared_ptr<SharedFunction>*>(bits)->reset(); }
+
+  static const target_ops<Result, Args...> ops;
+};
+
+template <typename SharedFunction, typename Result, typename... Args>
+constexpr target_ops<Result, Args...> target<SharedFunction,
+                                             /*is_inline=*/false,
+                                             /*is_shared=*/true, Result, Args...>::ops = {
+    &target::target_type_id, &target::get, &target::invoke, &target::move, &target::destroy};
+
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+class function_base;
+
+// Function implementation details.
+// See |fit::function| and |fit::callback| documentation for more information.
+template <size_t inline_target_size, bool require_inline, typename Result, typename... Args>
+class function_base<inline_target_size, require_inline, Result(Args...)> {
+  using ops_type = const target_ops<Result, Args...>*;
+  using storage_type = typename std::aligned_storage<(
+      inline_target_size >= sizeof(void*) ? inline_target_size : sizeof(void*))>::
+      type;  // avoid including <algorithm> for max
+  template <typename Callable>
+  using target_type = target<Callable, (sizeof(Callable) <= sizeof(storage_type)),
+                             /*is_shared=*/false, Result, Args...>;
+  template <typename SharedFunction>
+  using shared_target_type = target<SharedFunction,
+                                    /*is_inline=*/false,
+                                    /*is_shared=*/true, Result, Args...>;
+  using null_target_type = target_type<decltype(nullptr)>;
+
+ protected:
+  using result_type = Result;
+
+  function_base() { initialize_null_target(); }
+
+  function_base(decltype(nullptr)) { initialize_null_target(); }
+
+  function_base(Result (*target)(Args...)) { initialize_target(target); }
+
+  template <typename Callable,
+            typename = std::enable_if_t<std::is_convertible<
+                decltype(std::declval<Callable&>()(std::declval<Args>()...)), result_type>::value>>
+  function_base(Callable&& target) {
+    initialize_target(std::forward<Callable>(target));
+  }
+
+  function_base(function_base&& other) { move_target_from(std::move(other)); }
+
+  ~function_base() { destroy_target(); }
+
+  // Returns true if the function has a non-empty target.
+  explicit operator bool() const { return ops_->get(&bits_) != nullptr; }
+
+  // Returns a pointer to the function's target.
+  // If |check| is true (the default), the function _may_ abort if the
+  // caller tries to assign the target to a varible of the wrong type. (This
+  // check is currently skipped for share()d objects.)
+  // Note the shared pointer vtable must set |check| to false to assign the
+  // target to |void*|.
+  template <typename Callable>
+  Callable* target(bool check = true) {
+    if (check)
+      check_target_type<Callable>();
+    return static_cast<Callable*>(ops_->get(&bits_));
+  }
+
+  // Returns a pointer to the function's target (const version).
+  // If |check| is true (the default), the function _may_ abort if the
+  // caller tries to assign the target to a varible of the wrong type. (This
+  // check is currently skipped for share()d objects.)
+  // Note the shared pointer vtable must set |check| to false to assign the
+  // target to |void*|.
+  template <typename Callable>
+  const Callable* target(bool check = true) const {
+    if (check)
+      check_target_type<Callable>();
+    return static_cast<Callable*>(ops_->get(&bits_));
+  }
+
+  // Used by the derived "impl" classes to implement share().
+  //
+  // The caller creates a new object of the same type as itself, and passes in
+  // the empty object. This function first checks if |this| is already shared,
+  // and if not, creates a new version of itself containing a
+  // |std::shared_ptr| to its original self, and updates |ops_| to the vtable
+  // for the shared version.
+  //
+  // Then it copies its |shared_ptr| to the |bits_| of the given |copy|,
+  // and assigns the same shared pointer vtable to the copy's |ops_|.
+  //
+  // The target itself is not copied; it is moved to the heap and its
+  // lifetime is extended until all references have been released.
+  //
+  // Note: This method is not supported on |fit::inline_function<>|
+  //       because it may incur a heap allocation which is contrary to
+  //       the stated purpose of |fit::inline_function<>|.
+  template <typename SharedFunction>
+  void share_with(SharedFunction& copy) {
+    static_assert(!require_inline, "Inline functions cannot be shared.");
+    if (ops_->get(&bits_) != nullptr) {
+      if (ops_ != &shared_target_type<SharedFunction>::ops) {
+        convert_to_shared_target<SharedFunction>();
+      }
+      copy_shared_target_to(copy);
+    }
+  }
+
+  // Used by derived "impl" classes to implement operator()().
+  // Invokes the function's target.
+  // Note that fit::callback will release the target immediately after
+  // invoke() (also affecting any share()d copies).
+  // Aborts if the function's target is empty.
+  Result invoke(Args... args) const { return ops_->invoke(&bits_, std::forward<Args>(args)...); }
+
+  // Used by derived "impl" classes to implement operator=().
+  // Assigns an empty target.
+  void assign(decltype(nullptr)) {
+    destroy_target();
+    initialize_null_target();
+  }
+
+  // Used by derived "impl" classes to implement operator=().
+  // Assigns the function's target.
+  // If target == nullptr, assigns an empty target.
+  template <typename Callable,
+            typename = std::enable_if_t<std::is_convertible<
+                decltype(std::declval<Callable&>()(std::declval<Args>()...)), result_type>::value>>
+  void assign(Callable&& target) {
+    destroy_target();
+    initialize_target(std::forward<Callable>(target));
+  }
+
+  // Used by derived "impl" classes to implement operator=().
+  // Assigns the function with a target moved from another function,
+  // leaving the other function with an empty target.
+  void assign(function_base&& other) {
+    destroy_target();
+    move_target_from(std::move(other));
+  }
+
+  void swap(function_base& other) {
+    if (&other == this)
+      return;
+    ops_type temp_ops = ops_;
+    storage_type temp_bits;
+    ops_->move(&bits_, &temp_bits);
+
+    ops_ = other.ops_;
+    other.ops_->move(&other.bits_, &bits_);
+
+    other.ops_ = temp_ops;
+    temp_ops->move(&temp_bits, &other.bits_);
+  }
+
+  // returns an opaque ID unique to the |Callable| type of the target.
+  // Used by check_target_type.
+  const void* target_type_id() const { return ops_->target_type_id(&bits_, ops_); }
+
+  // Deleted copy constructor and assign. |function_base| implementations are
+  // move-only.
+  function_base(const function_base& other) = delete;
+  function_base& operator=(const function_base& other) = delete;
+
+  // Move assignment must be provided by subclasses.
+  function_base& operator=(function_base&& other) = delete;
+
+ private:
+  // Implements the move operation, used by move construction and move
+  // assignment. Leaves other target initialized to null.
+  void move_target_from(function_base&& other) {
+    ops_ = other.ops_;
+    other.ops_->move(&other.bits_, &bits_);
+    other.initialize_null_target();
+  }
+
+  // fit::function and fit::callback are not directly copyable, but share()
+  // will create shared references to the original object. This method
+  // implements the copy operation for the |std::shared_ptr| wrapper.
+  template <typename SharedFunction>
+  void copy_shared_target_to(SharedFunction& copy) {
+    copy.destroy_target();
+    assert(ops_ == &shared_target_type<SharedFunction>::ops);
+    shared_target_type<SharedFunction>::copy_shared_ptr(&bits_, &copy.bits_);
+    copy.ops_ = ops_;
+  }
+
+  // assumes target is uninitialized
+  void initialize_null_target() { ops_ = &null_target_type::ops; }
+
+  // target may or may not be initialized.
+  template <typename Callable>
+  void initialize_target(Callable&& target) {
+    // Convert function or function references to function pointer.
+    using DecayedCallable = std::decay_t<Callable>;
+    static_assert(
+        std::alignment_of<DecayedCallable>::value <= std::alignment_of<storage_type>::value,
+        "Alignment of Callable must be <= alignment of max_align_t.");
+    static_assert(!require_inline || sizeof(DecayedCallable) <= inline_target_size,
+                  "Callable too large to store inline as requested.");
+    if (is_null(target)) {
+      initialize_null_target();
+    } else {
+      ops_ = &target_type<DecayedCallable>::ops;
+      target_type<DecayedCallable>::initialize(&bits_, std::forward<Callable>(target));
+    }
+  }
+
+  // assumes target is uninitialized
+  template <typename SharedFunction>
+  void convert_to_shared_target() {
+    shared_target_type<SharedFunction>::initialize(&bits_,
+                                                   std::move(*static_cast<SharedFunction*>(this)));
+    ops_ = &shared_target_type<SharedFunction>::ops;
+  }
+
+  // leaves target uninitialized
+  void destroy_target() { ops_->destroy(&bits_); }
+
+  // Called by target() if |check| is true.
+  // Checks the template parameter, usually inferred from the context of
+  // the call to target(), and aborts the program if it can determine that
+  // the Callable type is not compatible with the function's Result and Args.
+  template <typename Callable>
+  void check_target_type() const {
+    if (target_type<Callable>::ops.target_type_id(nullptr, &target_type<Callable>::ops) !=
+        target_type_id()) {
+      __builtin_abort();
+    }
+  }
+
+  ops_type ops_;
+  mutable storage_type bits_;
+};
+
+}  // namespace internal
+
+}  // namespace fit
+
+#endif  // LIB_FIT_FUNCTION_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/function_traits.h b/pkg/fit/include/lib/fit/function_traits.h
index 3e0c2a3..6b02288 100644
--- a/pkg/fit/include/lib/fit/function_traits.h
+++ b/pkg/fit/include/lib/fit/function_traits.h
@@ -13,6 +13,6 @@
 template <typename T>
 using function_traits = callable_traits<T>;
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_FUNCTION_TRAITS_H_
+#endif  // LIB_FIT_FUNCTION_TRAITS_H_
diff --git a/pkg/fit/include/lib/fit/in_place_internal.h b/pkg/fit/include/lib/fit/in_place_internal.h
new file mode 100644
index 0000000..dccb26a
--- /dev/null
+++ b/pkg/fit/include/lib/fit/in_place_internal.h
@@ -0,0 +1,83 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_IN_PLACE_INTERNAL_H_
+#define LIB_FIT_IN_PLACE_INTERNAL_H_
+
+#include <cstddef>
+
+namespace fit {
+
+// Tag for requesting in-place initialization.
+struct in_place_t {
+  explicit constexpr in_place_t() = default;
+};
+
+// Tag for requesting in-place initialization by type.
+template <typename T>
+struct in_place_type_t {
+  explicit constexpr in_place_type_t() = default;
+};
+
+// Tag for requesting in-place initialization by index.
+template <size_t Index>
+struct in_place_index_t final {
+  explicit constexpr in_place_index_t() = default;
+};
+
+#ifdef __cpp_inline_variables
+
+// Inline variables are only available on C++ 17 and beyond.
+
+inline constexpr in_place_t in_place{};
+
+template <typename T>
+inline constexpr in_place_type_t<T> in_place_type{};
+
+template <size_t Index>
+inline constexpr in_place_index_t<Index> in_place_index{};
+
+#else
+
+// For C++ 14 we need to provide storage for the variable so we define
+// a reference instead.
+
+template <typename Dummy = void>
+struct in_place_holder {
+  static constexpr in_place_t instance{};
+};
+
+template <typename T>
+struct in_place_type_holder {
+  static constexpr in_place_type_t<T> instance{};
+};
+
+template <size_t Index>
+struct in_place_index_holder {
+  static constexpr in_place_index_t<Index> instance{};
+};
+
+template <typename Dummy>
+constexpr in_place_t in_place_holder<Dummy>::instance;
+
+template <typename T>
+constexpr in_place_type_t<T> in_place_type_holder<T>::instance;
+
+template <size_t Index>
+constexpr in_place_index_t<Index> in_place_index_holder<Index>::instance;
+
+static constexpr const in_place_t& in_place = in_place_holder<>::instance;
+
+template <typename T>
+static constexpr const in_place_type_t<T>& in_place_type = in_place_type_holder<T>::instance;
+
+template <size_t Index>
+static constexpr const in_place_index_t<Index>& in_place_index =
+    in_place_index_holder<Index>::instance;
+
+#endif  // __cpp_inline_variables
+
+}  // namespace fit
+
+#endif  // LIB_FIT_IN_PLACE_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/nullable.h b/pkg/fit/include/lib/fit/nullable.h
index a6050af..b693612 100644
--- a/pkg/fit/include/lib/fit/nullable.h
+++ b/pkg/fit/include/lib/fit/nullable.h
@@ -21,29 +21,28 @@
 struct is_comparable_with_null<T, decltype(std::declval<const T&>() == nullptr)>
     : public std::true_type {};
 
-// Returns true if a value equals nullptr.
-template <typename T, typename Comparable = bool>
-struct is_null_predicate {
-    constexpr bool operator()(const T& value) { return false; }
-};
-template <typename T>
-struct is_null_predicate<T, decltype(std::declval<const T&>() == nullptr)> {
-    constexpr bool operator()(const T& value) { return value == nullptr; }
-};
-template <typename T>
-constexpr inline bool is_null(const T& value) {
-    return is_null_predicate<T>()(value);
+// Suppress the warning when the compiler can see that a nullable value is
+// never equal to nullptr.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Waddress"
+template <typename T, std::enable_if_t<is_comparable_with_null<T>::value, bool> = true>
+constexpr inline bool is_null(T&& value) {
+  return std::forward<T>(value) == nullptr;
+}
+#pragma GCC diagnostic pop
+
+template <typename T, std::enable_if_t<!is_comparable_with_null<T>::value, bool> = false>
+constexpr inline bool is_null(T&&) {
+  return false;
 }
 
 // Determines whether a type can be initialized, assigned, and compared
 // with nullptr.
 template <typename T>
 struct is_nullable
-    : public std::integral_constant<
-          bool,
-          std::is_constructible<T, decltype(nullptr)>::value &&
-              std::is_assignable<T&, decltype(nullptr)>::value &&
-              is_comparable_with_null<T>::value> {};
+    : public std::integral_constant<bool, std::is_constructible<T, decltype(nullptr)>::value &&
+                                              std::is_assignable<T&, decltype(nullptr)>::value &&
+                                              is_comparable_with_null<T>::value> {};
 template <>
 struct is_nullable<void> : public std::false_type {};
 
@@ -58,188 +57,195 @@
 // - sizeof(std::optional<void*>) == sizeof(struct { bool; void*; })
 // - sizeof(fit::nullable<int>) == sizeof(struct { bool; int; })
 // - sizeof(std::optional<int>) == sizeof(struct { bool; int; })
-template <typename T, bool = (is_nullable<T>::value &&
-                              std::is_constructible<T, T&&>::value &&
+//
+// TODO(fxbug.dev/4681): fit::nullable does not precisely mirror fit::optional now that
+// fit::optional is closer to standards compliant. This should be corrected to
+// avoid surprises when switching between the types.
+template <typename T, bool = (is_nullable<T>::value && std::is_constructible<T, T&&>::value &&
                               std::is_assignable<T&, T&&>::value)>
 class nullable final {
-public:
-    using value_type = T;
+ public:
+  using value_type = T;
 
-    constexpr nullable() = default;
-    explicit constexpr nullable(decltype(nullptr)) {}
-    explicit constexpr nullable(T value)
-        : opt_(std::move(value)) {}
-    nullable(const nullable& other) = default;
-    nullable(nullable&& other) = default;
-    ~nullable() = default;
+  ~nullable() = default;
+  constexpr nullable() = default;
 
-    constexpr T& value() & { return opt_.value(); }
-    constexpr const T& value() const& { return opt_.value(); }
-    constexpr T&& value() && { return std::move(opt_.value()); }
-    constexpr const T&& value() const&& { return std::move(opt_.value()); }
+  explicit constexpr nullable(decltype(nullptr)) {}
+  explicit constexpr nullable(T value) : opt_(std::move(value)) {}
 
-    template <typename U = T>
-    constexpr T value_or(U&& default_value) const {
-        return opt_.value_or(std::forward<U>(default_value));
-    }
+  constexpr nullable(const nullable& other) = default;
+  constexpr nullable& operator=(const nullable& other) = default;
 
-    constexpr T* operator->() { return &*opt_; }
-    constexpr const T* operator->() const { return &*opt_; }
-    constexpr T& operator*() { return *opt_; }
-    constexpr const T& operator*() const { return *opt_; }
+  constexpr nullable(nullable&& other) = default;
+  constexpr nullable& operator=(nullable&& other) = default;
 
-    constexpr bool has_value() const { return opt_.has_value(); }
-    explicit constexpr operator bool() const { return has_value(); }
+  constexpr T& value() & { return opt_.value(); }
+  constexpr const T& value() const& { return opt_.value(); }
+  constexpr T&& value() && { return std::move(opt_.value()); }
+  constexpr const T&& value() const&& { return std::move(opt_.value()); }
 
-    nullable& operator=(const nullable& other) = default;
-    nullable& operator=(nullable&& other) = default;
+  template <typename U = T>
+  constexpr T value_or(U&& default_value) const {
+    return opt_.value_or(std::forward<U>(default_value));
+  }
 
-    nullable& operator=(decltype(nullptr)) {
-        reset();
-        return *this;
-    }
+  constexpr T* operator->() { return &*opt_; }
+  constexpr const T* operator->() const { return &*opt_; }
+  constexpr T& operator*() { return *opt_; }
+  constexpr const T& operator*() const { return *opt_; }
 
-    nullable& operator=(T value) {
-        opt_ = std::move(value);
-        return *this;
-    }
+  constexpr bool has_value() const { return opt_.has_value(); }
+  explicit constexpr operator bool() const { return has_value(); }
 
-    void reset() { opt_.reset(); }
+  constexpr nullable& operator=(decltype(nullptr)) {
+    reset();
+    return *this;
+  }
 
-    void swap(nullable& other) { opt_.swap(other.opt_); }
+  constexpr nullable& operator=(T value) {
+    opt_ = std::move(value);
+    return *this;
+  }
 
-private:
-    optional<T> opt_;
+  constexpr void reset() { opt_.reset(); }
+
+  constexpr void swap(nullable& other) { opt_.swap(other.opt_); }
+
+ private:
+  optional<T> opt_;
 };
 
 template <typename T>
 class nullable<T, true> final {
-public:
-    using value_type = T;
+ public:
+  using value_type = T;
 
-    constexpr nullable()
-        : value_(nullptr) {}
-    explicit constexpr nullable(decltype(nullptr))
-        : value_(nullptr) {}
-    explicit constexpr nullable(T value)
-        : value_(std::move(value)) {}
-    nullable(const nullable& other) = default;
-    nullable(nullable&& other)
-        : value_(std::move(other.value_)) {
-        other.value_ = nullptr;
+  constexpr nullable() : value_(nullptr) {}
+  explicit constexpr nullable(decltype(nullptr)) : value_(nullptr) {}
+  explicit constexpr nullable(T value) : value_(std::move(value)) {}
+  constexpr nullable(const nullable& other) = default;
+  constexpr nullable(nullable&& other) : value_(std::move(other.value_)) {}
+  ~nullable() = default;
+
+  constexpr T& value() & {
+    if (has_value()) {
+      return value_;
+    } else {
+      __builtin_abort();
     }
-    ~nullable() = default;
-
-    constexpr T& value() & {
-        assert(has_value());
-        return value_;
+  }
+  constexpr const T& value() const& {
+    if (has_value()) {
+      return value_;
+    } else {
+      __builtin_abort();
     }
-    constexpr const T& value() const& {
-        assert(has_value());
-        return value_;
+  }
+  constexpr T&& value() && {
+    if (has_value()) {
+      return std::move(value_);
+    } else {
+      __builtin_abort();
     }
-    constexpr T&& value() && {
-        assert(has_value());
-        return std::move(value_);
+  }
+  constexpr const T&& value() const&& {
+    if (has_value()) {
+      return std::move(value_);
+    } else {
+      __builtin_abort();
     }
-    constexpr const T&& value() const&& {
-        assert(has_value());
-        return std::move(value_);
-    }
+  }
 
-    template <typename U = T>
-    constexpr T value_or(U&& default_value) const {
-        return has_value() ? value_ : static_cast<T>(std::forward<U>(default_value));
-    }
+  template <typename U = T>
+  constexpr T value_or(U&& default_value) const {
+    return has_value() ? value_ : static_cast<T>(std::forward<U>(default_value));
+  }
 
-    constexpr T* operator->() { return &value_; }
-    constexpr const T* operator->() const { return &value_; }
-    constexpr T& operator*() { return value_; }
-    constexpr const T& operator*() const { return value_; }
+  constexpr T* operator->() { return &value_; }
+  constexpr const T* operator->() const { return &value_; }
+  constexpr T& operator*() { return value_; }
+  constexpr const T& operator*() const { return value_; }
 
-    constexpr bool has_value() const { return !(value_ == nullptr); }
-    explicit constexpr operator bool() const { return has_value(); }
+  constexpr bool has_value() const { return !(value_ == nullptr); }
+  explicit constexpr operator bool() const { return has_value(); }
 
-    nullable& operator=(const nullable& other) = default;
-    nullable& operator=(nullable&& other) {
-        if (&other == this)
-            return *this;
-        value_ = std::move(other.value_);
-        other.value_ = nullptr;
-        return *this;
-    }
+  constexpr nullable& operator=(const nullable& other) = default;
+  constexpr nullable& operator=(nullable&& other) {
+    value_ = std::move(other.value_);
+    return *this;
+  }
 
-    nullable& operator=(decltype(nullptr)) {
-        reset();
-        return *this;
-    }
+  constexpr nullable& operator=(decltype(nullptr)) {
+    reset();
+    return *this;
+  }
 
-    nullable& operator=(T value) {
-        value_ = std::move(value);
-        return *this;
-    }
+  constexpr nullable& operator=(T value) {
+    value_ = std::move(value);
+    return *this;
+  }
 
-    void reset() { value_ = nullptr; }
+  constexpr void reset() { value_ = nullptr; }
 
-    void swap(nullable& other) {
-        using std::swap;
-        swap(value_, other.value_);
-    }
+  constexpr void swap(nullable& other) {
+    using std::swap;
+    swap(value_, other.value_);
+  }
 
-private:
-    T value_;
+ private:
+  T value_;
 };
 
 template <typename T>
 void swap(nullable<T>& a, nullable<T>& b) {
-    a.swap(b);
+  a.swap(b);
 }
 
 template <typename T>
 constexpr bool operator==(const nullable<T>& lhs, decltype(nullptr)) {
-    return !lhs.has_value();
+  return !lhs.has_value();
 }
 template <typename T>
 constexpr bool operator!=(const nullable<T>& lhs, decltype(nullptr)) {
-    return lhs.has_value();
+  return lhs.has_value();
 }
 
 template <typename T>
 constexpr bool operator==(decltype(nullptr), const nullable<T>& rhs) {
-    return !rhs.has_value();
+  return !rhs.has_value();
 }
 template <typename T>
 constexpr bool operator!=(decltype(nullptr), const nullable<T>& rhs) {
-    return rhs.has_value();
+  return rhs.has_value();
 }
 
 template <typename T, typename U>
 constexpr bool operator==(const nullable<T>& lhs, const nullable<U>& rhs) {
-    return (lhs.has_value() == rhs.has_value()) && (!lhs.has_value() || *lhs == *rhs);
+  return (lhs.has_value() == rhs.has_value()) && (!lhs.has_value() || *lhs == *rhs);
 }
 template <typename T, typename U>
 constexpr bool operator!=(const nullable<T>& lhs, const nullable<U>& rhs) {
-    return (lhs.has_value() != rhs.has_value()) || (lhs.has_value() && *lhs != *rhs);
+  return (lhs.has_value() != rhs.has_value()) || (lhs.has_value() && *lhs != *rhs);
 }
 
 template <typename T, typename U>
 constexpr bool operator==(const nullable<T>& lhs, const U& rhs) {
-    return (lhs.has_value() != is_null(rhs)) && (!lhs.has_value() || *lhs == rhs);
+  return (lhs.has_value() != is_null(rhs)) && (!lhs.has_value() || *lhs == rhs);
 }
 template <typename T, typename U>
 constexpr bool operator!=(const nullable<T>& lhs, const U& rhs) {
-    return (lhs.has_value() == is_null(rhs)) || (lhs.has_value() && *lhs != rhs);
+  return (lhs.has_value() == is_null(rhs)) || (lhs.has_value() && *lhs != rhs);
 }
 
 template <typename T, typename U>
 constexpr bool operator==(const T& lhs, const nullable<U>& rhs) {
-    return (is_null(lhs) != rhs.has_value()) && (!rhs.has_value() || lhs == *rhs);
+  return (is_null(lhs) != rhs.has_value()) && (!rhs.has_value() || lhs == *rhs);
 }
 template <typename T, typename U>
 constexpr bool operator!=(const T& lhs, const nullable<U>& rhs) {
-    return (is_null(lhs) == rhs.has_value()) || (rhs.has_value() && lhs != *rhs);
+  return (is_null(lhs) == rhs.has_value()) || (rhs.has_value() && lhs != *rhs);
 }
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_NULLABLE_H_
+#endif  // LIB_FIT_NULLABLE_H_
diff --git a/pkg/fit/include/lib/fit/optional.h b/pkg/fit/include/lib/fit/optional.h
index 929f05b..a29f2ea 100644
--- a/pkg/fit/include/lib/fit/optional.h
+++ b/pkg/fit/include/lib/fit/optional.h
@@ -5,294 +5,478 @@
 #ifndef LIB_FIT_OPTIONAL_H_
 #define LIB_FIT_OPTIONAL_H_
 
-#include <assert.h>
+#if defined(__cplusplus) && __cplusplus >= 201703L && !defined(FORCE_FIT_OPTIONAL)
 
+// In C++17 fit::optional should simply be an alias for std::optional.
+
+#include <optional>
+
+namespace fit {
+
+using std::make_optional;
+using std::nullopt;
+using std::nullopt_t;
+using std::optional;
+
+}  // namespace fit
+
+#else
+
+#include <exception>
 #include <new>
 #include <type_traits>
 #include <utility>
 
+#include "constructors_internal.h"
+#include "in_place_internal.h"
+#include "storage_internal.h"
+#include "traits.h"
+#include "utility_internal.h"
+
 namespace fit {
-namespace internal {
 
-template <typename T, bool = std::is_assignable<T&, const T&>::value>
-struct copy_assign_or_reconstruct final {
-    static void assign(T* dest, const T& source) {
-        dest->~T();
-        new (dest) T(source);
-    }
-};
-
-template <typename T>
-struct copy_assign_or_reconstruct<T, true> final {
-    static void assign(T* dest, const T& source) {
-        *dest = source;
-    }
-};
-
-template <typename T, bool = std::is_assignable<T&, T&&>::value>
-struct move_assign_or_reconstruct final {
-    static void assign(T* dest, T&& source) {
-        dest->~T();
-        new (dest) T(std::move(source));
-    }
-
-    static void swap(T& a, T& b) {
-        T temp(std::move(a));
-        a.~T();
-        new (&a) T(std::move(b));
-        b.~T();
-        new (&b) T(std::move(temp));
-    }
-};
-
-template <typename T>
-struct move_assign_or_reconstruct<T, true> final {
-    static void assign(T* dest, T&& source) {
-        *dest = std::move(source);
-    }
-
-    static void swap(T& a, T& b) {
-        using std::swap;
-        swap(a, b);
-    }
-};
-
-} // namespace internal
-
-// A sentinel value for |fit::optional<T>| indicating that it contains
-// no value.
+// A sentinel value for indicating that it contains no value.
 struct nullopt_t {
-    explicit constexpr nullopt_t(int) {}
+  explicit constexpr nullopt_t(int) {}
 };
-static constexpr nullopt_t nullopt(0);
+static constexpr nullopt_t nullopt{0};
 
-// A minimal implementation of an |std::optional<T>| work-alike for C++ 14.
-//
-// See also |fit::nullable<T>| which may be more efficient in certain
-// circumstances if T can be initialized, assigned, and compared with
-// nullptr.
-//
-// TODO(US-90): The initial implementation only covers a minimal subset of the
-// std::optional API.  Flesh this out more fully then define fit::optional
-// to be an alias for std::optional when compiling with C++ 17.
-template <typename T>
-class optional final {
-public:
-    using value_type = T;
+// Exception type to report bad accesses to optional.
+class bad_optional_access : public std::exception {
+ public:
+  bad_optional_access() noexcept {}
 
-    constexpr optional()
-        : has_value_(false) {}
-    constexpr optional(nullopt_t)
-        : has_value_(false) {}
+  const char* what() const noexcept override { return reason_; }
 
-    explicit constexpr optional(T value)
-        : has_value_(true), value_(std::move(value)) {}
+ private:
+  template <typename T>
+  friend class optional;
 
-    optional(const optional& other)
-        : has_value_(other.has_value_) {
-        if (has_value_) {
-            new (&value_) T(other.value_);
-        }
-    }
+  bad_optional_access(const char* reason) noexcept : reason_{reason} {}
 
-    optional(optional&& other)
-        : has_value_(other.has_value_) {
-        if (has_value_) {
-            new (&value_) T(std::move(other.value_));
-            other.value_.~T();
-            other.has_value_ = false;
-        }
-    }
-
-    // TODO(US-90): Presence of this destructor makes the type non-literal.
-    // We should specialize this type to handle the case where T is literal
-    // explicitly so that expressions these types can be constexpr.
-    ~optional() {
-        if (has_value_) {
-            value_.~T();
-        }
-    }
-
-    constexpr T& value() & {
-        assert(has_value_);
-        return value_;
-    }
-
-    constexpr const T& value() const& {
-        assert(has_value_);
-        return value_;
-    }
-
-    constexpr T&& value() && {
-        assert(has_value_);
-        return std::move(value_);
-    }
-
-    constexpr const T&& value() const&& {
-        assert(has_value_);
-        return std::move(value_);
-    }
-
-    template <typename U = T>
-    constexpr T value_or(U&& default_value) const {
-        return has_value_ ? value_ : static_cast<T>(std::forward<U>(default_value));
-    }
-
-    constexpr T* operator->() { return &value_; }
-    constexpr const T* operator->() const { return &value_; }
-    constexpr T& operator*() { return value_; }
-    constexpr const T& operator*() const { return value_; }
-
-    bool has_value() const { return has_value_; }
-    explicit operator bool() const { return has_value(); }
-
-    optional& operator=(const optional& other) {
-        if (&other == this)
-            return *this;
-        if (has_value_) {
-            if (other.has_value_) {
-                ::fit::internal::copy_assign_or_reconstruct<T>::assign(
-                    &value_, other.value_);
-            } else {
-                reset();
-            }
-        } else if (other.has_value_) {
-            new (&value_) T(other.value_);
-            has_value_ = true;
-        }
-        return *this;
-    }
-
-    optional& operator=(optional&& other) {
-        if (&other == this)
-            return *this;
-        if (has_value_) {
-            if (other.has_value_) {
-                ::fit::internal::move_assign_or_reconstruct<T>::assign(
-                    &value_, std::move(other.value_));
-                other.value_.~T();
-                other.has_value_ = false;
-            } else {
-                reset();
-            }
-        } else if (other.has_value_) {
-            new (&value_) T(std::move(other.value_));
-            has_value_ = true;
-            other.value_.~T();
-            other.has_value_ = false;
-        }
-        return *this;
-    }
-
-    optional& operator=(nullopt_t) {
-        reset();
-        return *this;
-    }
-
-    optional& operator=(T value) {
-        if (has_value_) {
-            ::fit::internal::move_assign_or_reconstruct<T>::assign(
-                &value_, std::move(value));
-        } else {
-            new (&value_) T(std::move(value));
-            has_value_ = true;
-        }
-        return *this;
-    }
-
-    void reset() {
-        if (has_value_) {
-            value_.~T();
-            has_value_ = false;
-        }
-    }
-
-    void swap(optional& other) {
-        if (&other == this)
-            return;
-        if (has_value_) {
-            if (other.has_value_) {
-                ::fit::internal::move_assign_or_reconstruct<T>::swap(
-                    value_, other.value_);
-            } else {
-                new (&other.value_) T(std::move(value_));
-                other.has_value_ = true;
-                value_.~T();
-                has_value_ = false;
-            }
-        } else if (other.has_value_) {
-            new (&value_) T(std::move(other.value_));
-            has_value_ = true;
-            other.value_.~T();
-            other.has_value_ = false;
-        }
-    }
-
-    template <typename... Args>
-    T& emplace(Args&&... args) {
-        reset();
-        new (&value_) T(std::forward<Args...>(args)...);
-        has_value_ = true;
-        return value_;
-    }
-
-private:
-    bool has_value_;
-    union {
-        T value_;
-    };
+  // String describing the reason for the bad access. Must point to a string
+  // with static storage duration.
+  const char* reason_;
 };
 
+// A reasonably complete implementation of std::optional compatible with C++14.
+//
+// See also fit::nullable<T>, which may be more efficient in certain
+// circumstances when T can be initialized, assigned, and compared with nullptr.
+//
 template <typename T>
-void swap(optional<T>& a, optional<T>& b) {
-    a.swap(b);
+class optional : private ::fit::internal::modulate_copy_and_move<T> {
+ private:
+  // Helper types and values for SFINAE and noexcept rules.
+  static constexpr bool nothrow_move_constructible = std::is_nothrow_move_constructible<T>::value;
+
+  static constexpr bool nothrow_swappable = std::is_nothrow_move_constructible<T>::value &&
+                                            ::fit::internal::is_nothrow_swappable<T>::value;
+
+  static constexpr auto trivial_init_v = ::fit::internal::trivial_init_v;
+  static constexpr auto maybe_init_v = ::fit::internal::maybe_init_v;
+  using type_tag = ::fit::internal::type_tag<T>;
+
+  template <typename U, typename V>
+  using converts_from_optional = disjunction<
+      std::is_constructible<U, const optional<V>&>, std::is_constructible<U, optional<V>&>,
+      std::is_constructible<U, const optional<V>&&>, std::is_constructible<U, optional<V>&&>,
+      std::is_convertible<const optional<V>&, U>, std::is_convertible<optional<V>&, U>,
+      std::is_convertible<const optional<V>&&, U>, std::is_convertible<optional<V>&&, U>>;
+
+  template <typename U, typename V>
+  using assigns_from_optional =
+      disjunction<std::is_assignable<U&, const optional<V>&>, std::is_assignable<U&, optional<V>&>,
+                  std::is_assignable<U&, const optional<V>&&>,
+                  std::is_assignable<U&, optional<V>&&>>;
+
+  template <typename U>
+  using not_self_type = ::fit::internal::not_same_type<optional, U>;
+
+  template <typename U>
+  using not_in_place = ::fit::internal::not_same_type<in_place_t, U>;
+
+  template <typename... Conditions>
+  using requires_conditions = ::fit::internal::requires_conditions<Conditions...>;
+
+  template <typename... Conditions>
+  using assignment_requires_conditions =
+      ::fit::internal::assignment_requires_conditions<optional&, Conditions...>;
+
+  template <typename... Args>
+  using emplace_constructible = std::enable_if_t<std::is_constructible<T, Args...>::value, T&>;
+
+  [[noreturn]] static constexpr void throw_bad_optional_access(const char* reason) {
+#if __cpp_exceptions
+    throw bad_optional_access(reason);
+#else
+    (void)reason;
+    __builtin_abort();
+#endif
+  }
+
+ public:
+  using value_type = T;
+
+  // Default constructors.
+
+  constexpr optional() = default;
+
+  constexpr optional(nullopt_t) noexcept {}
+
+  // Copy/move constructors and assignment operators.
+
+  constexpr optional(const optional&) = default;
+  constexpr optional& operator=(const optional&) = default;
+
+  constexpr optional(optional&&) = default;
+  constexpr optional& operator=(optional&&) = default;
+
+  // Converting constructors.
+
+  template <typename U = T,
+            requires_conditions<not_self_type<U>, not_in_place<U>, std::is_constructible<T, U&&>,
+                                std::is_convertible<U&&, T>> = true>
+  constexpr optional(U&& value) : storage_(type_tag{}, std::forward<U>(value)) {}
+
+  template <typename U = T,
+            requires_conditions<not_self_type<U>, not_in_place<U>, std::is_constructible<T, U&&>,
+                                negation<std::is_convertible<U&&, T>>> = false>
+  explicit constexpr optional(U&& value) : storage_{type_tag{}, std::forward<U>(value)} {}
+
+  template <typename U,
+            requires_conditions<negation<std::is_same<T, U>>, std::is_constructible<T, const U&>,
+                                std::is_convertible<const U&, T>,
+                                negation<converts_from_optional<T, U>>> = true>
+  constexpr optional(const optional<U>& other) : storage_{maybe_init_v, other.storage_} {}
+
+  template <typename U,
+            requires_conditions<negation<std::is_same<T, U>>, std::is_constructible<T, const U&>,
+                                negation<std::is_convertible<const U&, T>>,
+                                negation<converts_from_optional<T, U>>> = false>
+  explicit constexpr optional(const optional<U>& other) : storage_{maybe_init_v, other.storage_} {}
+
+  template <typename U,
+            requires_conditions<negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
+                                std::is_convertible<U&&, T>,
+                                negation<converts_from_optional<T, U>>> = true>
+  constexpr optional(optional<U>&& other) : storage_{maybe_init_v, std::move(other.storage_)} {}
+
+  template <typename U,
+            requires_conditions<negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
+                                negation<std::is_convertible<U&&, T>>,
+                                negation<converts_from_optional<T, U>>> = false>
+  explicit constexpr optional(optional<U>&& other)
+      : storage_{maybe_init_v, std::move(other.storage_)} {}
+
+  template <typename... Args, requires_conditions<std::is_constructible<T, Args&&...>> = false>
+  explicit constexpr optional(in_place_t, Args&&... args)
+      : storage_(type_tag{}, std::forward<Args>(args)...) {}
+
+  template <
+      typename U, typename... Args,
+      requires_conditions<std::is_constructible<T, std::initializer_list<U>&, Args&&...>> = false>
+  explicit constexpr optional(in_place_t, std::initializer_list<U> init_list, Args&&... args)
+      : storage_(type_tag{}, init_list, std::forward<Args>(args)...) {}
+
+  // Destructor.
+
+  ~optional() = default;
+
+  // Checked accessors.
+
+  constexpr T& value() & {
+    if (has_value()) {
+      return storage_.get(type_tag{});
+    } else {
+      throw_bad_optional_access("Accessed value of empty optional!");
+    }
+  }
+  constexpr const T& value() const& {
+    if (has_value()) {
+      return storage_.get(type_tag{});
+    } else {
+      throw_bad_optional_access("Accessed value of empty optional!");
+    }
+  }
+  constexpr T&& value() && {
+    if (has_value()) {
+      return std::move(storage_.get(type_tag{}));
+    } else {
+      throw_bad_optional_access("Accessed value of empty optional!");
+    }
+  }
+  constexpr const T&& value() const&& {
+    if (has_value()) {
+      return std::move(storage_.get(type_tag{}));
+    } else {
+      throw_bad_optional_access("Accessed value of empty optional!");
+    }
+  }
+
+  template <typename U>
+  constexpr T value_or(U&& default_value) const& {
+    static_assert(std::is_copy_constructible<T>::value,
+                  "value_or() requires copy-constructible value_type!");
+    static_assert(std::is_convertible<U&&, T>::value,
+                  "Default value must be convertible to value_type!");
+
+    return has_value() ? storage_.get(type_tag{}) : static_cast<T>(std::forward<U>(default_value));
+  }
+  template <typename U>
+  constexpr T value_or(U&& default_value) && {
+    static_assert(std::is_move_constructible<T>::value,
+                  "value_or() requires move-constructible value_type!");
+    static_assert(std::is_convertible<U&&, T>::value,
+                  "Default value must be convertible to value_type!");
+
+    return has_value() ? std::move(storage_.get(type_tag{}))
+                       : static_cast<T>(std::forward<U>(default_value));
+  }
+
+  // Unchecked accessors.
+
+  constexpr T* operator->() { return std::addressof(storage_.get(type_tag{})); }
+  constexpr const T* operator->() const { return std::addressof(storage_.get(type_tag{})); }
+
+  constexpr T& operator*() { return storage_.get(type_tag{}); }
+  constexpr const T& operator*() const { return storage_.get(type_tag{}); }
+
+  // Availability accessors/operators.
+
+  constexpr bool has_value() const { return !storage_.is_empty(); }
+  constexpr explicit operator bool() const { return has_value(); }
+
+  // Assignment operators.
+
+  template <typename U>
+  constexpr assignment_requires_conditions<
+      not_self_type<U>, negation<conjunction<std::is_scalar<T>, std::is_same<T, std::decay_t<U>>>>,
+      std::is_constructible<T, U>, std::is_assignable<T&, U>>
+  operator=(U&& value) {
+    if (has_value()) {
+      storage_.get(type_tag{}) = std::forward<U>(value);
+    } else {
+      storage_.construct(type_tag{}, std::forward<U>(value));
+    }
+    return *this;
+  }
+
+  template <typename U>
+  constexpr assignment_requires_conditions<
+      negation<std::is_same<T, U>>, std::is_constructible<T, const U&>, std::is_assignable<T&, U>,
+      negation<converts_from_optional<T, U>>, negation<assigns_from_optional<T, U>>>
+  operator=(const optional<U>& other) {
+    storage_.assign(other.storage_);
+    return *this;
+  }
+
+  template <typename U>
+  constexpr assignment_requires_conditions<
+      negation<std::is_same<T, U>>, std::is_constructible<T, U>, std::is_assignable<T&, U>,
+      negation<converts_from_optional<T, U>>, negation<assigns_from_optional<T, U>>>
+  operator=(optional<U>&& other) {
+    storage_.assign(std::move(other.storage_));
+    return *this;
+  }
+
+  constexpr optional& operator=(nullopt_t) {
+    storage_.reset();
+    return *this;
+  }
+
+  // Swap.
+
+  constexpr void swap(optional& other) noexcept(nothrow_swappable) {
+    storage_.swap(other.storage_);
+  }
+
+  // Emplacement.
+
+  template <typename... Args>
+  constexpr emplace_constructible<Args&&...> emplace(Args&&... args) {
+    storage_.reset();
+    storage_.construct(type_tag{}, std::forward<Args>(args)...);
+    return storage_.get(type_tag{});
+  }
+
+  template <typename U, typename... Args>
+  constexpr emplace_constructible<std::initializer_list<U>&, Args&&...> emplace(
+      std::initializer_list<U> init_list, Args&&... args) {
+    storage_.reset();
+    storage_.construct(type_tag{}, init_list, std::forward<Args>(args)...);
+    return storage_.get(type_tag{});
+  }
+
+  // Reset.
+
+  void reset() noexcept { storage_.reset(); }
+
+ private:
+  ::fit::internal::storage_type<T> storage_;
+};
+
+// Swap.
+template <typename T>
+inline std::enable_if_t<(std::is_move_constructible<T>::value &&
+                         ::fit::internal::is_swappable<T>::value)>
+swap(optional<T>& a, optional<T>& b) noexcept(noexcept(a.swap(b))) {
+  a.swap(b);
+}
+template <typename T>
+inline std::enable_if_t<(!std::is_move_constructible<T>::value &&
+                         ::fit::internal::is_swappable<T>::value)>
+swap(optional<T>& a, optional<T>& b) = delete;
+
+// Make optional.
+template <typename T>
+constexpr optional<std::decay_t<T>> make_optional(T&& value) {
+  return optional<std::decay_t<T>>{std::forward<T>(value)};
+}
+template <typename T, typename... Args>
+constexpr optional<T> make_optional(Args&&... args) {
+  return optional<T>{in_place, std::forward<Args>(args)...};
+}
+template <typename T, typename U, typename... Args>
+constexpr optional<T> make_optional(std::initializer_list<U> init_list, Args&&... args) {
+  return optional<T>{in_place, init_list, std::forward<Args>(args)...};
 }
 
+// Empty.
 template <typename T>
 constexpr bool operator==(const optional<T>& lhs, nullopt_t) {
-    return !lhs.has_value();
+  return !lhs.has_value();
 }
 template <typename T>
 constexpr bool operator!=(const optional<T>& lhs, nullopt_t) {
-    return lhs.has_value();
+  return lhs.has_value();
 }
 
 template <typename T>
 constexpr bool operator==(nullopt_t, const optional<T>& rhs) {
-    return !rhs.has_value();
+  return !rhs.has_value();
 }
 template <typename T>
 constexpr bool operator!=(nullopt_t, const optional<T>& rhs) {
-    return rhs.has_value();
+  return rhs.has_value();
 }
 
-template <typename T, typename U>
+// Equal/not equal.
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() == std::declval<U>())> = true>
 constexpr bool operator==(const optional<T>& lhs, const optional<U>& rhs) {
-    return (lhs.has_value() == rhs.has_value()) && (!lhs.has_value() || *lhs == *rhs);
+  return (lhs.has_value() == rhs.has_value()) && (!lhs.has_value() || *lhs == *rhs);
 }
-template <typename T, typename U>
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() != std::declval<U>())> = true>
 constexpr bool operator!=(const optional<T>& lhs, const optional<U>& rhs) {
-    return (lhs.has_value() != rhs.has_value()) || (lhs.has_value() && *lhs != *rhs);
+  return (lhs.has_value() != rhs.has_value()) || (lhs.has_value() && *lhs != *rhs);
 }
 
-template <typename T, typename U>
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() == std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
 constexpr bool operator==(const optional<T>& lhs, const U& rhs) {
-    return lhs.has_value() && *lhs == rhs;
+  return lhs.has_value() && *lhs == rhs;
 }
-template <typename T, typename U>
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() != std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
 constexpr bool operator!=(const optional<T>& lhs, const U& rhs) {
-    return !lhs.has_value() || *lhs != rhs;
+  return !lhs.has_value() || *lhs != rhs;
 }
 
-template <typename T, typename U>
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() == std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
 constexpr bool operator==(const T& lhs, const optional<U>& rhs) {
-    return rhs.has_value() && lhs == *rhs;
+  return rhs.has_value() && lhs == *rhs;
 }
-template <typename T, typename U>
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() != std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
 constexpr bool operator!=(const T& lhs, const optional<U>& rhs) {
-    return !rhs.has_value() || lhs != *rhs;
+  return !rhs.has_value() || lhs != *rhs;
 }
 
-} // namespace fit
+// Less than/greater than.
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() < std::declval<U>())> = true>
+constexpr bool operator<(const optional<T>& lhs, const optional<U>& rhs) {
+  return rhs.has_value() && (!lhs.has_value() || *lhs < *rhs);
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() > std::declval<U>())> = true>
+constexpr bool operator>(const optional<T>& lhs, const optional<U>& rhs) {
+  return lhs.has_value() && (!rhs.has_value() || *lhs > *rhs);
+}
 
-#endif // LIB_FIT_OPTIONAL_H_
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() < std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
+constexpr bool operator<(const optional<T>& lhs, const U& rhs) {
+  return !lhs.has_value() || *lhs < rhs;
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() > std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
+constexpr bool operator>(const optional<T>& lhs, const U& rhs) {
+  return lhs.has_value() && *lhs > rhs;
+}
+
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() < std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
+constexpr bool operator<(const T& lhs, const optional<U>& rhs) {
+  return rhs.has_value() && lhs < *rhs;
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() > std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
+constexpr bool operator>(const T& lhs, const optional<U>& rhs) {
+  return !rhs.has_value() || lhs > *rhs;
+}
+
+// Less than or equal/greater than or equal.
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() <= std::declval<U>())> = true>
+constexpr bool operator<=(const optional<T>& lhs, const optional<U>& rhs) {
+  return !lhs.has_value() || (rhs.has_value() && *lhs <= *rhs);
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() >= std::declval<U>())> = true>
+constexpr bool operator>=(const optional<T>& lhs, const optional<U>& rhs) {
+  return !rhs.has_value() || (lhs.has_value() && *lhs >= *rhs);
+}
+
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() <= std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
+constexpr bool operator<=(const optional<T>& lhs, const U& rhs) {
+  return !lhs.has_value() || *lhs <= rhs;
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() >= std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, U>> = true>
+constexpr bool operator>=(const optional<T>& lhs, const U& rhs) {
+  return lhs.has_value() && *lhs >= rhs;
+}
+
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() <= std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
+constexpr bool operator<=(const T& lhs, const optional<U>& rhs) {
+  return rhs.has_value() && lhs <= *rhs;
+}
+template <typename T, typename U,
+          ::fit::internal::enable_relop_t<decltype(std::declval<T>() >= std::declval<U>()),
+                                          ::fit::internal::not_same_type<nullopt_t, T>> = true>
+constexpr bool operator>=(const T& lhs, const optional<U>& rhs) {
+  return !rhs.has_value() || lhs >= *rhs;
+}
+
+}  // namespace fit
+
+#endif
+
+#endif  // LIB_FIT_OPTIONAL_H_
diff --git a/pkg/fit/include/lib/fit/promise.h b/pkg/fit/include/lib/fit/promise.h
index ece9e75..0270909 100644
--- a/pkg/fit/include/lib/fit/promise.h
+++ b/pkg/fit/include/lib/fit/promise.h
@@ -26,6 +26,9 @@
 // a variety of combinators such as |then()|.
 //
 // Use |fit::make_promise()| to create a promise.
+// Use |fit::make_ok_promise()| to create a promise that immediately returns a value.
+// Use |fit::make_error_promise()| to create a promise that immediately returns an error.
+// Use |fit::make_result_promise()| to create a promise that immediately returns a result.
 // Use |fit::future| to more conveniently hold a promise or its result.
 // Use |fit::pending_task| to wrap a promise as a pending task for execution.
 // Use |fit::executor| to execute a pending task.
@@ -63,8 +66,12 @@
 //                        fit::result<> when prior promise completes
 //    |wrap_with()|: applies a wrapper to the promise
 //    |box()|: wraps the promise's continuation into a |fit::function|
-//    |fit::join_promises()|: await multiple promises, once they all complete
-//                            return a tuple of their results
+//    |fit::join_promises()|: await multiple promises in an argument list,
+//                            once they all complete return a tuple of
+//                            their results
+//    |fit::join_promise_vector()|: await multiple promises in a vector,
+//                                  once they all complete return a vector
+//                                  of their results
 //
 // You can also create your own custom combinators by crafting new
 // types of continuations.
@@ -146,7 +153,7 @@
 // complicated continuation types that are hard to describe, often consisting of
 // nested templates and lambdas.  These are referred to as "unboxed"
 // promises.  In contrast, "boxed" promises are parameterized by a
-// a |fit::function| that hides (or "erases") the type of the continuation
+// |fit::function| that hides (or "erases") the type of the continuation
 // thereby yielding type that is easier to describe.
 //
 // You can recognize boxed and unboxed promises by their types.
@@ -175,20 +182,20 @@
 // Do this: (chaining as a single expression performs at most one heap allocation)
 //
 //     fit::promise<> f = fit::make_promise([] { ... });
-//         .then([](fit::result<> result) { ... });
+//         .then([](fit::result<>& result) { ... });
 //         .and_then([] { ... });
 //
 // Or this: (still only performs at most one heap allocation)
 //
 //     auto f = fit::make_promise([] { ... });
-//     auto g = f.then([](fit::result<> result) { ... });
+//     auto g = f.then([](fit::result<>& result) { ... });
 //     auto h = g.and_then([] { ... });
 //     fit::promise<> boxed_h = h;
 //
 // But don't do this: (incurs up to three heap allocations due to eager boxing)
 //
 //     fit::promise<> f = fit::make_promise([] { ... });
-//     fit::promise<> g = f.then([](fit::result<> result) { ... });
+//     fit::promise<> g = f.then([](fit::result<>& result) { ... });
 //     fit::promise<> h = g.and_then([] { ... });
 //
 // SINGLE OWNERSHIP MODEL
@@ -275,8 +282,10 @@
 //
 // EXAMPLE
 //
-// - https://fuchsia.googlesource.com/zircon/+/master/system/utest/fit/examples/promise_example1.cpp
-// - https://fuchsia.googlesource.com/zircon/+/master/system/utest/fit/examples/promise_example2.cpp
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/zircon/system/utest/fit/examples/promise_example1.cc
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/zircon/system/utest/fit/examples/promise_example2.cc
 //
 template <typename V = void, typename E = void>
 using promise = promise_impl<function<result<V, E>(fit::context&)>>;
@@ -285,499 +294,477 @@
 // See |fit::promise| documentation for more information.
 template <typename Continuation>
 class promise_impl final {
-    static_assert(
-        ::fit::internal::is_continuation<Continuation>::value,
-        "Continuation type is invalid.  A continuation is a callable object "
-        "with this signature: fit::result<V, E>(fit::context&).");
+  static_assert(::fit::internal::is_continuation<Continuation>::value,
+                "Continuation type is invalid.  A continuation is a callable object "
+                "with this signature: fit::result<V, E>(fit::context&).");
 
-    using state_type = nullable<Continuation>;
+  using state_type = nullable<Continuation>;
 
-public:
-    // The type of callable object held by the promise.
-    // Its signature is: result_type(fit::context&).
-    using continuation_type = Continuation;
+ public:
+  // The type of callable object held by the promise.
+  // Its signature is: result_type(fit::context&).
+  using continuation_type = Continuation;
 
-    // The promise's result type.
-    // Equivalent to fit::result<value_type, error_type>.
-    using result_type = typename ::fit::internal::continuation_traits<
-        Continuation>::result_type;
+  // The promise's result type.
+  // Equivalent to fit::result<value_type, error_type>.
+  using result_type = typename ::fit::internal::continuation_traits<Continuation>::result_type;
 
-    // The type of value produced when the promise completes successfully.
-    // May be void.
-    using value_type = typename result_type::value_type;
+  // The type of value produced when the promise completes successfully.
+  // May be void.
+  using value_type = typename result_type::value_type;
 
-    // The type of value produced when the promise completes with an error.
-    // May be void.
-    using error_type = typename result_type::error_type;
+  // The type of value produced when the promise completes with an error.
+  // May be void.
+  using error_type = typename result_type::error_type;
 
-    // Creates an empty promise without a continuation.
-    // A continuation must be assigned before the promise can be used.
-    promise_impl() = default;
-    explicit promise_impl(decltype(nullptr)) {}
+  // Creates an empty promise without a continuation.
+  // A continuation must be assigned before the promise can be used.
+  promise_impl() = default;
+  explicit promise_impl(decltype(nullptr)) {}
 
-    // Creates a promise with a continuation.
-    // If |continuation| equals nullptr then the promise is empty.
-    explicit promise_impl(continuation_type continuation)
-        : state_(std::move(continuation)) {}
+  promise_impl(const promise_impl&) = delete;
+  promise_impl& operator=(const promise_impl&) = delete;
 
-    // Converts from a promise holding a continuation that is assignable to
-    // to this promise's continuation type.
-    //
-    // This is typically used to create a promise with a boxed continuation
-    // type (such as |fit::function|) from an unboxed promise produced by
-    // |fit::make_promise| or by combinators.
-    //
-    // EXAMPLE
-    //
-    //     // f is a promise_impl with a complicated unboxed type
-    //     auto f = fit::make_promise([] { ... });
-    //
-    //     // g wraps f's continuation
-    //     fit::promise<> g = std::move(f);
-    //
-    template <typename OtherContinuation,
-              typename = std::enable_if_t<
-                  std::is_constructible<continuation_type,
-                                        OtherContinuation&&>::value>>
-    promise_impl(promise_impl<OtherContinuation> other)
-        : state_(other.state_.has_value()
-                     ? state_type(continuation_type(std::move(*other.state_)))
-                     : state_type()) {}
+  // Constructs the promise by taking the continuation from another promise,
+  // leaving the other promise empty.
+  promise_impl(promise_impl&& other) : state_{std::move(other.state_)} { other.state_.reset(); }
 
-    // Creates a promise by taking the continuation from another promise,
-    // leaving the other promise empty.
-    promise_impl(promise_impl&& other) = default;
-
-    // Destroys the promise, releasing its continuation.
-    ~promise_impl() = default;
-
-    // Returns true if the promise is non-empty (has a valid continuation).
-    explicit operator bool() const { return state_.has_value(); }
-
-    // Invokes the promise's continuation.
-    //
-    // This method should be called by an executor to evaluate the promise.
-    // If the result's state is |result_state::pending| then the executor
-    // is responsible for arranging to invoke the promise's continuation
-    // again once it determines that it is possible to make progress
-    // towards completion of the promise encapsulated within the promise.
-    //
-    // Once the continuation returns a result with status |result_state::ok|
-    // or |result_state::error|, the promise is assigned an empty continuation.
-    //
-    // Asserts that the promise is non-empty.
-    result_type operator()(context& context) {
-        assert(state_.has_value());
-        result_type result = (*state_)(context);
-        if (!result.is_pending())
-            state_.reset();
-        return result;
+  // Assigns the promise by taking the continuation from another promise,
+  // leaving the other promise empty.
+  promise_impl& operator=(promise_impl&& other) {
+    if (this != &other) {
+      state_ = std::move(other.state_);
+      other.state_.reset();
     }
+    return *this;
+  }
 
-    // Takes the promise's continuation, leaving it in an empty state.
-    // Asserts that the promise is non-empty.
-    continuation_type take_continuation() {
-        assert(state_.has_value());
-        auto continuation = std::move(state_.value());
-        state_.reset();
-        return continuation;
-    }
+  // Creates a promise with a continuation.
+  // If |continuation| equals nullptr then the promise is empty.
+  explicit promise_impl(continuation_type continuation) : state_(std::move(continuation)) {}
 
-    // Assigns the promise by taking the continuation from another promise,
-    // leaving the other promise empty.
-    promise_impl& operator=(promise_impl&& other) = default;
+  // Converts from a promise holding a continuation that is assignable to
+  // to this promise's continuation type.
+  //
+  // This is typically used to create a promise with a boxed continuation
+  // type (such as |fit::function|) from an unboxed promise produced by
+  // |fit::make_promise| or by combinators.
+  //
+  // EXAMPLE
+  //
+  //     // f is a promise_impl with a complicated unboxed type
+  //     auto f = fit::make_promise([] { ... });
+  //
+  //     // g wraps f's continuation
+  //     fit::promise<> g = std::move(f);
+  //
+  template <
+      typename OtherContinuation,
+      std::enable_if_t<!std::is_same<continuation_type, OtherContinuation>::value &&
+                           std::is_constructible<continuation_type, OtherContinuation&&>::value,
+                       bool> = true>
+  promise_impl(promise_impl<OtherContinuation> other)
+      : state_(other.state_.has_value() ? state_type(continuation_type(std::move(*other.state_)))
+                                        : state_type()) {}
 
-    // Discards the promise's continuation, leaving it empty.
-    promise_impl& operator=(decltype(nullptr)) {
-        state_.reset();
-        return *this;
-    }
+  // Destroys the promise, releasing its continuation.
+  ~promise_impl() = default;
 
-    // Assigns the promise's continuation.
-    promise_impl& operator=(continuation_type continuation) {
-        state_ = std::move(continuation);
-        return *this;
-    }
+  // Returns true if the promise is non-empty (has a valid continuation).
+  explicit operator bool() const { return state_.has_value(); }
 
-    // Swaps the promises' continuations.
-    void swap(promise_impl& other) {
-        using std::swap;
-        swap(state_, other.state_);
-    }
+  // Invokes the promise's continuation.
+  //
+  // This method should be called by an executor to evaluate the promise.
+  // If the result's state is |result_state::pending| then the executor
+  // is responsible for arranging to invoke the promise's continuation
+  // again once it determines that it is possible to make progress
+  // towards completion of the promise encapsulated within the promise.
+  //
+  // Once the continuation returns a result with status |result_state::ok|
+  // or |result_state::error|, the promise is assigned an empty continuation.
+  //
+  // Asserts that the promise is non-empty.
+  result_type operator()(context& context) {
+    result_type result = (state_.value())(context);
+    if (!result.is_pending())
+      state_.reset();
+    return result;
+  }
 
-    // Returns an unboxed promise which invokes the specified handler
-    // function after this promise completes (successfully or unsuccessfully),
-    // passing its result.
-    //
-    // The received result's state is guaranteed to be either
-    // |fit::result_state::ok| or |fit::result_state::error|, never
-    // |fit::result_state::pending|.
-    //
-    // |handler| is a callable object (such as a lambda) which consumes the
-    // result of this promise and returns a new result with any value type
-    // and error type.  Must not be null.
-    //
-    // The handler must return one of the following types:
-    // - void
-    // - fit::result<new_value_type, new_error_type>
-    // - fit::ok<new_value_type>
-    // - fit::error<new_error_type>
-    // - fit::pending
-    // - fit::promise<new_value_type, new_error_type>
-    // - any callable or unboxed promise with the following signature:
-    //   fit::result<new_value_type, new_error_type>(fit::context&)
-    //
-    // The handler must accept one of the following argument lists:
-    // - (result_type)
-    // - (result_type&)
-    // - (const result_type&)
-    // - (fit::context&, result_type)
-    // - (fit::context&, result_type&)
-    // - (fit::context&, const result_type&)
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     auto f = fit::make_promise(...)
-    //         .then([] (fit::result<int, std::string> result)
-    //                   -> fit::result<std::string, void> {
-    //             if (result.is_ok()) {
-    //                 printf("received value: %d\n", result.value());
-    //                 if (result.value() % 15 == 0)
-    //                     return ::fit::ok("fizzbuzz");
-    //                 if (result.value() % 3 == 0)
-    //                     return ::fit::ok("fizz");
-    //                 if (result.value() % 5 == 0)
-    //                     return ::fit::ok("buzz");
-    //                 return ::fit::ok(std::to_string(result.value()));
-    //             } else {
-    //                 printf("received error: %s\n", result.error().c_str());
-    //                 return ::fit::error();
-    //             }
-    //         })
-    //         .then(...);
-    //
-    template <typename ResultHandler>
-    promise_impl<::fit::internal::then_continuation<promise_impl, ResultHandler>>
-    then(ResultHandler handler) {
-        static_assert(is_callable<ResultHandler>::value,
-                      "ResultHandler must be a callable object.");
+  // Takes the promise's continuation, leaving it in an empty state.
+  // Asserts that the promise is non-empty.
+  continuation_type take_continuation() {
+    auto continuation = std::move(state_.value());
+    state_.reset();
+    return continuation;
+  }
 
-        assert(!is_null(handler));
-        assert(state_.has_value());
-        return make_promise_with_continuation(
-            ::fit::internal::then_continuation<promise_impl, ResultHandler>(
-                std::move(*this), std::move(handler)));
-    }
+  // Discards the promise's continuation, leaving it empty.
+  promise_impl& operator=(decltype(nullptr)) {
+    state_.reset();
+    return *this;
+  }
 
-    // Returns an unboxed promise which invokes the specified handler
-    // function after this promise completes successfully, passing its
-    // resulting value.
-    //
-    // |handler| is a callable object (such as a lambda) which consumes the
-    // result of this promise and returns a new result with any value type
-    // but the same error type.  Must not be null.
-    //
-    // The handler must return one of the following types:
-    // - void
-    // - fit::result<new_value_type, error_type>
-    // - fit::ok<new_value_type>
-    // - fit::error<error_type>
-    // - fit::pending
-    // - fit::promise<new_value_type, error_type>
-    // - any callable or unboxed promise with the following signature:
-    //   fit::result<new_value_type, error_type>(fit::context&)
-    //
-    // The handler must accept one of the following argument lists:
-    // - (value_type)
-    // - (value_type&)
-    // - (const value_type&)
-    // - (fit::context&, value_type)
-    // - (fit::context&, value_type&)
-    // - (fit::context&, const value_type&)
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     auto f = fit::make_promise(...)
-    //         .and_then([] (int value) {
-    //             printf("received value: %d\n", value);
-    //             if (value % 15 == 0)
-    //                 return ::fit::ok("fizzbuzz");
-    //             if (value % 3 == 0)
-    //                 return ::fit::ok("fizz");
-    //             if (value % 5 == 0)
-    //                 return ::fit::ok("buzz");
-    //             return ::fit::ok(std::to_string(value));
-    //         })
-    //         .then(...);
-    //
-    template <typename ValueHandler>
-    promise_impl<::fit::internal::and_then_continuation<promise_impl, ValueHandler>>
-    and_then(ValueHandler handler) {
-        static_assert(is_callable<ValueHandler>::value,
-                      "ValueHandler must be a callable object.");
+  // Assigns the promise's continuation.
+  promise_impl& operator=(continuation_type continuation) {
+    state_ = std::move(continuation);
+    return *this;
+  }
 
-        assert(!is_null(handler));
-        assert(state_.has_value());
-        return make_promise_with_continuation(
-            ::fit::internal::and_then_continuation<promise_impl, ValueHandler>(
-                std::move(*this), std::move(handler)));
-    }
+  // Swaps the promises' continuations.
+  void swap(promise_impl& other) {
+    using std::swap;
+    swap(state_, other.state_);
+  }
 
-    // Returns an unboxed promise which invokes the specified handler
-    // function after this promise completes with an error, passing its
-    // resulting error.
-    //
-    // |handler| is a callable object (such as a lambda) which consumes the
-    // result of this promise and returns a new result with any error type
-    // but the same value type.  Must not be null.
-    //
-    // The handler must return one of the following types:
-    // - void
-    // - fit::result<value_type, new_error_type>
-    // - fit::ok<value_type>
-    // - fit::error<new_error_type>
-    // - fit::pending
-    // - fit::promise<value_type, new_error_type>
-    // - any callable or unboxed promise with the following signature:
-    //   fit::result<value_type, new_error_type>(fit::context&)
-    //
-    // The handler must accept one of the following argument lists:
-    // - (error_type)
-    // - (error_type&)
-    // - (const error_type&)
-    // - (fit::context&, error_type)
-    // - (fit::context&, error_type&)
-    // - (fit::context&, const error_type&)
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     auto f = fit::make_promise(...)
-    //         .or_else([] (std::string error) {
-    //             printf("received error: %s\n", error.c_str());
-    //             return ::fit::error();
-    //         })
-    //         .then(...);
-    //
-    template <typename ErrorHandler>
-    promise_impl<::fit::internal::or_else_continuation<promise_impl, ErrorHandler>>
-    or_else(ErrorHandler handler) {
-        static_assert(is_callable<ErrorHandler>::value,
-                      "ErrorHandler must be a callable object.");
+  // Returns an unboxed promise which invokes the specified handler
+  // function after this promise completes (successfully or unsuccessfully),
+  // passing its result.
+  //
+  // The received result's state is guaranteed to be either
+  // |fit::result_state::ok| or |fit::result_state::error|, never
+  // |fit::result_state::pending|.
+  //
+  // |handler| is a callable object (such as a lambda) which consumes the
+  // result of this promise and returns a new result with any value type
+  // and error type.  Must not be null.
+  //
+  // The handler must return one of the following types:
+  // - void
+  // - fit::result<new_value_type, new_error_type>
+  // - fit::ok<new_value_type>
+  // - fit::error<new_error_type>
+  // - fit::pending
+  // - fit::promise<new_value_type, new_error_type>
+  // - any callable or unboxed promise with the following signature:
+  //   fit::result<new_value_type, new_error_type>(fit::context&)
+  //
+  // The handler must accept one of the following argument lists:
+  // - (result_type&)
+  // - (const result_type&)
+  // - (fit::context&, result_type&)
+  // - (fit::context&, const result_type&)
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     auto f = fit::make_promise(...)
+  //         .then([] (fit::result<int, std::string>& result)
+  //                   -> fit::result<std::string, void> {
+  //             if (result.is_ok()) {
+  //                 printf("received value: %d\n", result.value());
+  //                 if (result.value() % 15 == 0)
+  //                     return ::fit::ok("fizzbuzz");
+  //                 if (result.value() % 3 == 0)
+  //                     return ::fit::ok("fizz");
+  //                 if (result.value() % 5 == 0)
+  //                     return ::fit::ok("buzz");
+  //                 return ::fit::ok(std::to_string(result.value()));
+  //             } else {
+  //                 printf("received error: %s\n", result.error().c_str());
+  //                 return ::fit::error();
+  //             }
+  //         })
+  //         .then(...);
+  //
+  template <typename ResultHandler>
+  promise_impl<::fit::internal::then_continuation<promise_impl, ResultHandler>> then(
+      ResultHandler handler) {
+    static_assert(is_callable<ResultHandler>::value, "ResultHandler must be a callable object.");
 
-        assert(!is_null(handler));
-        assert(state_.has_value());
-        return make_promise_with_continuation(
-            ::fit::internal::or_else_continuation<promise_impl, ErrorHandler>(
-                std::move(*this), std::move(handler)));
-    }
+    assert(!is_null(handler));
+    assert(state_.has_value());
+    return make_promise_with_continuation(
+        ::fit::internal::then_continuation<promise_impl, ResultHandler>(std::move(*this),
+                                                                        std::move(handler)));
+  }
 
-    // Returns an unboxed promise which invokes the specified handler
-    // function after this promise completes (successfully or unsuccessfully),
-    // passing it the promise's result then delivering the result onwards
-    // to the next promise once the handler returns.
-    //
-    // The handler receive a copy, const reference, or non-const reference
-    // depending on the signature of the handler's last argument.
-    //
-    // - Copies and const references are especially useful for inspecting a
-    //   result mid-stream without modification, such as printing it for
-    //   debugging.
-    // - Non-const references are especially useful for synchronously
-    //   modifying a result mid-stream, such as clamping its bounds or
-    //   injecting a default value.
-    //
-    // |handler| is a callable object (such as a lambda) which can examine
-    // or modify the incoming result.  Unlike |then()|, the handler does
-    // not need to propagate the result onwards.  Must not be null.
-    //
-    // The handler must return one of the following types:
-    // - void
-    //
-    // The handler must accept one of the following argument lists:
-    // - (result_type)
-    // - (result_type&)
-    // - (const result_type&)
-    // - (fit::context&, result_type)
-    // - (fit::context&, result_type&)
-    // - (fit::context&, const result_type&)
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     auto f = fit::make_promise(...)
-    //         .inspect([] (const fit::result<int, std::string>& result) {
-    //             if (result.is_ok())
-    //                 printf("received value: %d\n", result.value());
-    //             else
-    //                 printf("received error: %s\n", result.error().c_str());
-    //         })
-    //         .then(...);
-    //
-    template <typename InspectHandler>
-    promise_impl<::fit::internal::inspect_continuation<promise_impl, InspectHandler>>
-    inspect(InspectHandler handler) {
-        static_assert(is_callable<InspectHandler>::value,
-                      "InspectHandler must be a callable object.");
-        static_assert(std::is_void<typename callable_traits<
-                          InspectHandler>::return_type>::value,
-                      "InspectHandler must return void.");
+  // Returns an unboxed promise which invokes the specified handler
+  // function after this promise completes successfully, passing its
+  // resulting value.
+  //
+  // |handler| is a callable object (such as a lambda) which consumes the
+  // result of this promise and returns a new result with any value type
+  // but the same error type.  Must not be null.
+  //
+  // The handler must return one of the following types:
+  // - void
+  // - fit::result<new_value_type, error_type>
+  // - fit::ok<new_value_type>
+  // - fit::error<error_type>
+  // - fit::pending
+  // - fit::promise<new_value_type, error_type>
+  // - any callable or unboxed promise with the following signature:
+  //   fit::result<new_value_type, error_type>(fit::context&)
+  //
+  // The handler must accept one of the following argument lists:
+  // - (value_type&)
+  // - (const value_type&)
+  // - (fit::context&, value_type&)
+  // - (fit::context&, const value_type&)
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     auto f = fit::make_promise(...)
+  //         .and_then([] (const int& value) {
+  //             printf("received value: %d\n", value);
+  //             if (value % 15 == 0)
+  //                 return ::fit::ok("fizzbuzz");
+  //             if (value % 3 == 0)
+  //                 return ::fit::ok("fizz");
+  //             if (value % 5 == 0)
+  //                 return ::fit::ok("buzz");
+  //             return ::fit::ok(std::to_string(value));
+  //         })
+  //         .then(...);
+  //
+  template <typename ValueHandler>
+  promise_impl<::fit::internal::and_then_continuation<promise_impl, ValueHandler>> and_then(
+      ValueHandler handler) {
+    static_assert(is_callable<ValueHandler>::value, "ValueHandler must be a callable object.");
 
-        assert(!is_null(handler));
-        assert(state_.has_value());
-        return make_promise_with_continuation(
-            ::fit::internal::inspect_continuation<promise_impl, InspectHandler>(
-                std::move(*this), std::move(handler)));
-    }
+    assert(!is_null(handler));
+    assert(state_.has_value());
+    return make_promise_with_continuation(
+        ::fit::internal::and_then_continuation<promise_impl, ValueHandler>(std::move(*this),
+                                                                           std::move(handler)));
+  }
 
-    // Returns an unboxed promise which discards the result of this promise
-    // once it completes, thereby always producing a successful result of
-    // type fit::result<void, void> regardless of whether this promise
-    // succeeded or failed.
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     auto f = fit::make_promise(...)
-    //         .discard_result()
-    //         .then(...);
-    //
-    promise_impl<::fit::internal::discard_result_continuation<promise_impl>>
-    discard_result() {
-        assert(state_.has_value());
-        return make_promise_with_continuation(
-            ::fit::internal::discard_result_continuation<promise_impl>(
-                std::move(*this)));
-    }
+  // Returns an unboxed promise which invokes the specified handler
+  // function after this promise completes with an error, passing its
+  // resulting error.
+  //
+  // |handler| is a callable object (such as a lambda) which consumes the
+  // result of this promise and returns a new result with any error type
+  // but the same value type.  Must not be null.
+  //
+  // The handler must return one of the following types:
+  // - void
+  // - fit::result<value_type, new_error_type>
+  // - fit::ok<value_type>
+  // - fit::error<new_error_type>
+  // - fit::pending
+  // - fit::promise<value_type, new_error_type>
+  // - any callable or unboxed promise with the following signature:
+  //   fit::result<value_type, new_error_type>(fit::context&)
+  //
+  // The handler must accept one of the following argument lists:
+  // - (error_type&)
+  // - (const error_type&)
+  // - (fit::context&, error_type&)
+  // - (fit::context&, const error_type&)
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     auto f = fit::make_promise(...)
+  //         .or_else([] (const std::string& error) {
+  //             printf("received error: %s\n", error.c_str());
+  //             return ::fit::error();
+  //         })
+  //         .then(...);
+  //
+  template <typename ErrorHandler>
+  promise_impl<::fit::internal::or_else_continuation<promise_impl, ErrorHandler>> or_else(
+      ErrorHandler handler) {
+    static_assert(is_callable<ErrorHandler>::value, "ErrorHandler must be a callable object.");
 
-    // Applies a |wrapper| to the promise.  Invokes the wrapper's |wrap()|
-    // method, passes the promise to the wrapper by value followed by any
-    // additional |args| passed to |wrap_with()|, then returns the wrapper's
-    // result.
-    //
-    // |Wrapper| is a type that implements a method called |wrap()| which
-    // accepts a promise as its argument and produces a wrapped result of
-    // any type, such as another promise.
-    //
-    // Asserts that the promise is non-empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    // In this example, |fit::sequencer| is a wrapper type that imposes
-    // FIFO execution order onto a sequence of wrapped promises.
-    //
-    //     // This wrapper type is intended to be applied to
-    //     // a sequence of promises so we store it in a variable.
-    //     fit::sequencer seq;
-    //
-    //     // This task consists of some amount of work that must be
-    //     // completed sequentially followed by other work that can
-    //     // happen in any order.  We use |wrap_with()| to wrap the
-    //     // sequential work with the sequencer.
-    //     fit::promise<> perform_complex_task() {
-    //         return fit::make_promise([] { /* do sequential work */ })
-    //             .then([] (fit::result<> result) { /* this will also be wrapped */ })
-    //             .wrap_with(seq)
-    //             .then([] (fit::result<> result) { /* do more work */ });
-    //     }
-    //
-    // This example can also be written without using |wrap_with()|.
-    // The behavior is equivalent but the syntax may seem more awkward.
-    //
-    //     fit::sequencer seq;
-    //
-    //     promise<> perform_complex_task() {
-    //         return seq.wrap(
-    //                 fit::make_promise([] { /* sequential work */ })
-    //             ).then([] (fit::result<> result) { /* more work */ });
-    //     }
-    //
-    template <typename Wrapper, typename... Args>
-    decltype(auto) wrap_with(Wrapper& wrapper, Args... args) {
-        assert(state_.has_value());
-        return wrapper.wrap(std::move(*this),
-                            std::forward<Args>(args)...);
-    }
+    assert(!is_null(handler));
+    assert(state_.has_value());
+    return make_promise_with_continuation(
+        ::fit::internal::or_else_continuation<promise_impl, ErrorHandler>(std::move(*this),
+                                                                          std::move(handler)));
+  }
 
-    // Wraps the promise's continuation into a |fit::function|.
-    //
-    // A boxed promise is easier to store and pass around than the unboxed
-    // promises produced by |fit::make_promise()| and combinators, though boxing
-    // may incur a heap allocation.
-    //
-    // It is a good idea to defer boxing the promise until after all
-    // desired combinators have been applied to prevent unnecessary heap
-    // allocation during intermediate states of the promise's construction.
-    //
-    // Returns an empty promise if this promise is empty.
-    // This method consumes the promise's continuation, leaving it empty.
-    //
-    // EXAMPLE
-    //
-    //     // f's is a fit::promise_impl<> whose continuation contains an
-    //     // anonymous type (the lambda)
-    //     auto f = fit::make_promise([] {});
-    //
-    //     // g's type will be fit::promise<> due to boxing
-    //     auto boxed_f = f.box();
-    //
-    //     // alternately, we can get exactly the same effect by assigning
-    //     // the unboxed promise to a variable of a named type instead of
-    //     // calling box()
-    //     fit::promise<> boxed_f = std::move(f);
-    //
-    promise_impl<function<result_type(context&)>> box() {
-        return std::move(*this);
-    }
+  // Returns an unboxed promise which invokes the specified handler
+  // function after this promise completes (successfully or unsuccessfully),
+  // passing it the promise's result then delivering the result onwards
+  // to the next promise once the handler returns.
+  //
+  // The handler receives a const reference, or non-const reference
+  // depending on the signature of the handler's last argument.
+  //
+  // - Const references are especially useful for inspecting a
+  //   result mid-stream without modification, such as printing it for
+  //   debugging.
+  // - Non-const references are especially useful for synchronously
+  //   modifying a result mid-stream, such as clamping its bounds or
+  //   injecting a default value.
+  //
+  // |handler| is a callable object (such as a lambda) which can examine
+  // or modify the incoming result.  Unlike |then()|, the handler does
+  // not need to propagate the result onwards.  Must not be null.
+  //
+  // The handler must return one of the following types:
+  // - void
+  //
+  // The handler must accept one of the following argument lists:
+  // - (result_type&)
+  // - (const result_type&)
+  // - (fit::context&, result_type&)
+  // - (fit::context&, const result_type&)
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     auto f = fit::make_promise(...)
+  //         .inspect([] (const fit::result<int, std::string>& result) {
+  //             if (result.is_ok())
+  //                 printf("received value: %d\n", result.value());
+  //             else
+  //                 printf("received error: %s\n", result.error().c_str());
+  //         })
+  //         .then(...);
+  //
+  template <typename InspectHandler>
+  promise_impl<::fit::internal::inspect_continuation<promise_impl, InspectHandler>> inspect(
+      InspectHandler handler) {
+    static_assert(is_callable<InspectHandler>::value, "InspectHandler must be a callable object.");
+    static_assert(std::is_void<typename callable_traits<InspectHandler>::return_type>::value,
+                  "InspectHandler must return void.");
 
-    promise_impl(const promise_impl&) = delete;
-    promise_impl& operator=(const promise_impl&) = delete;
+    assert(!is_null(handler));
+    assert(state_.has_value());
+    return make_promise_with_continuation(
+        ::fit::internal::inspect_continuation<promise_impl, InspectHandler>(std::move(*this),
+                                                                            std::move(handler)));
+  }
 
-private:
-    template <typename>
-    friend class promise_impl;
+  // Returns an unboxed promise which discards the result of this promise
+  // once it completes, thereby always producing a successful result of
+  // type fit::result<void, void> regardless of whether this promise
+  // succeeded or failed.
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     auto f = fit::make_promise(...)
+  //         .discard_result()
+  //         .then(...);
+  //
+  promise_impl<::fit::internal::discard_result_continuation<promise_impl>> discard_result() {
+    assert(state_.has_value());
+    return make_promise_with_continuation(
+        ::fit::internal::discard_result_continuation<promise_impl>(std::move(*this)));
+  }
 
-    state_type state_;
+  // Applies a |wrapper| to the promise.  Invokes the wrapper's |wrap()|
+  // method, passes the promise to the wrapper by value followed by any
+  // additional |args| passed to |wrap_with()|, then returns the wrapper's
+  // result.
+  //
+  // |Wrapper| is a type that implements a method called |wrap()| which
+  // accepts a promise as its argument and produces a wrapped result of
+  // any type, such as another promise.
+  //
+  // Asserts that the promise is non-empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  // In this example, |fit::sequencer| is a wrapper type that imposes
+  // FIFO execution order onto a sequence of wrapped promises.
+  //
+  //     // This wrapper type is intended to be applied to
+  //     // a sequence of promises so we store it in a variable.
+  //     fit::sequencer seq;
+  //
+  //     // This task consists of some amount of work that must be
+  //     // completed sequentially followed by other work that can
+  //     // happen in any order.  We use |wrap_with()| to wrap the
+  //     // sequential work with the sequencer.
+  //     fit::promise<> perform_complex_task() {
+  //         return fit::make_promise([] { /* do sequential work */ })
+  //             .then([] (fit::result<> result) { /* this will also be wrapped */ })
+  //             .wrap_with(seq)
+  //             .then([] (fit::result<> result) { /* do more work */ });
+  //     }
+  //
+  // This example can also be written without using |wrap_with()|.
+  // The behavior is equivalent but the syntax may seem more awkward.
+  //
+  //     fit::sequencer seq;
+  //
+  //     promise<> perform_complex_task() {
+  //         return seq.wrap(
+  //                 fit::make_promise([] { /* sequential work */ })
+  //             ).then([] (fit::result<> result) { /* more work */ });
+  //     }
+  //
+  template <typename Wrapper, typename... Args>
+  decltype(auto) wrap_with(Wrapper& wrapper, Args... args) {
+    assert(state_.has_value());
+    return wrapper.wrap(std::move(*this), std::forward<Args>(args)...);
+  }
+
+  // Wraps the promise's continuation into a |fit::function|.
+  //
+  // A boxed promise is easier to store and pass around than the unboxed
+  // promises produced by |fit::make_promise()| and combinators, though boxing
+  // may incur a heap allocation.
+  //
+  // It is a good idea to defer boxing the promise until after all
+  // desired combinators have been applied to prevent unnecessary heap
+  // allocation during intermediate states of the promise's construction.
+  //
+  // Returns an empty promise if this promise is empty.
+  // This method consumes the promise's continuation, leaving it empty.
+  //
+  // EXAMPLE
+  //
+  //     // f's is a fit::promise_impl<> whose continuation contains an
+  //     // anonymous type (the lambda)
+  //     auto f = fit::make_promise([] {});
+  //
+  //     // g's type will be fit::promise<> due to boxing
+  //     auto boxed_f = f.box();
+  //
+  //     // alternately, we can get exactly the same effect by assigning
+  //     // the unboxed promise to a variable of a named type instead of
+  //     // calling box()
+  //     fit::promise<> boxed_f = std::move(f);
+  //
+  promise_impl<function<result_type(context&)>> box() { return std::move(*this); }
+
+ private:
+  template <typename>
+  friend class promise_impl;
+
+  state_type state_;
 };
 
 template <typename Continuation>
-void swap(promise_impl<Continuation>& a,
-          promise_impl<Continuation>& b) {
-    a.swap(b);
+void swap(promise_impl<Continuation>& a, promise_impl<Continuation>& b) {
+  a.swap(b);
 }
 
 template <typename Continuation>
-bool operator==(const promise_impl<Continuation>& f,
-                decltype(nullptr)) {
-    return !f;
+bool operator==(const promise_impl<Continuation>& f, decltype(nullptr)) {
+  return !f;
 }
 template <typename Continuation>
-bool operator==(decltype(nullptr),
-                const promise_impl<Continuation>& f) {
-    return !f;
+bool operator==(decltype(nullptr), const promise_impl<Continuation>& f) {
+  return !f;
 }
 template <typename Continuation>
-bool operator!=(const promise_impl<Continuation>& f,
-                decltype(nullptr)) {
-    return !!f;
+bool operator!=(const promise_impl<Continuation>& f, decltype(nullptr)) {
+  return !!f;
 }
 template <typename Continuation>
-bool operator!=(decltype(nullptr),
-                const promise_impl<Continuation>& f) {
-    return !!f;
+bool operator!=(decltype(nullptr), const promise_impl<Continuation>& f) {
+  return !!f;
 }
 
 // Makes a promise containing the specified continuation.
@@ -790,9 +777,8 @@
 // |Continuation| is a callable object with the signature
 // fit::result<V, E>(fit::context&).
 template <typename Continuation>
-inline promise_impl<Continuation> make_promise_with_continuation(
-    Continuation continuation) {
-    return promise_impl<Continuation>(std::move(continuation));
+inline promise_impl<Continuation> make_promise_with_continuation(Continuation continuation) {
+  return promise_impl<Continuation>(std::move(continuation));
 }
 
 // Returns an unboxed promise that wraps the specified handler.
@@ -831,7 +817,7 @@
 //     }
 //
 //     fit::promise<weather_type, std::string> wait_for_good_weather(int max_days) {
-//         return fit::make_promise([days_left = max_days] (fit::context context&) mutable
+//         return fit::make_promise([days_left = max_days] (fit::context& context) mutable
 //                             -> fit::result<int, std::string> {
 //             weather_type weather = look_outside();
 //             if (weather == weather_type::sunny || weather == weather_type::glorious)
@@ -846,19 +832,86 @@
 //     }
 //
 //     auto f = wait_for_good_weather(7)
-//         .and_then([] (weather_type weather) { ... })
-//         .or_else([] (std::string error) { ... });
+//         .and_then([] (const weather_type& weather) { ... })
+//         .or_else([] (const std::string& error) { ... });
 //
 template <typename PromiseHandler>
-inline promise_impl<::fit::internal::context_handler_invoker<PromiseHandler>>
-make_promise(PromiseHandler handler) {
-    static_assert(is_callable<PromiseHandler>::value,
-                  "PromiseHandler must be a callable object.");
+inline promise_impl<::fit::internal::context_handler_invoker<PromiseHandler>> make_promise(
+    PromiseHandler handler) {
+  static_assert(is_callable<PromiseHandler>::value, "PromiseHandler must be a callable object.");
 
-    assert(!is_null(handler));
-    return make_promise_with_continuation(
-        ::fit::internal::promise_continuation<PromiseHandler>(
-            std::move(handler)));
+  assert(!is_null(handler));
+  return make_promise_with_continuation(
+      ::fit::internal::promise_continuation<PromiseHandler>(std::move(handler)));
+}
+
+// Returns an unboxed promise that immediately returns the specified result when invoked.
+//
+// This function is especially useful for returning promises from functions
+// that have multiple branches some of which complete synchronously.
+//
+// |result| is the result for the promise to return.
+//
+// See documentation of |fit::promise| for more information.
+template <typename V = void, typename E = void>
+inline promise_impl<::fit::internal::result_continuation<V, E>> make_result_promise(
+    fit::result<V, E> result) {
+  return make_promise_with_continuation(
+      ::fit::internal::result_continuation<V, E>(std::move(result)));
+}
+template <typename V = void, typename E = void>
+inline promise_impl<::fit::internal::result_continuation<V, E>> make_result_promise(
+    fit::ok_result<V> result) {
+  return make_promise_with_continuation(
+      ::fit::internal::result_continuation<V, E>(std::move(result)));
+}
+template <typename V = void, typename E = void>
+inline promise_impl<::fit::internal::result_continuation<V, E>> make_result_promise(
+    fit::error_result<E> result) {
+  return make_promise_with_continuation(
+      ::fit::internal::result_continuation<V, E>(std::move(result)));
+}
+template <typename V = void, typename E = void>
+inline promise_impl<::fit::internal::result_continuation<V, E>> make_result_promise(
+    fit::pending_result result) {
+  return make_promise_with_continuation(
+      ::fit::internal::result_continuation<V, E>(std::move(result)));
+}
+
+// Returns an unboxed promise that immediately returns the specified value when invoked.
+//
+// This function is especially useful for returning promises from functions
+// that have multiple branches some of which complete synchronously.
+//
+// |value| is the value for the promise to return.
+//
+// See documentation of |fit::promise| for more information.
+template <typename V>
+inline promise_impl<::fit::internal::result_continuation<V, void>> make_ok_promise(V value) {
+  return make_result_promise(fit::ok(std::move(value)));
+}
+
+// Overload of |make_ok_promise()| used when the value type is void.
+inline promise_impl<::fit::internal::result_continuation<void, void>> make_ok_promise() {
+  return make_result_promise(fit::ok());
+}
+
+// Returns an unboxed promise that immediately returns the specified error when invoked.
+//
+// This function is especially useful for returning promises from functions
+// that have multiple branches some of which complete synchronously.
+//
+// |error| is the error for the promise to return.
+//
+// See documentation of |fit::promise| for more information.
+template <typename E>
+inline promise_impl<::fit::internal::result_continuation<void, E>> make_error_promise(E error) {
+  return make_result_promise(fit::error(std::move(error)));
+}
+
+// Overload of |make_error_promise()| used when the error type is void.
+inline promise_impl<::fit::internal::result_continuation<void, void>> make_error_promise() {
+  return make_result_promise(fit::error());
 }
 
 // Jointly evaluates zero or more promises.
@@ -875,31 +928,58 @@
 //         auto f = get_random_number();
 //         auto g = get_random_number();
 //         return fit::join_promises(std::move(f), std::move(g))
-//             .and_then([] (std::tuple<fit::result<int>, fit::result<int>> results) {
+//             .and_then([] (std::tuple<fit::result<int>, fit::result<int>>& results) {
 //                 return fit::ok(results.get<0>.value() + results.get<1>.value());
 //             });
 //     }
 //
 template <typename... Promises>
-inline promise_impl<::fit::internal::join_continuation<Promises...>>
-join_promises(Promises... promises) {
-    return make_promise_with_continuation(
-        ::fit::internal::join_continuation<Promises...>(std::move(promises)...));
+inline promise_impl<::fit::internal::join_continuation<Promises...>> join_promises(
+    Promises... promises) {
+  return make_promise_with_continuation(
+      ::fit::internal::join_continuation<Promises...>(std::move(promises)...));
+}
+
+// Jointly evaluates zero or more homogenous promises (same result and error
+// type).  Returns a promise that produces a std::vector<> containing the
+// result of each promise once they all complete.
+//
+// EXAMPLE
+//
+//     auto get_random_number() {
+//         return fit::make_promise([] { return rand() % 10 });
+//     }
+//
+//     auto get_random_product() {
+//         std::vector<fit::promise<int>> promises;
+//         promises.push_back(get_random_number());
+//         promises.push_back(get_random_number());
+//         return fit::join_promise_vector(std::move(promises))
+//             .and_then([] (std::vector<fit::result<int>>& results) {
+//                 return fit::ok(results[0].value() + results[1].value());
+//             });
+//     }
+//
+template <typename V, typename E>
+inline promise_impl<::fit::internal::join_vector_continuation<fit::promise<V, E>>>
+join_promise_vector(std::vector<fit::promise<V, E>> promises) {
+  return make_promise_with_continuation(
+      ::fit::internal::join_vector_continuation<fit::promise<V, E>>(std::move(promises)));
 }
 
 // Describes the status of a future.
 enum class future_state {
-    // The future neither holds a result nor a promise that could produce a result.
-    // An empty future cannot make progress until a promise or result is assigned to it.
-    empty,
-    // The future holds a promise that may eventually produce a result but
-    // it currently doesn't have a result.  The future's promise must be
-    // invoked in order to make progress from this state.
-    pending,
-    // The future holds a successful result.
-    ok,
-    // The future holds an error result.
-    error
+  // The future neither holds a result nor a promise that could produce a result.
+  // An empty future cannot make progress until a promise or result is assigned to it.
+  empty,
+  // The future holds a promise that may eventually produce a result but
+  // it currently doesn't have a result.  The future's promise must be
+  // invoked in order to make progress from this state.
+  pending,
+  // The future holds a successful result.
+  ok,
+  // The future holds an error result.
+  error
 };
 
 // A |fit::future| holds onto a |fit::promise| until it has completed then
@@ -956,7 +1036,8 @@
 //
 // EXAMPLE
 //
-// - https://fuchsia.googlesource.com/zircon/+/master/system/utest/fit/examples/promise_example2.cpp
+// -
+// https://fuchsia.googlesource.com/fuchsia/+/HEAD/zircon/system/utest/fit/examples/promise_example2.cc
 template <typename V = void, typename E = void>
 using future = future_impl<promise<V, E>>;
 
@@ -964,295 +1045,284 @@
 // See |fit::future| documentation for more information.
 template <typename Promise>
 class future_impl final {
-public:
-    // The type of promise held by the future.
-    using promise_type = Promise;
+ public:
+  // The type of promise held by the future.
+  using promise_type = Promise;
 
-    // The promise's result type.
-    // Equivalent to fit::result<value_type, error_type>.
-    using result_type = typename Promise::result_type;
+  // The promise's result type.
+  // Equivalent to fit::result<value_type, error_type>.
+  using result_type = typename Promise::result_type;
 
-    // The type of value produced when the promise completes successfully.
-    // May be void.
-    using value_type = typename Promise::value_type;
+  // The type of value produced when the promise completes successfully.
+  // May be void.
+  using value_type = typename Promise::value_type;
 
-    // The type of value produced when the promise completes with an error.
-    // May be void.
-    using error_type = typename Promise::error_type;
+  // The type of value produced when the promise completes with an error.
+  // May be void.
+  using error_type = typename Promise::error_type;
 
-    // Creates a future in the empty state.
-    future_impl() = default;
-    future_impl(decltype(nullptr)) {}
+  // Creates a future in the empty state.
+  future_impl() = default;
+  future_impl(decltype(nullptr)) {}
 
-    // Creates a future and assigns a promise to compute its result.
-    // If the promise is empty, the future enters the empty state.
-    // Otherwise the future enters the pending state.
-    explicit future_impl(promise_type promise) {
-        if (promise) {
-            state_.template emplace<1>(std::move(promise));
-        }
+  // Creates a future and assigns a promise to compute its result.
+  // If the promise is empty, the future enters the empty state.
+  // Otherwise the future enters the pending state.
+  explicit future_impl(promise_type promise) {
+    if (promise) {
+      state_.template emplace<1>(std::move(promise));
     }
+  }
 
-    // Creates a future and assigns its result.
-    // If the result is pending, the future enters the empty state.
-    // Otherwise the future enters the ok or error state.
-    explicit future_impl(result_type result) {
-        if (result) {
-            state_.template emplace<2>(std::move(result));
-        }
+  // Creates a future and assigns its result.
+  // If the result is pending, the future enters the empty state.
+  // Otherwise the future enters the ok or error state.
+  explicit future_impl(result_type result) {
+    if (result) {
+      state_.template emplace<2>(std::move(result));
     }
+  }
 
-    // Moves from another future, leaving the other one in an empty state.
-    future_impl(future_impl&& other)
-        : state_(std::move(other.state_)) {
-        other.state_.template emplace<0>();
+  // Moves from another future, leaving the other one in an empty state.
+  future_impl(future_impl&& other) : state_(std::move(other.state_)) {
+    other.state_.template emplace<0>();
+  }
+
+  // Destroys the promise, releasing its promise and result (if any).
+  ~future_impl() = default;
+
+  // Returns the state of the future: empty, pending, ok, or error.
+  future_state state() const {
+    switch (state_.index()) {
+      case 0:
+        return future_state::empty;
+      case 1:
+        return future_state::pending;
+      case 2:
+        return state_.template get<2>().is_ok() ? future_state::ok : future_state::error;
     }
+    __builtin_unreachable();
+  }
 
-    // Destroys the promise, releasing its promise and result (if any).
-    ~future_impl() = default;
+  // Returns true if the future's state is not |fit::future_state::empty|:
+  // it either holds a result or holds a promise that can be invoked to make
+  // progress towards obtaining a result.
+  explicit operator bool() const { return !is_empty(); }
 
-    // Returns the state of the future: empty, pending, ok, or error.
-    future_state state() const {
-        switch (state_.index()) {
-        case 0:
-            return future_state::empty;
-        case 1:
-            return future_state::pending;
-        case 2:
-            return state_.template get<2>().is_ok()
-                       ? future_state::ok
-                       : future_state::error;
-        }
-        __builtin_unreachable();
+  // Returns true if the future's state is |fit::future_state::empty|:
+  // it does not hold a result or a promise so it cannot make progress.
+  bool is_empty() const { return state() == fit::future_state::empty; }
+
+  // Returns true if the future's state is |fit::future_state::pending|:
+  // it does not hold a result yet but it does hold a promise that can be invoked
+  // to make progress towards obtaining a result.
+  bool is_pending() const { return state() == fit::future_state::pending; }
+
+  // Returns true if the future's state is |fit::future_state::ok|:
+  // it holds a value that can be retrieved using |value()|, |take_value()|,
+  // |result()|, |take_result()|, or |take_ok_result()|.
+  bool is_ok() const { return state() == fit::future_state::ok; }
+
+  // Returns true if the future's state is |fit::future_state::error|:
+  // it holds an error that can be retrieved using |error()|, |take_error()|,
+  // |result()|, |take_result()|, or |take_error_result()|.
+  bool is_error() const { return state() == fit::future_state::error; }
+
+  // Returns true if the future's state is either |fit::future_state::ok| or
+  // |fit::future_state::error|.
+  bool is_ready() const { return state_.index() == 2; }
+
+  // Evaluates the future and returns true if its result is ready.
+  // Asserts that the future is not empty.
+  //
+  // If the promise completes and returns a result, the future will transition
+  // to the ok or error state according to the result.  The promise itself will
+  // then be destroyed since it has fulfilled its purpose.
+  bool operator()(fit::context& context) {
+    switch (state_.index()) {
+      case 0:
+        return false;
+      case 1: {
+        result_type result = state_.template get<1>()(context);
+        if (!result)
+          return false;
+        state_.template emplace<2>(std::move(result));
+        return true;
+      }
+      case 2:
+        return true;
     }
+    __builtin_unreachable();
+  }
 
-    // Returns true if the future's state is not |fit::future_state::empty|:
-    // it either holds a result or holds a promise that can be invoked to make
-    // progress towards obtaining a result.
-    explicit operator bool() const { return !is_empty(); }
+  // Gets a reference to the future's promise.
+  // Asserts that the future's state is |fit::future_state::pending|.
+  const promise_type& promise() const {
+    assert(is_pending());
+    return state_.template get<1>();
+  }
 
-    // Returns true if the future's state is |fit::future_state::empty|:
-    // it does not hold a result or a promise so it cannot make progress.
-    bool is_empty() const { return state() == fit::future_state::empty; }
+  // Takes the future's promise, leaving it in an empty state.
+  // Asserts that the future's state is |fit::future_state::pending|.
+  promise_type take_promise() {
+    assert(is_pending());
+    auto promise = std::move(state_.template get<1>());
+    state_.template emplace<0>();
+    return promise;
+  }
 
-    // Returns true if the future's state is |fit::future_state::pending|:
-    // it does not hold a result yet but it does hold a promise that can be invoked
-    // to make progress towards obtaining a result.
-    bool is_pending() const { return state() == fit::future_state::pending; }
+  // Gets a reference to the future's result.
+  // Asserts that the future's state is |fit::future_state::ok| or
+  // |fit::future_state::error|.
+  result_type& result() {
+    assert(is_ready());
+    return state_.template get<2>();
+  }
+  const result_type& result() const {
+    assert(is_ready());
+    return state_.template get<2>();
+  }
 
-    // Returns true if the future's state is |fit::future_state::ok|:
-    // it holds a value that can be retrieved using |value()|, |take_value()|,
-    // |result()|, |take_result()|, or |take_ok_result()|.
-    bool is_ok() const { return state() == fit::future_state::ok; }
+  // Takes the future's result, leaving it in an empty state.
+  // Asserts that the future's state is |fit::future_state::ok| or
+  // |fit::future_state::error|.
+  result_type take_result() {
+    assert(is_ready());
+    auto result = std::move(state_.template get<2>());
+    state_.template emplace<0>();
+    return result;
+  }
 
-    // Returns true if the future's state is |fit::future_state::error|:
-    // it holds an error that can be retrieved using |error()|, |take_error()|,
-    // |result()|, |take_result()|, or |take_error_result()|.
-    bool is_error() const { return state() == fit::future_state::error; }
+  // Gets a reference to the future's value.
+  // Asserts that the future's state is |fit::future_state::ok|.
+  template <typename R = value_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R& value() {
+    assert(is_ok());
+    return state_.template get<2>().value();
+  }
+  template <typename R = value_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  const R& value() const {
+    assert(is_ok());
+    return state_.template get<2>().value();
+  }
 
-    // Returns true if the future's state is either |fit::future_state::ok| or
-    // |fit::future_state::error|.
-    bool is_ready() const { return state_.index() == 2; }
+  // Takes the future's value, leaving it in an empty state.
+  // Asserts that the future's state is |fit::future_state::ok|.
+  template <typename R = value_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R take_value() {
+    assert(is_ok());
+    auto value = state_.template get<2>().take_value();
+    state_.template emplace<0>();
+    return value;
+  }
+  ok_result<value_type> take_ok_result() {
+    assert(is_ok());
+    auto result = state_.template get<2>().take_ok_result();
+    state_.template emplace<0>();
+    return result;
+  }
 
-    // Evaluates the future and returns true if its result is ready.
-    // Asserts that the future is not empty.
-    //
-    // If the promise completes and returns a result, the future will transition
-    // to the ok or error state according to the result.  The promise itself will
-    // then be destroyed since it has fulfilled its purpose.
-    bool operator()(fit::context& context) {
-        switch (state_.index()) {
-        case 0:
-            return false;
-        case 1: {
-            result_type result = state_.template get<1>()(context);
-            if (!result)
-                return false;
-            state_.template emplace<2>(std::move(result));
-            return true;
-        }
-        case 2:
-            return true;
-        }
-        __builtin_unreachable();
+  // Gets a reference to the future's error.
+  // Asserts that the future's state is |fit::future_state::error|.
+  template <typename R = error_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R& error() {
+    assert(is_error());
+    return state_.template get<2>().error();
+  }
+  template <typename R = error_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  const R& error() const {
+    assert(is_error());
+    return state_.template get<2>().error();
+  }
+
+  // Takes the future's error, leaving it in an empty state.
+  // Asserts that the future's state is |fit::future_state::error|.
+  template <typename R = error_type, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R take_error() {
+    assert(is_error());
+    auto error = state_.template get<2>().take_error();
+    state_.template emplace<0>();
+    return error;
+  }
+  error_result<error_type> take_error_result() {
+    assert(is_error());
+    auto result = state_.template get<2>().take_error_result();
+    state_.template emplace<0>();
+    return result;
+  }
+
+  // Move assigns from another future, leaving the other one in an empty state.
+  future_impl& operator=(future_impl&& other) = default;
+
+  // Discards the future's promise and result, leaving it empty.
+  future_impl& operator=(decltype(nullptr)) {
+    state_.template emplace<0>();
+    return *this;
+  }
+
+  // Assigns a promise to compute the future's result.
+  // If the promise is empty, the future enters the empty state.
+  // Otherwise the future enters the pending state.
+  future_impl& operator=(promise_type promise) {
+    if (promise) {
+      state_.template emplace<1>(std::move(promise));
+    } else {
+      state_.template emplace<0>();
     }
+    return *this;
+  }
 
-    // Gets a reference to the future's promise.
-    // Asserts that the future's state is |fit::future_state::pending|.
-    const promise_type& promise() const {
-        assert(is_pending());
-        return state_.template get<1>();
+  // Assigns the future's result.
+  // If the result is pending, the future enters the empty state.
+  // Otherwise the future enters the ok or error state.
+  future_impl& operator=(result_type result) {
+    if (result) {
+      state_.template emplace<2>(std::move(result));
+    } else {
+      state_.template emplace<0>();
     }
+    return *this;
+  }
 
-    // Takes the future's promise, leaving it in an empty state.
-    // Asserts that the future's state is |fit::future_state::pending|.
-    promise_type take_promise() {
-        assert(is_pending());
-        auto promise = std::move(state_.template get<1>());
-        state_.template emplace<0>();
-        return promise;
-    }
+  // Swaps the futures' contents.
+  void swap(future_impl& other) {
+    using std::swap;
+    swap(state_, other.state_);
+  }
 
-    // Gets a reference to the future's result.
-    // Asserts that the future's state is |fit::future_state::ok| or
-    // |fit::future_state::error|.
-    result_type& result() {
-        assert(is_ready());
-        return state_.template get<2>();
-    }
-    const result_type& result() const {
-        assert(is_ready());
-        return state_.template get<2>();
-    }
+  future_impl(const future_impl&) = delete;
+  future_impl& operator=(const future_impl&) = delete;
 
-    // Takes the future's result, leaving it in an empty state.
-    // Asserts that the future's state is |fit::future_state::ok| or
-    // |fit::future_state::error|.
-    result_type take_result() {
-        assert(is_ready());
-        auto result = std::move(state_.template get<2>());
-        state_.template emplace<0>();
-        return result;
-    }
-
-    // Gets a reference to the future's value.
-    // Asserts that the future's state is |fit::future_state::ok|.
-    template <typename R = value_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R& value() {
-        assert(is_ok());
-        return state_.template get<2>().value();
-    }
-    template <typename R = value_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    const R& value() const {
-        assert(is_ok());
-        return state_.template get<2>().value();
-    }
-
-    // Takes the future's value, leaving it in an empty state.
-    // Asserts that the future's state is |fit::future_state::ok|.
-    template <typename R = value_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R take_value() {
-        assert(is_ok());
-        auto value = state_.template get<2>().take_value();
-        state_.template emplace<0>();
-        return value;
-    }
-    ok_result<value_type> take_ok_result() {
-        assert(is_ok());
-        auto result = state_.template get<2>().take_ok_result();
-        state_.template emplace<0>();
-        return result;
-    }
-
-    // Gets a reference to the future's error.
-    // Asserts that the future's state is |fit::future_state::error|.
-    template <typename R = error_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R& error() {
-        assert(is_error());
-        return state_.template get<2>().error();
-    }
-    template <typename R = error_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    const R& error() const {
-        assert(is_error());
-        return state_.template get<2>().error();
-    }
-
-    // Takes the future's error, leaving it in an empty state.
-    // Asserts that the future's state is |fit::future_state::error|.
-    template <typename R = error_type,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R take_error() {
-        assert(is_error());
-        auto error = state_.template get<2>().take_error();
-        state_.template emplace<0>();
-        return error;
-    }
-    error_result<error_type> take_error_result() {
-        assert(is_error());
-        auto result = state_.template get<2>().take_error_result();
-        state_.template emplace<0>();
-        return result;
-    }
-
-    // Move assigns from another future, leaving the other one in an empty state.
-    future_impl& operator=(future_impl&& other) = default;
-
-    // Discards the future's promise and result, leaving it empty.
-    future_impl& operator=(decltype(nullptr)) {
-        state_.template emplace<0>();
-        return *this;
-    }
-
-    // Assigns a promise to compute the future's result.
-    // If the promise is empty, the future enters the empty state.
-    // Otherwise the future enters the pending state.
-    future_impl& operator=(promise_type promise) {
-        if (promise) {
-            state_.template emplace<1>(std::move(promise));
-        } else {
-            state_.template emplace<0>();
-        }
-        return *this;
-    }
-
-    // Assigns the future's result.
-    // If the result is pending, the future enters the empty state.
-    // Otherwise the future enters the ok or error state.
-    future_impl& operator=(result_type result) {
-        if (result) {
-            state_.template emplace<2>(std::move(result));
-        } else {
-            state_.template emplace<0>();
-        }
-        return *this;
-    }
-
-    // Swaps the futures' contents.
-    void swap(future_impl& other) {
-        using std::swap;
-        swap(state_, other.state_);
-    }
-
-    future_impl(const future_impl&) = delete;
-    future_impl& operator=(const future_impl&) = delete;
-
-private:
-    ::fit::internal::variant<::fit::internal::monostate,
-                             promise_type, result_type>
-        state_;
+ private:
+  variant<monostate, promise_type, result_type> state_;
 };
 
 template <typename Promise>
 void swap(future_impl<Promise>& a, future_impl<Promise>& b) {
-    a.swap(b);
+  a.swap(b);
 }
 
 template <typename Promise>
 bool operator==(const future_impl<Promise>& f, decltype(nullptr)) {
-    return !f;
+  return !f;
 }
 template <typename Promise>
 bool operator==(decltype(nullptr), const future_impl<Promise>& f) {
-    return !f;
+  return !f;
 }
 template <typename Promise>
 bool operator!=(const future_impl<Promise>& f, decltype(nullptr)) {
-    return !!f;
+  return !!f;
 }
 template <typename Promise>
 bool operator!=(decltype(nullptr), const future_impl<Promise>& f) {
-    return !!f;
+  return !!f;
 }
 
 // Makes a future containing the specified promise.
 template <typename Promise>
 future_impl<Promise> make_future(Promise promise) {
-    return future_impl<Promise>(std::move(promise));
+  return future_impl<Promise>(std::move(promise));
 }
 
 // A pending task holds a |fit::promise| that can be scheduled to run on
@@ -1266,53 +1336,48 @@
 //
 // See documentation of |fit::promise| for more information.
 class pending_task final {
-public:
-    // The type of promise held by this task.
-    using promise_type = promise<void, void>;
+ public:
+  // The type of promise held by this task.
+  using promise_type = promise<void, void>;
 
-    // Creates an empty pending task without a promise.
-    pending_task() = default;
+  // Creates an empty pending task without a promise.
+  pending_task() = default;
 
-    // Creates a pending task that wraps an already boxed promise that returns
-    // |fit::result<void, void>|.
-    pending_task(promise_type promise)
-        : promise_(std::move(promise)) {}
+  // Creates a pending task that wraps an already boxed promise that returns
+  // |fit::result<void, void>|.
+  pending_task(promise_type promise) : promise_(std::move(promise)) {}
 
-    // Creates a pending task that wraps any kind of promise, boxed or unboxed,
-    // regardless of its result type and with any context that is assignable
-    // from this task's context type.
-    template <typename Continuation>
-    pending_task(promise_impl<Continuation> promise)
-        : promise_(promise ? promise.discard_result().box() : promise_type()) {}
+  // Creates a pending task that wraps any kind of promise, boxed or unboxed,
+  // regardless of its result type and with any context that is assignable
+  // from this task's context type.
+  template <typename Continuation>
+  pending_task(promise_impl<Continuation> promise)
+      : promise_(promise ? promise.discard_result().box() : promise_type()) {}
 
-    pending_task(pending_task&&) = default;
-    pending_task& operator=(pending_task&&) = default;
+  pending_task(pending_task&&) = default;
+  pending_task& operator=(pending_task&&) = default;
 
-    // Destroys the pending task, releasing its promise.
-    ~pending_task() = default;
+  // Destroys the pending task, releasing its promise.
+  ~pending_task() = default;
 
-    // Returns true if the pending task is non-empty (has a valid promise).
-    explicit operator bool() const { return !!promise_; }
+  // Returns true if the pending task is non-empty (has a valid promise).
+  explicit operator bool() const { return !!promise_; }
 
-    // Evaluates the pending task.
-    // If the task completes (returns a non-pending result), the task reverts
-    // to an empty state (because the promise it holds has reverted to an empty
-    // state) and returns true.
-    // It is an error to invoke this method if the pending task is empty.
-    bool operator()(fit::context& context) {
-        return !promise_(context).is_pending();
-    }
+  // Evaluates the pending task.
+  // If the task completes (returns a non-pending result), the task reverts
+  // to an empty state (because the promise it holds has reverted to an empty
+  // state) and returns true.
+  // It is an error to invoke this method if the pending task is empty.
+  bool operator()(fit::context& context) { return !promise_(context).is_pending(); }
 
-    // Extracts the pending task's promise.
-    promise_type take_promise() {
-        return std::move(promise_);
-    }
+  // Extracts the pending task's promise.
+  promise_type take_promise() { return std::move(promise_); }
 
-    pending_task(const pending_task&) = delete;
-    pending_task& operator=(const pending_task&) = delete;
+  pending_task(const pending_task&) = delete;
+  pending_task& operator=(const pending_task&) = delete;
 
-private:
-    promise_type promise_;
+ private:
+  promise_type promise_;
 };
 
 // Execution context for an asynchronous task, such as a |fit::promise|,
@@ -1331,28 +1396,27 @@
 //
 // See documentation of |fit::promise| for more information.
 class context {
-public:
-    // Gets the executor that is running the task, never null.
-    virtual class executor* executor() const = 0;
+ public:
+  // Gets the executor that is running the task, never null.
+  virtual class executor* executor() const = 0;
 
-    // Obtains a handle that can be used to resume the task after it has been
-    // suspended.
-    //
-    // Clients should call this method before returning |fit::pending()| from
-    // the task.  See documentation on |fit::executor|.
-    virtual suspended_task suspend_task() = 0;
+  // Obtains a handle that can be used to resume the task after it has been
+  // suspended.
+  //
+  // Clients should call this method before returning |fit::pending()| from
+  // the task.  See documentation on |fit::executor|.
+  virtual suspended_task suspend_task() = 0;
 
-    // Converts this context to a derived context type.
-    template <typename Context,
-              typename = std::enable_if_t<std::is_base_of<context, Context>::value>>
-    Context& as() & {
-        // TODO(CP-163): We should perform a run-time type check here rather
-        // than blindly casting.  That's why this method exists.
-        return static_cast<Context&>(*this);
-    }
+  // Converts this context to a derived context type.
+  template <typename Context, typename = std::enable_if_t<std::is_base_of<context, Context>::value>>
+  Context& as() & {
+    // TODO(fxbug.dev/4060): We should perform a run-time type check here rather
+    // than blindly casting.  That's why this method exists.
+    return static_cast<Context&>(*this);
+  }
 
-protected:
-    virtual ~context() = default;
+ protected:
+  virtual ~context() = default;
 };
 
 // An abstract interface for executing asynchronous tasks, such as promises,
@@ -1399,15 +1463,15 @@
 //
 // See also |fit::single_threaded_executor| for a concrete implementation.
 class executor {
-public:
-    // Destroys the executor along with all of its remaining scheduled tasks
-    // that have yet to complete.
-    virtual ~executor() = default;
+ public:
+  // Destroys the executor along with all of its remaining scheduled tasks
+  // that have yet to complete.
+  virtual ~executor() = default;
 
-    // Schedules a task for eventual execution by the executor.
-    //
-    // This method is thread-safe.
-    virtual void schedule_task(pending_task task) = 0;
+  // Schedules a task for eventual execution by the executor.
+  //
+  // This method is thread-safe.
+  virtual void schedule_task(pending_task task) = 0;
 };
 
 // Represents a task that is awaiting resumption.
@@ -1419,102 +1483,105 @@
 //
 // See documentation of |fit::executor| for more information.
 class suspended_task final {
-public:
-    // A handle that grants the capability to resume a suspended task.
-    // Each issued ticket must be individually resolved.
-    using ticket = uint64_t;
+ public:
+  // A handle that grants the capability to resume a suspended task.
+  // Each issued ticket must be individually resolved.
+  using ticket = uint64_t;
 
-    // The resolver mechanism implements a lightweight form of reference
-    // counting for tasks that have been suspended.
-    //
-    // When a suspended task is created in a non-empty state, it receives
-    // a pointer to a resolver interface and a ticket.  The ticket is
-    // a one-time-use handle that represents the task that was suspended
-    // and provides a means to resume it.  The |suspended_task| class ensures
-    // that every ticket is precisely accounted for.
-    //
-    // When |suspended_task::resume_task()| is called on an instance with
-    // a valid ticket, the resolver's |resolve_ticket()| method is invoked
-    // passing the ticket's value along with *true* to resume the task.  This
-    // operation consumes the ticket so the |suspended_task| transitions to
-    // an empty state.  The ticket and resolver cannot be used again by
-    // this |suspended_task| instance.
-    //
-    // Similarly, when |suspended_task::reset()| is called on an instance with
-    // a valid ticket or when the task goes out of scope on such an instance,
-    // the resolver's |resolve_ticket()| method is invoked but this time passes
-    // *false* to not resume the task.  As before, the ticket is consumed.
-    //
-    // Finally, when the |suspended_task| is copied, its ticket is duplicated
-    // using |duplicate_ticket()| resulting in two tickets, both of which
-    // must be individually resolved.
-    //
-    // Resuming a task that has already been resumed has no effect.
-    // Conversely, a task is considered "abandoned" if all of its tickets
-    // have been resolved without it ever being resumed.  See documentation
-    // of |fit::promise| for more information.
-    //
-    // The methods of this class are safe to call from any thread, including
-    // threads that may not be managed by the task's executor.
-    class resolver {
-    public:
-        // Duplicates the provided ticket, returning a new ticket.
-        // Note: The new ticket may have the same numeric value as the
-        //       original ticket but should be considered a distinct instance
-        //       that must be separately resolved.
-        virtual ticket duplicate_ticket(ticket ticket) = 0;
+  // The resolver mechanism implements a lightweight form of reference
+  // counting for tasks that have been suspended.
+  //
+  // When a suspended task is created in a non-empty state, it receives
+  // a pointer to a resolver interface and a ticket.  The ticket is
+  // a one-time-use handle that represents the task that was suspended
+  // and provides a means to resume it.  The |suspended_task| class ensures
+  // that every ticket is precisely accounted for.
+  //
+  // When |suspended_task::resume_task()| is called on an instance with
+  // a valid ticket, the resolver's |resolve_ticket()| method is invoked
+  // passing the ticket's value along with *true* to resume the task.  This
+  // operation consumes the ticket so the |suspended_task| transitions to
+  // an empty state.  The ticket and resolver cannot be used again by
+  // this |suspended_task| instance.
+  //
+  // Similarly, when |suspended_task::reset()| is called on an instance with
+  // a valid ticket or when the task goes out of scope on such an instance,
+  // the resolver's |resolve_ticket()| method is invoked but this time passes
+  // *false* to not resume the task.  As before, the ticket is consumed.
+  //
+  // Finally, when the |suspended_task| is copied, its ticket is duplicated
+  // using |duplicate_ticket()| resulting in two tickets, both of which
+  // must be individually resolved.
+  //
+  // Resuming a task that has already been resumed has no effect.
+  // Conversely, a task is considered "abandoned" if all of its tickets
+  // have been resolved without it ever being resumed.  See documentation
+  // of |fit::promise| for more information.
+  //
+  // The methods of this class are safe to call from any thread, including
+  // threads that may not be managed by the task's executor.
+  class resolver {
+   public:
+    // Duplicates the provided ticket, returning a new ticket.
+    // Note: The new ticket may have the same numeric value as the
+    //       original ticket but should be considered a distinct instance
+    //       that must be separately resolved.
+    virtual ticket duplicate_ticket(ticket ticket) = 0;
 
-        // Consumes the provided ticket, optionally resuming its associated task.
-        // The provided ticket must not be used again.
-        virtual void resolve_ticket(ticket ticket, bool resume_task) = 0;
+    // Consumes the provided ticket, optionally resuming its associated task.
+    // The provided ticket must not be used again.
+    virtual void resolve_ticket(ticket ticket, bool resume_task) = 0;
 
-    protected:
-        virtual ~resolver() = default;
-    };
+   protected:
+    virtual ~resolver() = default;
+  };
 
-    suspended_task()
-        : resolver_(nullptr), ticket_(0) {}
+  suspended_task() : resolver_(nullptr), ticket_(0) {}
 
-    suspended_task(resolver* resolver, ticket ticket)
-        : resolver_(resolver), ticket_(ticket) {}
+  suspended_task(resolver* resolver, ticket ticket) : resolver_(resolver), ticket_(ticket) {}
 
-    suspended_task(const suspended_task& other);
-    suspended_task(suspended_task&& other);
+  suspended_task(const suspended_task& other);
+  suspended_task(suspended_task&& other);
 
-    // Releases the task without resumption.
-    //
-    // Does nothing if this object does not hold a ticket.
-    ~suspended_task();
+  // Releases the task without resumption.
+  //
+  // Does nothing if this object does not hold a ticket.
+  ~suspended_task();
 
-    // Returns true if this object holds a ticket for a suspended task.
-    explicit operator bool() const { return resolver_ != nullptr; }
+  // Returns true if this object holds a ticket for a suspended task.
+  explicit operator bool() const { return resolver_ != nullptr; }
 
-    // Asks the task's executor to resume execution of the suspended task
-    // if it has not already been resumed or completed.  Also releases
-    // the task's ticket as a side-effect.
-    //
-    // Clients should call this method when it is possible for the task to
-    // make progress; for example, because some event the task was
-    // awaiting has occurred.  See documentation on |fit::executor|.
-    //
-    // Does nothing if this object does not hold a ticket.
-    void resume_task() { resolve(true); }
+  // Asks the task's executor to resume execution of the suspended task
+  // if it has not already been resumed or completed.  Also releases
+  // the task's ticket as a side-effect.
+  //
+  // Clients should call this method when it is possible for the task to
+  // make progress; for example, because some event the task was
+  // awaiting has occurred.  See documentation on |fit::executor|.
+  //
+  // Does nothing if this object does not hold a ticket.
+  void resume_task() { resolve(true); }
 
-    // Releases the suspended task without resumption.
-    //
-    // Does nothing if this object does not hold a ticket.
-    void reset() { resolve(false); }
+  // Releases the suspended task without resumption.
+  //
+  // Does nothing if this object does not hold a ticket.
+  void reset() { resolve(false); }
 
-    suspended_task& operator=(const suspended_task& other);
-    suspended_task& operator=(suspended_task&& other);
+  // Swaps suspended tasks.
+  void swap(suspended_task& other);
 
-private:
-    void resolve(bool resume_task);
+  suspended_task& operator=(const suspended_task& other);
+  suspended_task& operator=(suspended_task&& other);
 
-    resolver* resolver_;
-    ticket ticket_;
+ private:
+  void resolve(bool resume_task);
+
+  resolver* resolver_;
+  ticket ticket_;
 };
 
-} // namespace fit
+inline void swap(suspended_task& a, suspended_task& b) { a.swap(b); }
 
-#endif // LIB_FIT_PROMISE_H_
+}  // namespace fit
+
+#endif  // LIB_FIT_PROMISE_H_
diff --git a/pkg/fit/include/lib/fit/promise_internal.h b/pkg/fit/include/lib/fit/promise_internal.h
index 30e7085..01b7750 100644
--- a/pkg/fit/include/lib/fit/promise_internal.h
+++ b/pkg/fit/include/lib/fit/promise_internal.h
@@ -15,6 +15,7 @@
 #include "nullable.h"
 #include "result.h"
 #include "traits.h"
+#include "utility_internal.h"
 
 namespace fit {
 
@@ -39,511 +40,572 @@
 // Deduces a continuation's result.
 // Also ensures that the continuation has a compatible signature.
 template <typename Continuation,
-          typename = std::enable_if_t<is_result<
-              decltype(std::declval<Continuation&>()(
-                  std::declval<::fit::context&>()))>::value>>
+          typename = std::enable_if_t<is_result<decltype(
+              std::declval<Continuation&>()(std::declval<::fit::context&>()))>::value>>
 struct continuation_traits {
-    using type = Continuation;
-    using result_type = decltype(std::declval<Continuation&>()(std::declval<::fit::context&>()));
+  using type = Continuation;
+  using result_type = decltype(std::declval<Continuation&>()(std::declval<::fit::context&>()));
 };
 template <typename Continuation, typename = fit::void_t<>>
 struct is_continuation : std::false_type {};
 template <typename Continuation>
-struct is_continuation<
-    Continuation,
-    fit::void_t<typename continuation_traits<Continuation>::type>>
+struct is_continuation<Continuation, fit::void_t<typename continuation_traits<Continuation>::type>>
     : std::true_type {};
 
+// Interposer type that provides uniform move construction/assignment for
+// callable types that may or may not be move assignable. Lambdas are not
+// typically move assignable, even though they may be move constructible.
+//
+// This type has a well-defined empty state. Instances of this type that are
+// the source of move operation are left in the empty state.
+template <typename Handler>
+class movable_handler {
+  static_assert(std::is_move_constructible<Handler>::value, "Handler must be move constructible!");
+
+  template <typename... Conditions>
+  using requires_conditions = ::fit::internal::requires_conditions<Conditions...>;
+
+  template <typename... Conditions>
+  using assignment_requires_conditions =
+      ::fit::internal::assignment_requires_conditions<movable_handler&, Conditions...>;
+
+  template <typename U>
+  using not_self_type = ::fit::internal::not_same_type<movable_handler, U>;
+
+ public:
+  constexpr movable_handler() = default;
+
+  constexpr movable_handler(const movable_handler&) = delete;
+  constexpr movable_handler& operator=(const movable_handler&) = delete;
+
+  constexpr movable_handler(movable_handler&& other) : handler_{std::move(other.handler_)} {
+    other.handler_.reset();
+  }
+
+  constexpr movable_handler& operator=(movable_handler&& other) {
+    if (this != &other) {
+      reset();
+      if (other.handler_.has_value()) {
+        handler_.emplace(std::move(other.handler_.value()));
+        other.handler_.reset();
+      }
+    }
+    return *this;
+  }
+
+  template <typename U = Handler,
+            requires_conditions<not_self_type<U>, std::is_constructible<Handler, U&&>,
+                                std::is_convertible<U&&, Handler>> = true>
+  constexpr movable_handler(U&& handler) {
+    if (!is_null(handler)) {
+      handler_.emplace(std::forward<U>(handler));
+    }
+  }
+
+  ~movable_handler() = default;
+
+  template <typename U>
+  constexpr assignment_requires_conditions<not_self_type<U>, std::is_constructible<Handler, U>,
+                                           std::is_assignable<Handler&, U>>
+  operator=(U&& handler) {
+    handler_.reset();
+    if (!is_null(handler)) {
+      handler_.emplace(std::forward<U>(handler));
+    }
+    return *this;
+  }
+
+  template <typename... Args>
+  constexpr auto operator()(Args&&... args) {
+    // Seamlessly handle void by casting call expression to return type.
+    using Return = typename callable_traits<Handler>::return_type;
+    return static_cast<Return>((handler_.value())(std::forward<Args>(args)...));
+  }
+
+  explicit constexpr operator bool() const { return handler_.has_value(); }
+
+  constexpr void reset() { handler_.reset(); }
+
+ private:
+  optional<Handler> handler_;
+};
+
 // Wraps a handler function and adapts its return type to a fit::result
 // via its specializations.
 template <typename Handler, typename DefaultV, typename DefaultE,
           typename ReturnType = typename callable_traits<Handler>::return_type,
           bool callable_result = ::fit::is_callable<ReturnType>::value>
 class result_adapter final {
-    // This expression always evaluates to false but depends on the template
-    // type parameters so that it only gets evaluated when the template is
-    // expanded.  If we simply wrote "false", the compiler would raise the
-    // static assertion failure as soon as it encountered the statement.
-    template <typename T>
-    struct check_result { static constexpr bool value = false; };
-    static_assert(
-        check_result<ReturnType>::value,
-        "The provided handler's result type was expected to be "
-        "fit::result<V, E>, fit::ok_result<V>, fit::error_result<E>, "
-        "fit::pending_result, void, or a continuation with the signature "
-        "fit::result<V, E>(fit::context&).  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  // This expression always evaluates to false but depends on the template
+  // type parameters so that it only gets evaluated when the template is
+  // expanded.  If we simply wrote "false", the compiler would raise the
+  // static assertion failure as soon as it encountered the statement.
+  template <typename T>
+  struct check_result {
+    static constexpr bool value = false;
+  };
+  static_assert(check_result<ReturnType>::value,
+                "The provided handler's result type was expected to be "
+                "fit::result<V, E>, fit::ok_result<V>, fit::error_result<E>, "
+                "fit::pending_result, void, or a continuation with the signature "
+                "fit::result<V, E>(fit::context&).  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 };
 
 // Supports handlers that return void.
 template <typename Handler, typename DefaultV, typename DefaultE>
 class result_adapter<Handler, DefaultV, DefaultE, void, false> final {
-public:
-    using result_type = ::fit::result<DefaultV, DefaultE>;
+ public:
+  using result_type = ::fit::result<DefaultV, DefaultE>;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(Handler handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        handler_(std::forward<Args>(args)...);
-        return ::fit::ok();
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    handler_(std::forward<Args>(args)...);
+    return ::fit::ok();
+  }
 
-private:
-    Handler handler_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
 };
 
 // Supports handlers that return pending_result.
 template <typename Handler, typename DefaultV, typename DefaultE>
 class result_adapter<Handler, DefaultV, DefaultE, ::fit::pending_result, false> final {
-public:
-    using result_type = ::fit::result<DefaultV, DefaultE>;
+ public:
+  using result_type = ::fit::result<DefaultV, DefaultE>;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(movable_handler<Handler> handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return handler_(std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return handler_(std::forward<Args>(args)...);
+  }
 
-private:
-    Handler handler_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
 };
 
 // Supports handlers that return ok_result<V>.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          typename V>
+template <typename Handler, typename DefaultV, typename DefaultE, typename V>
 class result_adapter<Handler, DefaultV, DefaultE, ::fit::ok_result<V>, false> final {
-public:
-    using result_type = ::fit::result<V, DefaultE>;
+ public:
+  using result_type = ::fit::result<V, DefaultE>;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(movable_handler<Handler> handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return handler_(std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return handler_(std::forward<Args>(args)...);
+  }
 
-private:
-    Handler handler_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
 };
 
 // Supports handlers that return error_result<E>.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          typename E>
+template <typename Handler, typename DefaultV, typename DefaultE, typename E>
 class result_adapter<Handler, DefaultV, DefaultE, ::fit::error_result<E>, false> final {
-public:
-    using result_type = ::fit::result<DefaultV, E>;
+ public:
+  using result_type = ::fit::result<DefaultV, E>;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(movable_handler<Handler> handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return handler_(std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return handler_(std::forward<Args>(args)...);
+  }
 
-private:
-    Handler handler_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
 };
 
 // Supports handlers that return result<V, E>.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          typename V, typename E>
+template <typename Handler, typename DefaultV, typename DefaultE, typename V, typename E>
 class result_adapter<Handler, DefaultV, DefaultE, ::fit::result<V, E>, false> final {
-public:
-    using result_type = ::fit::result<V, E>;
+ public:
+  using result_type = ::fit::result<V, E>;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(movable_handler<Handler> handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return handler_(std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return handler_(std::forward<Args>(args)...);
+  }
 
-private:
-    Handler handler_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
 };
 
 // Supports handlers that return continuations or promises.
 // This works for any callable whose signature is:
 //     fit::result<...>(fit::context&)
-template <typename Handler, typename DefaultV, typename DefaultE,
-          typename ReturnType>
+template <typename Handler, typename DefaultV, typename DefaultE, typename ReturnType>
 class result_adapter<Handler, DefaultV, DefaultE, ReturnType, true> final {
-    // If the handler doesn't actually return a continuation then the
-    // compilation will fail here which is slightly easier to diagnose
-    // than if we dropped the result_adapter specialization entirely.
-    using continuation_traits = continuation_traits<ReturnType>;
-    using continuation_type = typename continuation_traits::type;
+  // If the handler doesn't actually return a continuation then the
+  // compilation will fail here which is slightly easier to diagnose
+  // than if we dropped the result_adapter specialization entirely.
+  using result_continuation_traits = continuation_traits<ReturnType>;
+  using continuation_type = typename result_continuation_traits::type;
 
-public:
-    using result_type = typename continuation_traits::result_type;
+ public:
+  using result_type = typename result_continuation_traits::result_type;
 
-    explicit result_adapter(Handler handler)
-        : handler_(std::move(handler)) {}
+  explicit result_adapter(movable_handler<Handler> handler) : handler_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        if (handler_) {
-            continuation_ = (*handler_)(std::forward<Args>(args)...);
-            handler_.reset();
-        }
-        if (!continuation_) {
-            return ::fit::pending();
-        }
-        return (*continuation_)(context);
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    if (handler_) {
+      continuation_ = handler_(std::forward<Args>(args)...);
+      handler_.reset();
     }
+    if (!continuation_) {
+      return ::fit::pending();
+    }
+    return continuation_(context);
+  }
 
-private:
-    ::fit::nullable<Handler> handler_;
-    ::fit::nullable<continuation_type> continuation_;
+  result_adapter(const result_adapter&) = delete;
+  result_adapter& operator=(const result_adapter&) = delete;
+
+  result_adapter(result_adapter&&) = default;
+  result_adapter& operator=(result_adapter&&) = default;
+
+ private:
+  movable_handler<Handler> handler_;
+  movable_handler<continuation_type> continuation_;
 };
 
 // Wraps a handler that may or may not have a fit::context& as first argument.
 // This is determined by checking the argument count.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          size_t num_args = 0,
-          int excess_args =
-              (static_cast<int>(
-                   ::fit::callable_traits<Handler>::args::size) -
-               static_cast<int>(num_args))>
+template <typename Handler, typename DefaultV, typename DefaultE, size_t num_args = 0,
+          int excess_args = (static_cast<int>(::fit::callable_traits<Handler>::args::size) -
+                             static_cast<int>(num_args))>
 class context_adapter final {
-    static_assert(
-        excess_args >= 0,
-        "The provided handler has too few arguments.  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
-    static_assert(
-        excess_args <= 1,
-        "The provided handler has too many arguments.  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  static_assert(excess_args >= 0,
+                "The provided handler has too few arguments.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
+  static_assert(excess_args <= 1,
+                "The provided handler has too many arguments.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 };
 
 // Supports handlers without a context argument.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          size_t num_args>
+template <typename Handler, typename DefaultV, typename DefaultE, size_t num_args>
 class context_adapter<Handler, DefaultV, DefaultE, num_args, 0> final {
-    using base_type = result_adapter<Handler, DefaultV, DefaultE>;
+  using base_type = result_adapter<Handler, DefaultV, DefaultE>;
 
-public:
-    using result_type = typename base_type::result_type;
-    static constexpr size_t next_arg_index = 0;
+ public:
+  using result_type = typename base_type::result_type;
+  static constexpr size_t next_arg_index = 0;
 
-    explicit context_adapter(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit context_adapter(Handler handler) : base_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return base_.template call<Args...>(context, std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return base_.template call<Args...>(context, std::forward<Args>(args)...);
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Supports handlers with a context argument.
-template <typename Handler, typename DefaultV, typename DefaultE,
-          size_t num_args>
+template <typename Handler, typename DefaultV, typename DefaultE, size_t num_args>
 class context_adapter<Handler, DefaultV, DefaultE, num_args, 1> final {
-    using base_type = result_adapter<Handler, DefaultV, DefaultE>;
-    using context_arg_type =
-        typename ::fit::callable_traits<Handler>::args::template at<0>;
-    static_assert(
-        std::is_same<context_arg_type, ::fit::context&>::value,
-        "The provided handler's first argument was expected to be of type "
-        "fit::context& based on the number of arguments it has.  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  using base_type = result_adapter<Handler, DefaultV, DefaultE>;
+  using context_arg_type = typename ::fit::callable_traits<Handler>::args::template at<0>;
+  static_assert(std::is_same<context_arg_type, ::fit::context&>::value,
+                "The provided handler's first argument was expected to be of type "
+                "fit::context& based on the number of arguments it has.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 
-public:
-    using result_type = typename base_type::result_type;
-    static constexpr size_t next_arg_index = 1;
+ public:
+  using result_type = typename base_type::result_type;
+  static constexpr size_t next_arg_index = 1;
 
-    explicit context_adapter(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit context_adapter(Handler handler) : base_(std::move(handler)) {}
 
-    template <typename... Args>
-    result_type call(::fit::context& context, Args... args) {
-        return base_.template call<::fit::context&, Args...>(
-            context, context, std::forward<Args>(args)...);
-    }
+  template <typename... Args>
+  result_type call(::fit::context& context, Args... args) {
+    return base_.template call<::fit::context&, Args...>(context, context,
+                                                         std::forward<Args>(args)...);
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Wraps a handler that may accept a context argument.
 template <typename Handler>
 class context_handler_invoker final {
-    using base_type = context_adapter<Handler, void, void, 0>;
+  using base_type = context_adapter<Handler, void, void, 0>;
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit context_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit context_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context) {
-        return base_.template call<>(context);
-    }
+  result_type operator()(::fit::context& context) { return base_.template call<>(context); }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Wraps a handler that may accept a context and result argument.
 template <typename Handler, typename PriorResult>
 class result_handler_invoker final {
-    using base_type = context_adapter<Handler, void, void, 1>;
-    using result_arg_type =
-        typename ::fit::callable_traits<Handler>::args::template at<
-            base_type::next_arg_index>;
-    static_assert(
-        (std::is_same<result_arg_type, PriorResult>::value &&
-         std::is_copy_constructible<result_arg_type>::value) ||
-            std::is_same<result_arg_type, PriorResult&>::value ||
-            std::is_same<result_arg_type, const PriorResult&>::value,
-        "The provided handler's last argument was expected to be of type "
-        "fit::result<V, E>&, const fit::result<V, E>&, or fit::result<V, E> "
-        "(if the result is copy-constructible).  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  using base_type = context_adapter<Handler, void, void, 1>;
+  using result_arg_type =
+      typename ::fit::callable_traits<Handler>::args::template at<base_type::next_arg_index>;
+  static_assert(std::is_same<result_arg_type, PriorResult&>::value ||
+                    std::is_same<result_arg_type, const PriorResult&>::value,
+                "The provided handler's last argument was expected to be of type "
+                "fit::result<V, E>& or const fit::result<V, E>& where V is the prior "
+                "result's value type and E is the prior result's error type.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit result_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit result_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context, PriorResult& result) {
-        return base_.template call<PriorResult&>(context, result);
-    }
+  result_type operator()(::fit::context& context, PriorResult& result) {
+    return base_.template call<PriorResult&>(context, result);
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Wraps a handler that may accept a context and value argument.
-template <typename Handler, typename PriorResult,
-          typename V = typename PriorResult::value_type>
+template <typename Handler, typename PriorResult, typename V = typename PriorResult::value_type>
 class value_handler_invoker final {
-    using base_type = context_adapter<Handler,
-                                      void, typename PriorResult::error_type, 1>;
-    using value_arg_type =
-        typename ::fit::callable_traits<Handler>::args::template at<
-            base_type::next_arg_index>;
-    static_assert(
-        (std::is_same<value_arg_type, V>::value &&
-         std::is_copy_constructible<value_arg_type>::value) ||
-            std::is_same<value_arg_type, V&>::value ||
-            std::is_same<value_arg_type, const V&>::value,
-        "The provided handler's last argument was expected to be of type "
-        "V&, const V&, or V (if the value is copy-constructible).  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  using base_type = context_adapter<Handler, void, typename PriorResult::error_type, 1>;
+  using value_arg_type =
+      typename ::fit::callable_traits<Handler>::args::template at<base_type::next_arg_index>;
+  static_assert(std::is_same<value_arg_type, V&>::value ||
+                    std::is_same<value_arg_type, const V&>::value,
+                "The provided handler's last argument was expected to be of type "
+                "V& or const V& where V is the prior result's value type.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit value_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit value_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context, PriorResult& result) {
-        return base_.template call<V&>(context, result.value());
-    }
+  result_type operator()(::fit::context& context, PriorResult& result) {
+    return base_.template call<V&>(context, result.value());
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Specialization for void value.
 template <typename Handler, typename PriorResult>
 class value_handler_invoker<Handler, PriorResult, void> final {
-    using base_type = context_adapter<Handler,
-                                      void, typename PriorResult::error_type, 0>;
+  using base_type = context_adapter<Handler, void, typename PriorResult::error_type, 0>;
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit value_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit value_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context, PriorResult& result) {
-        return base_.template call<>(context);
-    }
+  result_type operator()(::fit::context& context, PriorResult& result) {
+    return base_.template call<>(context);
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Wraps a handler that may accept a context and error argument.
-template <typename Handler, typename PriorResult,
-          typename E = typename PriorResult::error_type>
+template <typename Handler, typename PriorResult, typename E = typename PriorResult::error_type>
 class error_handler_invoker final {
-    using base_type = context_adapter<Handler,
-                                      typename PriorResult::value_type, void, 1>;
-    using error_arg_type =
-        typename ::fit::callable_traits<Handler>::args::template at<
-            base_type::next_arg_index>;
-    static_assert(
-        (std::is_same<error_arg_type, E>::value &&
-         std::is_copy_constructible<error_arg_type>::value) ||
-            std::is_same<error_arg_type, E&>::value ||
-            std::is_same<error_arg_type, const E&>::value,
-        "The provided handler's last argument was expected to be of type "
-        "E&, const E&, or E (if the error is copy-constructible).  "
-        "Please refer to the combinator's documentation for a list of "
-        "supported handler function signatures.");
+  using base_type = context_adapter<Handler, typename PriorResult::value_type, void, 1>;
+  using error_arg_type =
+      typename ::fit::callable_traits<Handler>::args::template at<base_type::next_arg_index>;
+  static_assert(std::is_same<error_arg_type, E&>::value ||
+                    std::is_same<error_arg_type, const E&>::value,
+                "The provided handler's last argument was expected to be of type "
+                "E& or const E& where E is the prior result's error type.  "
+                "Please refer to the combinator's documentation for a list of "
+                "supported handler function signatures.");
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit error_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit error_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context, PriorResult& result) {
-        return base_.template call<E&>(context, result.error());
-    }
+  result_type operator()(::fit::context& context, PriorResult& result) {
+    return base_.template call<E&>(context, result.error());
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // Specialization for void error.
 template <typename Handler, typename PriorResult>
 class error_handler_invoker<Handler, PriorResult, void> final {
-    using base_type = context_adapter<Handler,
-                                      typename PriorResult::value_type, void, 0>;
+  using base_type = context_adapter<Handler, typename PriorResult::value_type, void, 0>;
 
-public:
-    using result_type = typename base_type::result_type;
+ public:
+  using result_type = typename base_type::result_type;
 
-    explicit error_handler_invoker(Handler handler)
-        : base_(std::move(handler)) {}
+  explicit error_handler_invoker(Handler handler) : base_(std::move(handler)) {}
 
-    result_type operator()(::fit::context& context, PriorResult& result) {
-        return base_.template call<>(context);
-    }
+  result_type operator()(::fit::context& context, PriorResult& result) {
+    return base_.template call<>(context);
+  }
 
-private:
-    base_type base_;
+ private:
+  base_type base_;
 };
 
 // The continuation produced by |fit::promise::then()|.
 template <typename PriorPromise, typename ResultHandler>
 class then_continuation final {
-    using invoker_type = ::fit::internal::result_handler_invoker<
-        ResultHandler, typename PriorPromise::result_type>;
+  using invoker_type =
+      ::fit::internal::result_handler_invoker<ResultHandler, typename PriorPromise::result_type>;
 
-public:
-    then_continuation(PriorPromise prior_promise, ResultHandler handler)
-        : prior_(std::move(prior_promise)),
-          invoker_(std::move(handler)) {}
+ public:
+  then_continuation(PriorPromise prior_promise, ResultHandler handler)
+      : prior_(std::move(prior_promise)), invoker_(std::move(handler)) {}
 
-    typename invoker_type::result_type operator()(::fit::context& context) {
-        if (!prior_(context))
-            return ::fit::pending();
-        return invoker_(context, prior_.result());
-    }
+  typename invoker_type::result_type operator()(::fit::context& context) {
+    if (!prior_(context))
+      return ::fit::pending();
+    return invoker_(context, prior_.result());
+  }
 
-private:
-    future_impl<PriorPromise> prior_;
-    invoker_type invoker_;
+ private:
+  future_impl<PriorPromise> prior_;
+  invoker_type invoker_;
 };
 
 // The continuation produced by |fit::promise::and_then()|.
 template <typename PriorPromise, typename ValueHandler>
 class and_then_continuation final {
-    using invoker_type = ::fit::internal::value_handler_invoker<
-        ValueHandler, typename PriorPromise::result_type>;
+  using invoker_type =
+      ::fit::internal::value_handler_invoker<ValueHandler, typename PriorPromise::result_type>;
 
-public:
-    and_then_continuation(PriorPromise prior_promise, ValueHandler handler)
-        : prior_(std::move(prior_promise)),
-          invoker_(std::move(handler)) {}
+ public:
+  and_then_continuation(PriorPromise prior_promise, ValueHandler handler)
+      : prior_(std::move(prior_promise)), invoker_(std::move(handler)) {}
 
-    typename invoker_type::result_type operator()(::fit::context& context) {
-        if (!prior_(context))
-            return ::fit::pending();
-        if (prior_.is_error())
-            return prior_.take_error_result();
-        return invoker_(context, prior_.result());
-    }
+  typename invoker_type::result_type operator()(::fit::context& context) {
+    if (!prior_(context))
+      return ::fit::pending();
+    if (prior_.is_error())
+      return prior_.take_error_result();
+    return invoker_(context, prior_.result());
+  }
 
-private:
-    future_impl<PriorPromise> prior_;
-    invoker_type invoker_;
+ private:
+  future_impl<PriorPromise> prior_;
+  invoker_type invoker_;
 };
 
 // The continuation produced by |fit::promise::or_else()|.
 template <typename PriorPromise, typename ErrorHandler>
 class or_else_continuation final {
-    using invoker_type = ::fit::internal::error_handler_invoker<
-        ErrorHandler, typename PriorPromise::result_type>;
+  using invoker_type =
+      ::fit::internal::error_handler_invoker<ErrorHandler, typename PriorPromise::result_type>;
 
-public:
-    or_else_continuation(PriorPromise prior_promise, ErrorHandler handler)
-        : prior_(std::move(prior_promise)),
-          invoker_(std::move(handler)) {}
+ public:
+  or_else_continuation(PriorPromise prior_promise, ErrorHandler handler)
+      : prior_(std::move(prior_promise)), invoker_(std::move(handler)) {}
 
-    typename invoker_type::result_type operator()(::fit::context& context) {
-        if (!prior_(context))
-            return ::fit::pending();
-        if (prior_.is_ok())
-            return prior_.take_ok_result();
-        return invoker_(context, prior_.result());
-    }
+  typename invoker_type::result_type operator()(::fit::context& context) {
+    if (!prior_(context))
+      return ::fit::pending();
+    if (prior_.is_ok())
+      return prior_.take_ok_result();
+    return invoker_(context, prior_.result());
+  }
 
-private:
-    future_impl<PriorPromise> prior_;
-    invoker_type invoker_;
+ private:
+  future_impl<PriorPromise> prior_;
+  invoker_type invoker_;
 };
 
 // The continuation produced by |fit::promise::inspect()|.
 template <typename PriorPromise, typename InspectHandler>
 class inspect_continuation final {
-    using invoker_type = ::fit::internal::result_handler_invoker<
-        InspectHandler, typename PriorPromise::result_type>;
+  using invoker_type =
+      ::fit::internal::result_handler_invoker<InspectHandler, typename PriorPromise::result_type>;
 
-public:
-    inspect_continuation(PriorPromise prior_promise, InspectHandler handler)
-        : prior_(std::move(prior_promise)),
-          invoker_(std::move(handler)) {}
+ public:
+  inspect_continuation(PriorPromise prior_promise, InspectHandler handler)
+      : prior_(std::move(prior_promise)), invoker_(std::move(handler)) {}
 
-    typename PriorPromise::result_type operator()(::fit::context& context) {
-        typename PriorPromise::result_type result = prior_(context);
-        if (result)
-            invoker_(context, result);
-        return result;
-    }
+  typename PriorPromise::result_type operator()(::fit::context& context) {
+    typename PriorPromise::result_type result = prior_(context);
+    if (result)
+      invoker_(context, result);
+    return result;
+  }
 
-private:
-    PriorPromise prior_;
-    invoker_type invoker_;
+ private:
+  PriorPromise prior_;
+  invoker_type invoker_;
 };
 
 // The continuation produced by |fit::promise::discard_result()|.
 template <typename PriorPromise>
 class discard_result_continuation final {
-public:
-    explicit discard_result_continuation(PriorPromise prior_promise)
-        : prior_(std::move(prior_promise)) {}
+ public:
+  explicit discard_result_continuation(PriorPromise prior_promise)
+      : prior_(std::move(prior_promise)) {}
 
-    fit::result<> operator()(::fit::context& context) {
-        if (!prior_(context))
-            return ::fit::pending();
-        return ::fit::ok();
-    }
+  fit::result<> operator()(::fit::context& context) {
+    if (!prior_(context))
+      return ::fit::pending();
+    return ::fit::ok();
+  }
 
-private:
-    PriorPromise prior_;
+ private:
+  PriorPromise prior_;
 };
 
 // The continuation produced by |make_promise()|.
@@ -551,50 +613,87 @@
 template <typename PromiseHandler>
 using promise_continuation = context_handler_invoker<PromiseHandler>;
 
+// The continuation produced by |make_result_promise()|.
+template <typename V, typename E>
+class result_continuation final {
+ public:
+  explicit result_continuation(::fit::result<V, E> result) : result_(std::move(result)) {}
+
+  ::fit::result<V, E> operator()(::fit::context& context) { return std::move(result_); }
+
+ private:
+  ::fit::result<V, E> result_;
+};
+
 // Returns true if all arguments are true or if there are none.
-inline bool all_true() {
-    return true;
-}
+inline bool all_true() { return true; }
 template <typename... Ts>
 inline bool all_true(bool value, Ts... values) {
-    return value & all_true(values...);
+  return value & all_true(values...);
 }
 
 // The continuation produced by |join_promises()|.
 template <typename... Promises>
 class join_continuation final {
-public:
-    explicit join_continuation(Promises... promises)
-        : promises_(std::make_tuple(std::move(promises)...)) {}
+ public:
+  explicit join_continuation(Promises... promises)
+      : promises_(std::make_tuple(std::move(promises)...)) {}
 
-    ::fit::result<std::tuple<typename Promises::result_type...>> operator()(
-        ::fit::context& context) {
-        return evaluate(context, std::index_sequence_for<Promises...>{});
-    }
+  ::fit::result<std::tuple<typename Promises::result_type...>> operator()(::fit::context& context) {
+    return evaluate(context, std::index_sequence_for<Promises...>{});
+  }
 
-private:
-    template <size_t... i>
-    ::fit::result<std::tuple<typename Promises::result_type...>> evaluate(
-        ::fit::context& context, std::index_sequence<i...>) {
-        bool done = all_true(std::get<i>(promises_)(context)...);
-        if (!done)
-            return ::fit::pending();
-        return ::fit::ok(std::make_tuple(std::get<i>(promises_).take_result()...));
-    }
+ private:
+  template <size_t... i>
+  ::fit::result<std::tuple<typename Promises::result_type...>> evaluate(::fit::context& context,
+                                                                        std::index_sequence<i...>) {
+    bool done = all_true(std::get<i>(promises_)(context)...);
+    if (!done)
+      return ::fit::pending();
+    return ::fit::ok(std::make_tuple(std::get<i>(promises_).take_result()...));
+  }
 
-    std::tuple<future_impl<Promises>...> promises_;
+  std::tuple<future_impl<Promises>...> promises_;
 };
 
-} // namespace internal
+// The continuation produced by |join_promise_vector()|.
+template <typename Promise>
+class join_vector_continuation final {
+  using promise_vector = std::vector<Promise>;
+  using result_vector = std::vector<typename Promise::result_type>;
+
+ public:
+  explicit join_vector_continuation(promise_vector promises)
+      : promises_(std::move(promises)), results_(promises_.size()) {}
+
+  ::fit::result<result_vector> operator()(::fit::context& context) {
+    bool all_done{true};
+    for (size_t i = 0; i < promises_.size(); ++i) {
+      if (!results_[i]) {
+        results_[i] = promises_[i](context);
+        all_done &= !results_[i].is_pending();
+      }
+    }
+    if (all_done) {
+      return fit::ok(std::move(results_));
+    }
+    return ::fit::pending();
+  }
+
+ private:
+  promise_vector promises_;
+  result_vector results_;
+};
+
+}  // namespace internal
 
 template <typename PromiseHandler>
-inline promise_impl<::fit::internal::promise_continuation<PromiseHandler>>
-make_promise(PromiseHandler handler);
+inline promise_impl<::fit::internal::promise_continuation<PromiseHandler>> make_promise(
+    PromiseHandler handler);
 
 template <typename Continuation>
-inline promise_impl<Continuation> make_promise_with_continuation(
-    Continuation continuation);
+inline promise_impl<Continuation> make_promise_with_continuation(Continuation continuation);
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_PROMISE_INTERNAL_H_
+#endif  // LIB_FIT_PROMISE_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/result.h b/pkg/fit/include/lib/fit/result.h
index eb89baf..cb64ea7 100644
--- a/pkg/fit/include/lib/fit/result.h
+++ b/pkg/fit/include/lib/fit/result.h
@@ -11,6 +11,7 @@
 #include <type_traits>
 #include <utility>
 
+#include "in_place_internal.h"
 #include "traits.h"
 #include "variant.h"
 
@@ -20,66 +21,58 @@
 struct pending_result final {};
 
 // Returns an value that represents a pending result.
-constexpr inline pending_result pending() {
-    return pending_result{};
-}
+constexpr inline pending_result pending() { return pending_result{}; }
 
 // Represents the result of a successful task.
 template <typename V = void>
 struct ok_result final {
-    using value_type = V;
+  using value_type = V;
 
-    explicit constexpr ok_result(V value)
-        : value(std::move(value)) {}
+  explicit constexpr ok_result(V value) : value(std::move(value)) {}
 
-    V value;
+  V value;
 };
 template <>
 struct ok_result<void> {
-    using value_type = void;
+  using value_type = void;
 };
 
 // Wraps the result of a successful task as an |ok_result<T>|.
 template <typename V>
 constexpr inline ok_result<V> ok(V value) {
-    return ok_result<V>(std::move(value));
+  return ok_result<V>(std::move(value));
 }
-constexpr inline ok_result<> ok() {
-    return ok_result<>{};
-}
+constexpr inline ok_result<> ok() { return ok_result<>{}; }
 
 // Represents the result of a failed task.
 template <typename E = void>
 struct error_result final {
-    using error_type = E;
+  using error_type = E;
 
-    explicit constexpr error_result(E error)
-        : error(std::move(error)) {}
+  explicit constexpr error_result(E error) : error(std::move(error)) {}
 
-    E error;
+  E error;
 };
 template <>
 struct error_result<void> {
-    using error_type = void;
+  using error_type = void;
 };
 
 // Wraps the result of a failed task as an |error_result<T>|.
 template <typename E>
 constexpr inline error_result<E> error(E error) {
-    return error_result<E>(std::move(error));
+  return error_result<E>(std::move(error));
 }
-constexpr inline error_result<> error() {
-    return error_result<>{};
-}
+constexpr inline error_result<> error() { return error_result<>{}; }
 
 // Describes the status of a task's result.
 enum class result_state {
-    // The task is still in progress.
-    pending,
-    // The task completed successfully.
-    ok,
-    // The task failed.
-    error
+  // The task is still in progress.
+  pending,
+  // The task completed successfully.
+  ok,
+  // The task failed.
+  error
 };
 
 // Represents the result of a task which may have succeeded, failed,
@@ -129,142 +122,123 @@
 // }
 template <typename V = void, typename E = void>
 class result final {
-public:
-    using value_type = V;
-    using error_type = E;
+ public:
+  using value_type = V;
+  using error_type = E;
 
-    // Creates a pending result.
-    constexpr result() = default;
-    constexpr result(pending_result) {}
+  // Creates a pending result.
+  constexpr result() = default;
+  constexpr result(pending_result) {}
 
-    // Creates an ok result.
-    constexpr result(ok_result<V> result)
-        : state_(::fit::internal::in_place_index<1>, std::move(result)) {}
-    template <typename OtherV,
-              typename = std::enable_if_t<std::is_constructible<V, OtherV>::value>>
-    constexpr result(ok_result<OtherV> other)
-        : state_(::fit::internal::in_place_index<1>,
-                 fit::ok<V>(std::move(other.value))) {}
+  // Creates an ok result.
+  constexpr result(ok_result<V> result) : state_(in_place_index<1>, std::move(result)) {}
+  template <typename OtherV, typename = std::enable_if_t<std::is_constructible<V, OtherV>::value>>
+  constexpr result(ok_result<OtherV> other)
+      : state_(in_place_index<1>, fit::ok<V>(std::move(other.value))) {}
 
-    // Creates an error result.
-    constexpr result(error_result<E> result)
-        : state_(::fit::internal::in_place_index<2>, std::move(result)) {}
-    template <typename OtherE,
-              typename = std::enable_if_t<std::is_constructible<E, OtherE>::value>>
-    constexpr result(error_result<OtherE> other)
-        : state_(::fit::internal::in_place_index<2>,
-                 fit::error<E>(std::move(other.error))) {}
+  // Creates an error result.
+  constexpr result(error_result<E> result) : state_(in_place_index<2>, std::move(result)) {}
+  template <typename OtherE, typename = std::enable_if_t<std::is_constructible<E, OtherE>::value>>
+  constexpr result(error_result<OtherE> other)
+      : state_(in_place_index<2>, fit::error<E>(std::move(other.error))) {}
 
-    // Copies another result (if copyable).
-    result(const result& other) = default;
+  // Copies another result (if copyable).
+  result(const result& other) = default;
 
-    // Moves from another result, leaving the other one in a pending state.
-    result(result&& other)
-        : state_(std::move(other.state_)) {
-        other.reset();
-    }
+  // Moves from another result, leaving the other one in a pending state.
+  result(result&& other) noexcept : state_(std::move(other.state_)) { other.reset(); }
 
-    ~result() = default;
+  ~result() = default;
 
-    // Returns the state of the task's result: pending, ok, or error.
-    constexpr result_state state() const {
-        return static_cast<result_state>(state_.index());
-    }
+  // Returns the state of the task's result: pending, ok, or error.
+  constexpr result_state state() const { return static_cast<result_state>(state_.index()); }
 
-    // Returns true if the result is not pending.
-    constexpr explicit operator bool() const {
-        return !is_pending();
-    }
+  // Returns true if the result is not pending.
+  constexpr explicit operator bool() const { return !is_pending(); }
 
-    // Returns true if the task is still in progress.
-    constexpr bool is_pending() const {
-        return state() == result_state::pending;
-    }
+  // Returns true if the task is still in progress.
+  constexpr bool is_pending() const { return state() == result_state::pending; }
 
-    // Returns true if the task succeeded.
-    constexpr bool is_ok() const {
-        return state() == result_state::ok;
-    }
+  // Returns true if the task succeeded.
+  constexpr bool is_ok() const { return state() == result_state::ok; }
 
-    // Returns true if the task failed.
-    constexpr bool is_error() const {
-        return state() == result_state::error;
-    }
+  // Returns true if the task failed.
+  constexpr bool is_error() const { return state() == result_state::error; }
 
-    // Gets the result's value.
-    // Asserts that the result's state is |fit::result_state::ok|.
-    template <typename R = V,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    constexpr R& value() {
-        return state_.template get<1>().value;
-    }
-    template <typename R = V,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    constexpr const R& value() const {
-        return state_.template get<1>().value;
-    }
+  // Gets the result's value.
+  // Asserts that the result's state is |fit::result_state::ok|.
+  template <typename R = V, typename = std::enable_if_t<!std::is_void<R>::value>>
+  constexpr R& value() {
+    return state_.template get<1>().value;
+  }
+  template <typename R = V, typename = std::enable_if_t<!std::is_void<R>::value>>
+  constexpr const R& value() const {
+    return state_.template get<1>().value;
+  }
 
-    // Takes the result's value, leaving it in a pending state.
-    // Asserts that the result's state is |fit::result_state::ok|.
-    template <typename R = V,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R take_value() {
-        auto value = std::move(state_.template get<1>().value);
-        reset();
-        return value;
-    }
-    ok_result<V> take_ok_result() {
-        auto result = std::move(state_.template get<1>());
-        reset();
-        return result;
-    }
+  // Takes the result's value, leaving it in a pending state.
+  // Asserts that the result's state is |fit::result_state::ok|.
+  template <typename R = V, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R take_value() {
+    auto value = std::move(state_.template get<1>().value);
+    reset();
+    return value;
+  }
+  ok_result<V> take_ok_result() {
+    auto result = std::move(state_.template get<1>());
+    reset();
+    return result;
+  }
 
-    // Gets a reference to the result's error.
-    // Asserts that the result's state is |fit::result_state::error|.
-    template <typename R = E,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    constexpr R& error() {
-        return state_.template get<2>().error;
-    }
-    template <typename R = E,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    constexpr const R& error() const {
-        return state_.template get<2>().error;
-    }
+  // Gets a reference to the result's error.
+  // Asserts that the result's state is |fit::result_state::error|.
+  template <typename R = E, typename = std::enable_if_t<!std::is_void<R>::value>>
+  constexpr R& error() {
+    return state_.template get<2>().error;
+  }
+  template <typename R = E, typename = std::enable_if_t<!std::is_void<R>::value>>
+  constexpr const R& error() const {
+    return state_.template get<2>().error;
+  }
 
-    // Takes the result's error, leaving it in a pending state.
-    // Asserts that the result's state is |fit::result_state::error|.
-    template <typename R = E,
-              typename = std::enable_if_t<!std::is_void<R>::value>>
-    R take_error() {
-        auto error = std::move(state_.template get<2>().error);
-        reset();
-        return error;
-    }
-    error_result<E> take_error_result() {
-        auto result = std::move(state_.template get<2>());
-        reset();
-        return result;
-    }
+  // Takes the result's error, leaving it in a pending state.
+  // Asserts that the result's state is |fit::result_state::error|.
+  template <typename R = E, typename = std::enable_if_t<!std::is_void<R>::value>>
+  R take_error() {
+    auto error = std::move(state_.template get<2>().error);
+    reset();
+    return error;
+  }
+  error_result<E> take_error_result() {
+    auto result = std::move(state_.template get<2>());
+    reset();
+    return result;
+  }
 
-    // Assigns from another result (if copyable).
-    result& operator=(const result& other) = default;
+  // Assigns from another result (if copyable).
+  result& operator=(const result& other) = default;
 
-    // Moves from another result, leaving the other one in a pending state.
-    result& operator=(result&& other) {
-        state_ = std::move(other.state_);
-        other.reset();
-        return *this;
-    }
+  // Moves from another result, leaving the other one in a pending state.
+  result& operator=(result&& other) {
+    state_ = std::move(other.state_);
+    other.reset();
+    return *this;
+  }
 
-private:
-    void reset() { state_.template emplace<0>(); }
+  // Swaps results.
+  void swap(result& other) { state_.swap(other.state_); }
 
-    ::fit::internal::variant<
-        ::fit::internal::monostate, ok_result<V>, error_result<E>>
-        state_;
+ private:
+  void reset() { state_.template emplace<0>(); }
+
+  variant<monostate, ok_result<V>, error_result<E>> state_;
 };
 
-} // namespace fit
+template <typename V, typename E>
+void swap(result<V, E>& a, result<V, E>& b) {
+  a.swap(b);
+}
 
-#endif // LIB_FIT_RESULT_H_
+}  // namespace fit
+
+#endif  // LIB_FIT_RESULT_H_
diff --git a/pkg/fit/include/lib/fit/scheduler.h b/pkg/fit/include/lib/fit/scheduler.h
index d4e16ba..99283e2 100644
--- a/pkg/fit/include/lib/fit/scheduler.h
+++ b/pkg/fit/include/lib/fit/scheduler.h
@@ -21,134 +21,133 @@
 // Instances of this object are not thread-safe.  Its client is responsible
 // for providing all necessary synchronization.
 class scheduler final {
-public:
-    using task_queue = std::queue<pending_task>;
-    using ref_count = uint32_t;
+ public:
+  using task_queue = std::queue<pending_task>;
+  using ref_count_type = uint32_t;
 
-    scheduler();
-    ~scheduler();
+  scheduler();
+  ~scheduler();
 
-    // Adds a task to the runnable queue.
-    //
-    // Preconditions:
-    // - |task| must be non-empty
-    void schedule_task(pending_task task);
+  // Adds a task to the runnable queue.
+  //
+  // Preconditions:
+  // - |task| must be non-empty
+  void schedule_task(pending_task task);
 
-    // Obtains a new ticket with a ref-count of |initial_refs|.
-    // The executor must eventually call |finalize_ticket()| to update the
-    // state of the ticket.
-    //
-    // Preconditions:
-    // - |initial_refs| must be at least 1
-    suspended_task::ticket obtain_ticket(ref_count initial_refs = 1);
+  // Obtains a new ticket with a ref-count of |initial_refs|.
+  // The executor must eventually call |finalize_ticket()| to update the
+  // state of the ticket.
+  //
+  // Preconditions:
+  // - |initial_refs| must be at least 1
+  suspended_task::ticket obtain_ticket(ref_count_type initial_refs = 1);
 
-    // Updates a ticket after one run of a task's continuation according
-    // to the state of the task after its run.  The executor must call this
-    // method after calling |obtain_ticket()| to indicate the disposition of
-    // the task for which the ticket was obtained.
-    //
-    // Passing an empty |task| indicates that the task has completed so it
-    // does not need to be resumed.
-    //
-    // Passing a non-empty |task| indicates that the task returned a pending
-    // result and may need to be suspended depending on the current state
-    // of the ticket.
-    // - If the ticket has already been resumed, moves |task| into the
-    //   runnable queue.
-    // - Otherwise, if the ticket still has a non-zero ref-count, moves |task|
-    //   into the suspended task table.
-    // - Otherwise, considers the task abandoned and the caller retains
-    //   ownership of |task|.
-    //
-    // Preconditions:
-    // - |task| must be non-null (may be empty)
-    // - the ticket must not have already been finalized
-    void finalize_ticket(suspended_task::ticket ticket, pending_task* task);
+  // Updates a ticket after one run of a task's continuation according
+  // to the state of the task after its run.  The executor must call this
+  // method after calling |obtain_ticket()| to indicate the disposition of
+  // the task for which the ticket was obtained.
+  //
+  // Passing an empty |task| indicates that the task has completed so it
+  // does not need to be resumed.
+  //
+  // Passing a non-empty |task| indicates that the task returned a pending
+  // result and may need to be suspended depending on the current state
+  // of the ticket.
+  // - If the ticket has already been resumed, moves |task| into the
+  //   runnable queue.
+  // - Otherwise, if the ticket still has a non-zero ref-count, moves |task|
+  //   into the suspended task table.
+  // - Otherwise, considers the task abandoned and the caller retains
+  //   ownership of |task|.
+  //
+  // Preconditions:
+  // - |task| must be non-null (may be empty)
+  // - the ticket must not have already been finalized
+  void finalize_ticket(suspended_task::ticket ticket, pending_task* task);
 
-    // Increments the ticket's ref-count.
-    //
-    // Preconditions:
-    // - the ticket's ref-count must be non-zero (positive)
-    void duplicate_ticket(suspended_task::ticket ticket);
+  // Increments the ticket's ref-count.
+  //
+  // Preconditions:
+  // - the ticket's ref-count must be non-zero (positive)
+  void duplicate_ticket(suspended_task::ticket ticket);
 
-    // Decrements the ticket's ref-count.
-    //
-    // If the task's ref-count reaches 0 and has an associated task that
-    // has not already been resumed, returns the associated task back
-    // to the caller.
-    // Otherwise, returns an empty task.
-    //
-    // Preconditions:
-    // - the ticket's ref-count must be non-zero (positive)
-    pending_task release_ticket(suspended_task::ticket ticket);
+  // Decrements the ticket's ref-count.
+  //
+  // If the task's ref-count reaches 0 and has an associated task that
+  // has not already been resumed, returns the associated task back
+  // to the caller.
+  // Otherwise, returns an empty task.
+  //
+  // Preconditions:
+  // - the ticket's ref-count must be non-zero (positive)
+  pending_task release_ticket(suspended_task::ticket ticket);
 
-    // Resumes a task and decrements the ticket's ref-count.
-    //
-    // If the ticket has an associated task that has not already been resumed,
-    // moves its associated task to the runnable queue and returns true.
-    // Otherwise, returns false.
-    //
-    // Preconditions:
-    // - the ticket's ref-count must be non-zero (positive)
-    bool resume_task_with_ticket(suspended_task::ticket ticket);
+  // Resumes a task and decrements the ticket's ref-count.
+  //
+  // If the ticket has an associated task that has not already been resumed,
+  // moves its associated task to the runnable queue and returns true.
+  // Otherwise, returns false.
+  //
+  // Preconditions:
+  // - the ticket's ref-count must be non-zero (positive)
+  bool resume_task_with_ticket(suspended_task::ticket ticket);
 
-    // Takes all tasks in the runnable queue.
-    //
-    // Preconditions:
-    // - |tasks| must be non-null and empty
-    void take_runnable_tasks(task_queue* tasks);
+  // Takes all tasks in the runnable queue.
+  //
+  // Preconditions:
+  // - |tasks| must be non-null and empty
+  void take_runnable_tasks(task_queue* tasks);
 
-    // Takes all remaining tasks, regardless of whether they are runnable
-    // or suspended.
-    //
-    // This operation is useful when shutting down an executor.
-    //
-    // Preconditions:
-    // - |tasks| must be non-null and empty
-    void take_all_tasks(task_queue* tasks);
+  // Takes all remaining tasks, regardless of whether they are runnable
+  // or suspended.
+  //
+  // This operation is useful when shutting down an executor.
+  //
+  // Preconditions:
+  // - |tasks| must be non-null and empty
+  void take_all_tasks(task_queue* tasks);
 
-    // Returns true if there are any runnable tasks.
-    bool has_runnable_tasks() const { return !runnable_tasks_.empty(); }
+  // Returns true if there are any runnable tasks.
+  bool has_runnable_tasks() const { return !runnable_tasks_.empty(); }
 
-    // Returns true if there are any suspended tasks that have yet to
-    // be resumed.
-    bool has_suspended_tasks() const { return suspended_task_count_ > 0; }
+  // Returns true if there are any suspended tasks that have yet to
+  // be resumed.
+  bool has_suspended_tasks() const { return suspended_task_count_ > 0; }
 
-    // Returns true if there are any tickets that have yet to be finalized,
-    // released, or resumed.
-    bool has_outstanding_tickets() const { return !tickets_.empty(); }
+  // Returns true if there are any tickets that have yet to be finalized,
+  // released, or resumed.
+  bool has_outstanding_tickets() const { return !tickets_.empty(); }
 
-    scheduler(const scheduler&) = delete;
-    scheduler(scheduler&&) = delete;
-    scheduler& operator=(const scheduler&) = delete;
-    scheduler& operator=(scheduler&&) = delete;
+  scheduler(const scheduler&) = delete;
+  scheduler(scheduler&&) = delete;
+  scheduler& operator=(const scheduler&) = delete;
+  scheduler& operator=(scheduler&&) = delete;
 
-private:
-    struct ticket_record {
-        ticket_record(ref_count initial_refs)
-            : ref_count(initial_refs), was_resumed(false) {}
+ private:
+  struct ticket_record {
+    ticket_record(ref_count_type initial_refs) : ref_count(initial_refs), was_resumed(false) {}
 
-        // The current reference count.
-        ref_count ref_count;
+    // The current reference count.
+    ref_count_type ref_count;
 
-        // True if the task has been resumed using |resume_task_with_ticket()|.
-        bool was_resumed;
+    // True if the task has been resumed using |resume_task_with_ticket()|.
+    bool was_resumed;
 
-        // The task is initially empty when the ticket is obtained.
-        // It is later set to non-empty if the task needs to be suspended when
-        // the ticket is finalized.  It becomes empty again when the task
-        // is moved into the runnable queue, released, or taken.
-        pending_task task;
-    };
-    using ticket_map = std::map<suspended_task::ticket, ticket_record>;
+    // The task is initially empty when the ticket is obtained.
+    // It is later set to non-empty if the task needs to be suspended when
+    // the ticket is finalized.  It becomes empty again when the task
+    // is moved into the runnable queue, released, or taken.
+    pending_task task;
+  };
+  using ticket_map = std::map<suspended_task::ticket, ticket_record>;
 
-    task_queue runnable_tasks_;
-    ticket_map tickets_;
-    uint64_t suspended_task_count_ = 0;
-    suspended_task::ticket next_ticket_ = 1;
+  task_queue runnable_tasks_;
+  ticket_map tickets_;
+  uint64_t suspended_task_count_ = 0;
+  suspended_task::ticket next_ticket_ = 1;
 };
 
-} // namespace subtle
-} // namespace fit
+}  // namespace subtle
+}  // namespace fit
 
-#endif // LIB_FIT_SCHEDULER_H_
+#endif  // LIB_FIT_SCHEDULER_H_
diff --git a/pkg/fit/include/lib/fit/scope.h b/pkg/fit/include/lib/fit/scope.h
new file mode 100644
index 0000000..21089b8
--- /dev/null
+++ b/pkg/fit/include/lib/fit/scope.h
@@ -0,0 +1,271 @@
+// 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.
+
+#ifndef LIB_FIT_SCOPE_H_
+#define LIB_FIT_SCOPE_H_
+
+#include <assert.h>
+
+#include <atomic>
+#include <mutex>
+
+#include "promise.h"
+#include "thread_safety.h"
+
+namespace fit {
+
+// Provides a mechanism for binding promises to the lifetime of another object
+// such that they are destroyed before that object goes out of scope.  It is
+// particularly useful for ensuring that the lifetime of a promise does not
+// exceed the lifetime of any variables that it has captured by reference.
+//
+// A scope is thread-safe but non-reentrant: it must not be destroyed while
+// any of its associated promises are running.
+//
+// EXAMPLE
+//
+// Define a |fit::scope| as a member of the object to whose lifetime the
+// promises should be bound.
+//
+//     // We mark this class final because its destructor has side-effects
+//     // that rely on the order of destruction.  If this object were
+//     // subclassed there would be a possibility for promises bound to its
+//     // scope to inadvertently access the subclass's state while the object
+//     // was being destroyed.
+//     class accumulator final {
+//     public:
+//         accumulator() = default;
+//         ~accumulator() = default;
+//
+//         fit::promise<int> accumulate(int value);
+//
+//     private:
+//         int prior_total_ = 0;
+//
+//         // This member is last so that the scope is exited before all
+//         // other members of the object are destroyed.  Alternately, we
+//         // could enforce this ordering by explicitly invoking
+//         // |fit::scope::exit()| where appropriate.
+//         fit::scope scope_;
+//     };
+//
+// Use |fit::promise::wrap_with()| to wrap up promises that capture pointers
+// to the object.  In this example, the captured pointer is "this".
+//
+//     fit::promise<int> accumulator::accumulate(int value) {
+//         return fit::make_promise([this, value] {
+//             prior_total_ += value;
+//             return fit::ok(prior_total_);
+//         }).wrap_with(scope_); /* binding to scope happens here */
+//     }
+//
+class scope final {
+ public:
+  // Creates a new scope.
+  scope();
+
+  // Exits the scope and destroys all of its wrapped promises.
+  // Asserts that no promises are currently running.
+  ~scope();
+
+  // Returns true if the scope has been exited.
+  //
+  // This method is thread-safe.
+  bool exited() const { return state_->exited(); }
+
+  // Exits the scope and destroys all of its wrapped promises.
+  // Assets that no promises are currently running.
+  //
+  // This method is thread-safe.
+  void exit() { return state_->exit(false /*scope_was_destroyed*/); }
+
+  // Returns a promise which wraps the specified |promise| and binds the
+  // promise to this scope.
+  //
+  // The specified promise will automatically be destroyed when its wrapper
+  // is destroyed or when the scope is exited.  If the scope has already
+  // exited then the wrapped promise will be immediately destroyed.
+  //
+  // When the returned promise is invoked before the scope is exited,
+  // the promise that it wraps will be invoked as usual.  However, when
+  // the returned promise is invoked after the scope is exited, it
+  // immediately returns a pending result (since the promise that it
+  // previously wrapped has already been destroyed).  By returning a
+  // pending result, the return promise effectively indicates to the
+  // executor that the task has been "abandoned" due to the scope being
+  // exited.
+  //
+  // This method is thread-safe.
+  template <typename Promise>
+  decltype(auto) wrap(Promise promise) {
+    assert(promise);
+    return fit::make_promise_with_continuation(scoped_continuation<Promise>(
+        state_->adopt_promise(new promise_holder<Promise>(std::move(promise)))));
+  }
+
+  scope(const scope&) = delete;
+  scope(scope&&) = delete;
+  scope& operator=(const scope&) = delete;
+  scope& operator=(scope&&) = delete;
+
+ private:
+  class state;
+  class promise_holder_base;
+
+  // Holds a reference to a promise that is owned by the state.
+  class promise_handle final {
+   public:
+    promise_handle() = default;
+
+   private:
+    // |state| and |promise_holder| belong to the state object.
+    // Invariant: If |promise_holder| is non-null then |state| is
+    // also non-null.
+    friend state;
+    promise_handle(state* state, promise_holder_base* promise_holder)
+        : state_(state), promise_holder_(promise_holder) {}
+
+    state* state_ = nullptr;
+    promise_holder_base* promise_holder_ = nullptr;
+  };
+
+  // Holds the shared state of the scope.
+  // This object is destroyed once the scope and all of its promises
+  // have been destroyed.
+  class state final {
+   public:
+    state();
+    ~state();
+
+    // The following methods are called from the |scope|.
+
+    bool exited() const;
+    void exit(bool scope_was_destroyed);
+
+    // The following methods are called from the |scoped_continuation|.
+
+    // Links a promise to the scope's lifecycle such that it will be
+    // destroyed when the scope is exited.  Returns a handle that may
+    // be used to access the promise later.
+    // The state takes ownership of the promise.
+    promise_handle adopt_promise(promise_holder_base* promise_holder);
+
+    // Unlinks a promise from the scope's lifecycle given its handle
+    // and causes the underlying promise to be destroyed if it hasn't
+    // already been destroyed due to the scope exiting.
+    // Does nothing if the handle was default-initialized.
+    static void drop_promise(promise_handle promise_handle);
+
+    // Acquires a promise given its handle.
+    // Returns nullptr if the handle was default-initialized or if
+    // the scope exited, meaning that the promise was not acquired.
+    // The promise must be released before it can be acquired again.
+    static promise_holder_base* try_acquire_promise(promise_handle promise_handle);
+
+    // Releases a promise that was successfully acquired.
+    static void release_promise(promise_handle promise_handle);
+
+    state(const state&) = delete;
+    state(state&&) = delete;
+    state& operator=(const state&) = delete;
+    state& operator=(state&&) = delete;
+
+   private:
+    bool should_delete_self() const FIT_REQUIRES(mutex_) {
+      return scope_was_destroyed_ && promise_handle_count_ == 0;
+    }
+
+    static constexpr uint64_t scope_exited = static_cast<uint64_t>(1u) << 63;
+
+    // Tracks of the number of promises currently running ("acquired").
+    // The top bit is set when the scope is exited, at which point no
+    // new promises can be acquired.  After exiting, the count can
+    // be incremented transiently but is immediately decremented again
+    // until all promise handles have been released.  Once no promise
+    // handles remain, the count will equal |scope_exited| and will not
+    // change again.
+    std::atomic_uint64_t acquired_promise_count_{0};
+
+    mutable std::mutex mutex_;
+    bool scope_was_destroyed_ FIT_GUARDED(mutex_) = false;
+    uint64_t promise_handle_count_ FIT_GUARDED(mutex_) = 0;
+    promise_holder_base* head_promise_holder_ FIT_GUARDED(mutex_) = nullptr;
+  };
+
+  // Base type for managing the lifetime of a promise of any type.
+  // It is owned by the state and retained indirectly by the continuation
+  // using a |promise_handle|.
+  class promise_holder_base {
+   public:
+    promise_holder_base() = default;
+    virtual ~promise_holder_base() = default;
+
+    promise_holder_base(const promise_holder_base&) = delete;
+    promise_holder_base(promise_holder_base&&) = delete;
+    promise_holder_base& operator=(const promise_holder_base&) = delete;
+    promise_holder_base& operator=(promise_holder_base&&) = delete;
+
+   private:
+    // |next| and |prev| belong to the state object.
+    friend class state;
+    promise_holder_base* next = nullptr;
+    promise_holder_base* prev = nullptr;
+  };
+
+  // Holder for a promise of a particular type.
+  template <typename Promise>
+  class promise_holder final : public promise_holder_base {
+   public:
+    explicit promise_holder(Promise promise) : promise(std::move(promise)) {}
+    ~promise_holder() override = default;
+
+    Promise promise;
+  };
+
+  // Wraps a promise whose lifetime is managed by the scope.
+  template <typename Promise>
+  class scoped_continuation final {
+   public:
+    explicit scoped_continuation(promise_handle promise_handle) : promise_handle_(promise_handle) {}
+
+    scoped_continuation(scoped_continuation&& other) : promise_handle_(other.promise_handle_) {
+      other.promise_handle_ = promise_handle{};
+    }
+
+    ~scoped_continuation() { state::drop_promise(promise_handle_); }
+
+    typename Promise::result_type operator()(context& context) {
+      typename Promise::result_type result;
+      auto holder =
+          static_cast<promise_holder<Promise>*>(state::try_acquire_promise(promise_handle_));
+      if (holder) {
+        result = holder->promise(context);
+        state::release_promise(promise_handle_);
+      }
+      return result;
+    }
+
+    scoped_continuation& operator=(scoped_continuation&& other) {
+      if (this != &other) {
+        state::drop_promise(promise_handle_);
+        promise_handle_ = other.promise_handle_;
+        other.promise_handle_ = promise_handle{};
+      }
+      return *this;
+    }
+
+    scoped_continuation(const scoped_continuation&) = delete;
+    scoped_continuation& operator=(const scoped_continuation&) = delete;
+
+   private:
+    promise_handle promise_handle_;
+  };
+
+  // The scope's shared state.
+  state* const state_;
+};
+
+}  // namespace fit
+
+#endif  // LIB_FIT_SCOPE_H_
diff --git a/pkg/fit/include/lib/fit/sequencer.h b/pkg/fit/include/lib/fit/sequencer.h
index 509cd8e..888df7b 100644
--- a/pkg/fit/include/lib/fit/sequencer.h
+++ b/pkg/fit/include/lib/fit/sequencer.h
@@ -33,53 +33,52 @@
 //     // sequential work with the sequencer.
 //     fit::promise<> perform_complex_task() {
 //         return fit::make_promise([] { /* do sequential work */ })
-//             .then([] (fit::result<> result) { /* this will also be wrapped */ })
+//             .then([] (fit::result<>& result) { /* this will also be wrapped */ })
 //             .wrap_with(seq)
-//             .then([] (fit::result<> result) { /* do more work */ });
+//             .then([] (fit::result<>& result) { /* do more work */ });
 //     }
 //
 class sequencer final {
-public:
-    sequencer();
-    ~sequencer();
+ public:
+  sequencer();
+  ~sequencer();
 
-    // Returns a new promise which will invoke |promise| after all previously
-    // enqueued promises on this sequencer have completed or been abandoned.
-    //
-    // This method is thread-safe.
-    template <typename Promise>
-    decltype(auto) wrap(Promise promise) {
-        assert(promise);
+  // Returns a new promise which will invoke |promise| after all previously
+  // enqueued promises on this sequencer have completed or been abandoned.
+  //
+  // This method is thread-safe.
+  template <typename Promise>
+  decltype(auto) wrap(Promise promise) {
+    assert(promise);
 
-        fit::bridge<> bridge;
-        fit::consumer<> prior = swap_prior(std::move(bridge.consumer()));
-        return prior.promise_or(fit::ok())
-            .then([promise = std::move(promise),
-                   completer = std::move(bridge.completer())](
-                      fit::context& context, fit::result<>) mutable {
-                // This handler will run once the completer associated
-                // with the |prior| promise is abandoned.  Once the promise
-                // has finished, both the promise and completer will be
-                // destroyed thereby causing the next promise chained onto
-                // the |bridge|'s associated consumer to become runnable.
-                return promise(context);
-            });
-    }
+    fit::bridge<> bridge;
+    fit::consumer<> prior = swap_prior(std::move(bridge.consumer));
+    return prior.promise_or(fit::ok()).then(
+        [promise = std::move(promise), completer = std::move(bridge.completer)](
+            fit::context& context, const fit::result<>&) mutable {
+          // This handler will run once the completer associated
+          // with the |prior| promise is abandoned.  Once the promise
+          // has finished, both the promise and completer will be
+          // destroyed thereby causing the next promise chained onto
+          // the |bridge|'s associated consumer to become runnable.
+          return promise(context);
+        });
+  }
 
-    sequencer(const sequencer&) = delete;
-    sequencer(sequencer&&) = delete;
-    sequencer& operator=(const sequencer&) = delete;
-    sequencer& operator=(sequencer&&) = delete;
+  sequencer(const sequencer&) = delete;
+  sequencer(sequencer&&) = delete;
+  sequencer& operator=(const sequencer&) = delete;
+  sequencer& operator=(sequencer&&) = delete;
 
-private:
-    fit::consumer<> swap_prior(fit::consumer<> new_prior);
+ private:
+  fit::consumer<> swap_prior(fit::consumer<> new_prior);
 
-    std::mutex mutex_;
+  std::mutex mutex_;
 
-    // Holds the consumption capability of the most recently wrapped promise.
-    fit::consumer<> prior_ FIT_GUARDED(mutex_);
+  // Holds the consumption capability of the most recently wrapped promise.
+  fit::consumer<> prior_ FIT_GUARDED(mutex_);
 };
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_SEQUENCER_H_
+#endif  // LIB_FIT_SEQUENCER_H_
diff --git a/pkg/fit/include/lib/fit/single_threaded_executor.h b/pkg/fit/include/lib/fit/single_threaded_executor.h
index 7ec4875..826df83 100644
--- a/pkg/fit/include/lib/fit/single_threaded_executor.h
+++ b/pkg/fit/include/lib/fit/single_threaded_executor.h
@@ -20,66 +20,65 @@
 //
 // See documentation of |fit::promise| for more information.
 class single_threaded_executor final : public executor {
-public:
-    single_threaded_executor();
+ public:
+  single_threaded_executor();
 
-    // Destroys the executor along with all of its remaining scheduled tasks
-    // that have yet to complete.
-    ~single_threaded_executor() override;
+  // Destroys the executor along with all of its remaining scheduled tasks
+  // that have yet to complete.
+  ~single_threaded_executor() override;
 
-    // Schedules a task for eventual execution by the executor.
-    //
-    // This method is thread-safe.
-    void schedule_task(pending_task task) override;
+  // Schedules a task for eventual execution by the executor.
+  //
+  // This method is thread-safe.
+  void schedule_task(pending_task task) override;
 
-    // Runs all scheduled tasks (including additional tasks scheduled while
-    // they run) until none remain.
-    //
-    // This method is thread-safe but must only be called on at most one
-    // thread at a time.
-    void run();
+  // Runs all scheduled tasks (including additional tasks scheduled while
+  // they run) until none remain.
+  //
+  // This method is thread-safe but must only be called on at most one
+  // thread at a time.
+  void run();
 
-    single_threaded_executor(const single_threaded_executor&) = delete;
-    single_threaded_executor(single_threaded_executor&&) = delete;
-    single_threaded_executor& operator=(const single_threaded_executor&) = delete;
-    single_threaded_executor& operator=(single_threaded_executor&&) = delete;
+  single_threaded_executor(const single_threaded_executor&) = delete;
+  single_threaded_executor(single_threaded_executor&&) = delete;
+  single_threaded_executor& operator=(const single_threaded_executor&) = delete;
+  single_threaded_executor& operator=(single_threaded_executor&&) = delete;
 
-private:
-    class dispatcher_impl;
+ private:
+  class dispatcher_impl;
 
-    // The task context for tasks run by the executor.
-    class context_impl final : public context {
-    public:
-        explicit context_impl(single_threaded_executor* executor);
-        ~context_impl() override;
+  // The task context for tasks run by the executor.
+  class context_impl final : public context {
+   public:
+    explicit context_impl(single_threaded_executor* executor);
+    ~context_impl() override;
 
-        single_threaded_executor* executor() const override;
-        suspended_task suspend_task() override;
+    single_threaded_executor* executor() const override;
+    suspended_task suspend_task() override;
 
-    private:
-        single_threaded_executor* const executor_;
-    };
+   private:
+    single_threaded_executor* const executor_;
+  };
 
-    context_impl context_;
-    dispatcher_impl* const dispatcher_;
+  context_impl context_;
+  dispatcher_impl* const dispatcher_;
 };
 
 // Creates a new |fit::single_threaded_executor|, schedules a promise as a task,
 // runs all of the executor's scheduled tasks until none remain, then returns
 // the promise's result.
 template <typename Continuation>
-static typename promise_impl<Continuation>::result_type
-run_single_threaded(promise_impl<Continuation> promise) {
-    using result_type = typename promise_impl<Continuation>::result_type;
-    single_threaded_executor exec;
-    result_type saved_result;
-    exec.schedule_task(promise.then([&saved_result](result_type result) {
-        saved_result = std::move(result);
-    }));
-    exec.run();
-    return saved_result;
+static typename promise_impl<Continuation>::result_type run_single_threaded(
+    promise_impl<Continuation> promise) {
+  using result_type = typename promise_impl<Continuation>::result_type;
+  single_threaded_executor exec;
+  result_type saved_result;
+  exec.schedule_task(
+      promise.then([&saved_result](result_type& result) { saved_result = std::move(result); }));
+  exec.run();
+  return saved_result;
 }
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_SINGLE_THREADED_EXECUTOR_H_
+#endif  // LIB_FIT_SINGLE_THREADED_EXECUTOR_H_
diff --git a/pkg/fit/include/lib/fit/source_location.h b/pkg/fit/include/lib/fit/source_location.h
new file mode 100644
index 0000000..b723621
--- /dev/null
+++ b/pkg/fit/include/lib/fit/source_location.h
@@ -0,0 +1,102 @@
+// Copyright 2020 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.
+
+#ifndef LIB_FIT_SOURCE_LOCATION_H_
+#define LIB_FIT_SOURCE_LOCATION_H_
+
+#if __cplusplus > 201703L
+#include <version>
+#endif
+
+#if defined(__cpp_lib_source_location) && __cpp_lib_source_location && \
+    !defined(FORCE_FIT_SOURCE_LOCATION)
+
+// In C++20 fit::source_location should simply be an alias for std::source_location.
+
+#include <source_location>
+
+namespace fit {
+
+using std::source_location;
+
+}  // namespace fit
+
+#else
+
+#include <cstdint>
+
+namespace fit {
+
+// Polyfill implementation of std::source_location.
+class source_location {
+  struct values {
+    constexpr explicit values(std::uint_least32_t line, std::uint_least32_t column,
+                              const char* file_name, const char* function_name)
+        : line{line}, column{column}, file_name{file_name}, function_name{function_name} {}
+
+    std::uint_least32_t line;
+    std::uint_least32_t column;
+    const char* file_name;
+    const char* function_name;
+  };
+
+ public:
+  constexpr source_location() noexcept {}  // LLVM bug 36684
+  source_location(const source_location& other) = default;
+  source_location(source_location&& other) noexcept = default;
+  ~source_location() = default;
+
+#define LIB_FIT_SOURCE_LOCATION_LINE (0)
+#define LIB_FIT_SOURCE_LOCATION_COLUMN (0)
+#define LIB_FIT_SOURCE_LOCATION_FILE ("")
+#define LIB_FIT_SOURCE_LOCATION_FUNCTION ("")
+
+#if defined(__has_builtin)
+#if __has_builtin(__builtin_LINE)
+#undef LIB_FIT_SOURCE_LOCATION_LINE
+#define LIB_FIT_SOURCE_LOCATION_LINE (__builtin_LINE())
+#endif
+#if __has_builtin(__builtin_COLUMN)
+#undef LIB_FIT_SOURCE_LOCATION_COLUMN
+#define LIB_FIT_SOURCE_LOCATION_COLUMN (__builtin_COLUMN())
+#endif
+#if __has_builtin(__builtin_FILE)
+#undef LIB_FIT_SOURCE_LOCATION_FILE
+#define LIB_FIT_SOURCE_LOCATION_FILE (__builtin_FILE())
+#endif
+#if __has_builtin(__builtin_FUNCTION)
+#undef LIB_FIT_SOURCE_LOCATION_FUNCTION
+#define LIB_FIT_SOURCE_LOCATION_FUNCTION (__builtin_FUNCTION())
+#endif
+#endif
+
+  static constexpr source_location current(
+      values value = values{LIB_FIT_SOURCE_LOCATION_LINE, LIB_FIT_SOURCE_LOCATION_COLUMN,
+                            LIB_FIT_SOURCE_LOCATION_FILE, LIB_FIT_SOURCE_LOCATION_FUNCTION}) {
+    return source_location{value};
+  }
+
+#undef LIB_FIT_SOURCE_LOCATION_LINE
+#undef LIB_FIT_SOURCE_LOCATION_COLUMN
+#undef LIB_FIT_SOURCE_LOCATION_FILE
+#undef LIB_FIT_SOURCE_LOCATION_FUNCTION
+
+  constexpr std::uint_least32_t line() const noexcept { return values_.line; }
+
+  constexpr std::uint_least32_t column() const noexcept { return values_.column; }
+
+  constexpr const char* file_name() const noexcept { return values_.file_name; }
+
+  constexpr const char* function_name() const noexcept { return values_.function_name; }
+
+ private:
+  constexpr explicit source_location(values values) : values_{values} {}
+
+  values values_{0, 0, "", ""};
+};
+
+}  // namespace fit
+
+#endif
+
+#endif  // LIB_FIT_SOURCE_LOCATION_H_
diff --git a/pkg/fit/include/lib/fit/storage_internal.h b/pkg/fit/include/lib/fit/storage_internal.h
new file mode 100644
index 0000000..8986772
--- /dev/null
+++ b/pkg/fit/include/lib/fit/storage_internal.h
@@ -0,0 +1,846 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_STORAGE_INTERNAL_H_
+#define LIB_FIT_STORAGE_INTERNAL_H_
+
+#include <cstdint>
+#include <limits>
+#include <type_traits>
+
+#include "utility_internal.h"
+
+namespace fit {
+namespace internal {
+
+// Type tag to select overloads based on type T.
+template <typename T>
+struct type_tag {
+  using type = T;
+};
+
+// Type tag to select overloads based on index Index.
+template <size_t Index>
+struct index_tag {
+  static constexpr size_t index = Index;
+};
+
+// Type tag to select trivial initialization.
+enum trivial_init_t { trivial_init_v };
+
+// Type tag to select default initialization.
+enum default_init_t { default_init_v };
+
+// Type tag to select conditional initialization.
+enum maybe_init_t { maybe_init_v };
+
+// Represents the pair (T, Index) in the type system.
+template <typename T, size_t Index>
+struct type_index {};
+
+// Represents whether a type is trivially/non-trivially destructible.
+enum class destructor_class {
+  trivial,
+  non_trivial,
+};
+
+// Represents whether a type is trivially/non-trivially copyable.
+enum class copy_class {
+  trivial,
+  non_trivial,
+};
+
+// Represents whether a type is trivially/non-trivially movable.
+enum class move_class {
+  trivial,
+  non_trivial,
+};
+
+// Represents the full complement of move/copy/destruct classes for a type.
+template <destructor_class DestructorClass, copy_class CopyClass, move_class MoveClass>
+struct storage_class {};
+
+template <typename... Ts>
+using make_storage_class =
+    storage_class<is_trivially_destructible_v<Ts...> ? destructor_class::trivial
+                                                     : destructor_class::non_trivial,
+                  is_trivially_copyable_v<Ts...> ? copy_class::trivial : copy_class::non_trivial,
+                  is_trivially_movable_v<Ts...> ? move_class::trivial : move_class::non_trivial>;
+
+// A trivial type for the empty alternative of union-based storage.
+struct empty_type {};
+
+// Index type used to track the active variant. Tracking uses zero-based
+// indices. Empty is denoted by the maximum representable value.
+using index_type = size_t;
+
+// Index denoting that no user-specified variant is active. Take care not to
+// ODR-use this value.
+constexpr index_type empty_index = std::numeric_limits<index_type>::max();
+
+#ifdef NDEBUG
+#define FIT_INTERNAL_UNREACHABLE_OR_ABORT __builtin_unreachable
+#else
+#define FIT_INTERNAL_UNREACHABLE_OR_ABORT __builtin_abort
+#endif
+
+// Base type for lazy-initialized union storage types. This type implements a
+// recursive union of the element types in Ts. Specializations handle the
+// recursive and terminal cases, and the different storage requirements for
+// trivially/non-trivially destructible types.
+template <destructor_class, typename...>
+union storage_base;
+
+// Non-trivial terminal case.
+template <>
+union storage_base<destructor_class::non_trivial, type_index<empty_type, empty_index>> {
+  storage_base() : empty{} {}
+
+  template <typename... Args>
+  storage_base(type_tag<empty_type>, Args&&...) : empty{} {}
+  template <typename... Args>
+  storage_base(index_tag<empty_index>, Args&&...) : empty{} {}
+
+  // Non-trivial destructor.
+  ~storage_base() {}
+
+  storage_base(const storage_base&) = default;
+  storage_base(storage_base&&) = default;
+  storage_base& operator=(const storage_base&) = default;
+  storage_base& operator=(storage_base&&) = default;
+
+  void construct_at(size_t index, const storage_base&) {
+    if (index == empty_index) {
+      new (&empty) empty_type{};
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+  void construct_at(size_t index, storage_base&&) {
+    if (index == empty_index) {
+      new (&empty) empty_type{};
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  void assign_at(size_t index, const storage_base& other) {
+    if (index == empty_index) {
+      empty = other.empty;
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+  void assign_at(size_t index, storage_base&& other) {
+    if (index == empty_index) {
+      empty = std::move(other.empty);
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  void swap_at(size_t index, storage_base& other) {
+    if (index == empty_index) {
+      using std::swap;
+      swap(empty, other.empty);
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  template <typename... Args>
+  size_t construct(type_tag<empty_type>, Args&&...) {
+    new (&empty) empty_type{};
+    return empty_index;
+  }
+  template <typename... Args>
+  size_t construct(index_tag<empty_index>, Args&&...) {
+    new (&empty) empty_type{};
+    return empty_index;
+  }
+
+  void reset(size_t index) {
+    if (index == empty_index) {
+      empty.empty_type::~empty_type();
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  empty_type& get(type_tag<empty_type>) { return empty; }
+  const empty_type& get(type_tag<empty_type>) const { return empty; }
+  empty_type& get(index_tag<empty_index>) { return empty; }
+  const empty_type& get(index_tag<empty_index>) const { return empty; }
+
+  size_t index(type_tag<empty_type>) const { return empty_index; }
+
+  template <typename V>
+  bool visit(size_t, V&&) {
+    return false;
+  }
+  template <typename V>
+  bool visit(size_t, V&&) const {
+    return false;
+  }
+
+  empty_type empty;
+};
+
+// Trivial terminal case.
+template <>
+union storage_base<destructor_class::trivial, type_index<empty_type, empty_index>> {
+  constexpr storage_base() : empty{} {}
+
+  template <typename... Args>
+  constexpr storage_base(type_tag<empty_type>, Args&&...) : empty{} {}
+  template <typename... Args>
+  constexpr storage_base(index_tag<empty_index>, Args&&...) : empty{} {}
+
+  // Trivial destructor.
+  ~storage_base() = default;
+
+  constexpr storage_base(const storage_base&) = default;
+  constexpr storage_base(storage_base&&) = default;
+  constexpr storage_base& operator=(const storage_base&) = default;
+  constexpr storage_base& operator=(storage_base&&) = default;
+
+  constexpr void construct_at(size_t index, const storage_base&) {
+    if (index == empty_index) {
+      new (&empty) empty_type{};
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+  constexpr void construct_at(size_t index, storage_base&&) {
+    if (index == empty_index) {
+      new (&empty) empty_type{};
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  constexpr void assign_at(size_t index, const storage_base& other) {
+    if (index == empty_index) {
+      empty = other.empty;
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+  constexpr void assign_at(size_t index, storage_base&& other) {
+    if (index == empty_index) {
+      empty = std::move(other.empty);
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  constexpr void swap_at(size_t index, storage_base& other) {
+    if (index == empty_index) {
+      using std::swap;
+      swap(empty, other.empty);
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  template <typename... Args>
+  constexpr size_t construct(type_tag<empty_type>, Args&&...) {
+    new (&empty) empty_type{};
+    return empty_index;
+  }
+  template <typename... Args>
+  constexpr size_t construct(index_tag<empty_index>, Args&&...) {
+    new (&empty) empty_type{};
+    return empty_index;
+  }
+
+  constexpr void reset(size_t index) {
+    if (index == empty_index) {
+      empty.empty_type::~empty_type();
+    } else {
+      FIT_INTERNAL_UNREACHABLE_OR_ABORT();
+    }
+  }
+
+  constexpr empty_type& get(type_tag<empty_type>) { return empty; }
+  constexpr const empty_type& get(type_tag<empty_type>) const { return empty; }
+  constexpr empty_type& get(index_tag<empty_index>) { return empty; }
+  constexpr const empty_type& get(index_tag<empty_index>) const { return empty; }
+
+  constexpr size_t index(type_tag<empty_type>) const { return empty_index; }
+
+  template <typename V>
+  constexpr bool visit(size_t, V&&) {
+    return false;
+  }
+  template <typename V>
+  constexpr bool visit(size_t, V&&) const {
+    return false;
+  }
+
+  empty_type empty;
+};
+
+template <typename T, size_t Index, typename... Ts, size_t... Is>
+union storage_base<destructor_class::non_trivial, type_index<T, Index>, type_index<Ts, Is>...> {
+  storage_base() : empty{} {}
+
+  template <typename... Args>
+  storage_base(type_tag<T>, Args&&... args) : value(std::forward<Args>(args)...) {}
+  template <typename... Args>
+  storage_base(index_tag<Index>, Args&&... args) : value(std::forward<Args>(args)...) {}
+
+  template <typename U, typename... Args>
+  storage_base(type_tag<U>, Args&&... args) : rest(type_tag<U>{}, std::forward<Args>(args)...) {}
+  template <size_t OtherIndex, typename... Args>
+  storage_base(index_tag<OtherIndex>, Args&&... args)
+      : rest(index_tag<OtherIndex>{}, std::forward<Args>(args)...) {}
+
+  // Non-trivial destructor.
+  ~storage_base() {}
+
+  // Trival copy/move construction and assignment.
+  storage_base(const storage_base&) = default;
+  storage_base(storage_base&&) = default;
+  storage_base& operator=(const storage_base&) = default;
+  storage_base& operator=(storage_base&&) = default;
+
+  void construct_at(size_t index, const storage_base& other) {
+    if (index == Index) {
+      new (&value) T{other.value};
+    } else {
+      rest.construct_at(index, other.rest);
+    }
+  }
+  void construct_at(size_t index, storage_base&& other) {
+    if (index == Index) {
+      new (&value) T{std::move(other.value)};
+    } else {
+      rest.construct_at(index, std::move(other.rest));
+    }
+  }
+
+  void assign_at(size_t index, const storage_base& other) {
+    if (index == Index) {
+      value = other.value;
+    } else {
+      rest.assign_at(index, other.rest);
+    }
+  }
+  void assign_at(size_t index, storage_base&& other) {
+    if (index == Index) {
+      value = std::move(other.value);
+    } else {
+      rest.assign_at(index, std::move(other.rest));
+    }
+  }
+
+  void swap_at(size_t index, storage_base& other) {
+    if (index == Index) {
+      using std::swap;
+      swap(value, other.value);
+    } else {
+      rest.swap_at(index, other.rest);
+    }
+  }
+
+  template <typename... Args>
+  size_t construct(type_tag<T>, Args&&... args) {
+    new (&value) T(std::forward<Args>(args)...);
+    return Index;
+  }
+  template <typename U, typename... Args>
+  size_t construct(type_tag<U>, Args&&... args) {
+    return rest.construct(type_tag<U>{}, std::forward<Args>(args)...);
+  }
+  template <typename... Args>
+  size_t construct(index_tag<Index>, Args&&... args) {
+    new (&value) T(std::forward<Args>(args)...);
+    return Index;
+  }
+  template <size_t OtherIndex, typename... Args>
+  size_t construct(index_tag<OtherIndex>, Args&&... args) {
+    return rest.construct(index_tag<OtherIndex>{}, std::forward<Args>(args)...);
+  }
+
+  void reset(size_t index) {
+    if (index == Index) {
+      value.~T();
+    } else {
+      rest.reset(index);
+    }
+  }
+
+  T& get(type_tag<T>) { return value; }
+  const T& get(type_tag<T>) const { return value; }
+  template <typename U>
+  U& get(type_tag<U>) {
+    return rest.get(type_tag<U>{});
+  }
+  template <typename U>
+  const U& get(type_tag<U>) const {
+    return rest.get(type_tag<U>{});
+  }
+  T& get(index_tag<Index>) { return value; }
+  const T& get(index_tag<Index>) const { return value; }
+  template <size_t OtherIndex>
+  auto& get(index_tag<OtherIndex>) {
+    return rest.get(index_tag<OtherIndex>{});
+  }
+  template <size_t OtherIndex>
+  const auto& get(index_tag<OtherIndex>) const {
+    return rest.get(index_tag<OtherIndex>{});
+  }
+
+  size_t index(type_tag<T>) const { return Index; }
+  template <typename U>
+  size_t index(type_tag<U>) const {
+    return rest.index(type_tag<U>{});
+  }
+
+  template <typename V>
+  bool visit(size_t index, V&& visitor) {
+    if (index == Index) {
+      std::forward<V>(visitor)(type_tag<T>{}, index_tag<Index>{}, this);
+      return true;
+    } else {
+      return rest.visit(index, std::forward<V>(visitor));
+    }
+  }
+  template <typename V>
+  bool visit(size_t index, V&& visitor) const {
+    if (index == Index) {
+      std::forward<V>(visitor)(type_tag<T>{}, index_tag<Index>{}, this);
+      return true;
+    } else {
+      return rest.visit(index, std::forward<V>(visitor));
+    }
+  }
+
+  empty_type empty;
+  T value;
+  storage_base<destructor_class::non_trivial, type_index<Ts, Is>...> rest;
+};
+
+template <typename T, size_t Index, typename... Ts, size_t... Is>
+union storage_base<destructor_class::trivial, type_index<T, Index>, type_index<Ts, Is>...> {
+  constexpr storage_base() : empty{} {}
+
+  template <typename... Args>
+  constexpr storage_base(type_tag<T>, Args&&... args) : value(std::forward<Args>(args)...) {}
+  template <typename... Args>
+  constexpr storage_base(index_tag<Index>, Args&&... args) : value(std::forward<Args>(args)...) {}
+
+  template <typename U, typename... Args>
+  constexpr storage_base(type_tag<U>, Args&&... args)
+      : rest(type_tag<U>{}, std::forward<Args>(args)...) {}
+  template <size_t OtherIndex, typename... Args>
+  constexpr storage_base(index_tag<OtherIndex>, Args&&... args)
+      : rest(index_tag<OtherIndex>{}, std::forward<Args>(args)...) {}
+
+  // Trivial destructor.
+  ~storage_base() = default;
+
+  // Trival copy/move construction and assignment.
+  constexpr storage_base(const storage_base&) = default;
+  constexpr storage_base(storage_base&&) = default;
+  constexpr storage_base& operator=(const storage_base&) = default;
+  constexpr storage_base& operator=(storage_base&&) = default;
+
+  constexpr void construct_at(size_t index, const storage_base& other) {
+    if (index == Index) {
+      new (&value) T{other.value};
+    } else {
+      rest.construct_at(index, other.rest);
+    }
+  }
+  constexpr void construct_at(size_t index, storage_base&& other) {
+    if (index == Index) {
+      new (&value) T{std::move(other.value)};
+    } else {
+      rest.construct_at(index, std::move(other.rest));
+    }
+  }
+
+  constexpr void assign_at(size_t index, const storage_base& other) {
+    if (index == Index) {
+      value = other.value;
+    } else {
+      rest.assign_at(index, other.rest);
+    }
+  }
+  constexpr void assign_at(size_t index, storage_base&& other) {
+    if (index == Index) {
+      value = std::move(other.value);
+    } else {
+      rest.assign_at(index, std::move(other.rest));
+    }
+  }
+
+  constexpr void swap_at(size_t index, storage_base& other) {
+    if (index == Index) {
+      using std::swap;
+      swap(value, other.value);
+    } else {
+      rest.swap_at(index, other.rest);
+    }
+  }
+
+  template <typename... Args>
+  constexpr size_t construct(type_tag<T>, Args&&... args) {
+    new (&value) T(std::forward<Args>(args)...);
+    return Index;
+  }
+  template <typename U, typename... Args>
+  constexpr size_t construct(type_tag<U>, Args&&... args) {
+    return rest.construct(type_tag<U>{}, std::forward<Args>(args)...);
+  }
+  template <typename... Args>
+  constexpr size_t construct(index_tag<Index>, Args&&... args) {
+    new (&value) T(std::forward<Args>(args)...);
+    return Index;
+  }
+  template <size_t OtherIndex, typename... Args>
+  constexpr size_t construct(index_tag<OtherIndex>, Args&&... args) {
+    return rest.construct(index_tag<OtherIndex>{}, std::forward<Args>(args)...);
+  }
+
+  constexpr void reset(size_t) {}
+
+  constexpr T& get(type_tag<T>) { return value; }
+  constexpr const T& get(type_tag<T>) const { return value; }
+  template <typename U>
+  constexpr U& get(type_tag<U>) {
+    return rest.get(type_tag<U>{});
+  }
+  template <typename U>
+  constexpr const U& get(type_tag<U>) const {
+    return rest.get(type_tag<U>{});
+  }
+  constexpr T& get(index_tag<Index>) { return value; }
+  constexpr const T& get(index_tag<Index>) const { return value; }
+  template <size_t OtherIndex>
+  constexpr auto& get(index_tag<OtherIndex>) {
+    return rest.get(index_tag<OtherIndex>{});
+  }
+  template <size_t OtherIndex>
+  constexpr const auto& get(index_tag<OtherIndex>) const {
+    return rest.get(index_tag<OtherIndex>{});
+  }
+
+  constexpr size_t index(type_tag<T>) const { return Index; }
+  template <typename U>
+  constexpr size_t index(type_tag<U>) const {
+    return rest.index(type_tag<U>{});
+  }
+
+  template <typename V>
+  constexpr bool visit(size_t index, V&& visitor) {
+    if (index == Index) {
+      std::forward<V>(visitor)(type_tag<T>{}, index_tag<Index>{}, this);
+      return true;
+    } else {
+      return rest.visit(index, std::forward<V>(visitor));
+    }
+  }
+  template <typename V>
+  constexpr bool visit(size_t index, V&& visitor) const {
+    if (index == Index) {
+      std::forward<V>(visitor)(type_tag<T>{}, index_tag<Index>{}, this);
+      return true;
+    } else {
+      return rest.visit(index, std::forward<V>(visitor));
+    }
+  }
+
+  empty_type empty;
+  T value;
+  storage_base<destructor_class::trivial, type_index<Ts, Is>...> rest;
+};
+
+// Lazy-initialized union storage type that tracks the index of the active
+// variant.
+template <destructor_class, typename...>
+class indexed_storage;
+
+template <destructor_class DestructorClass, typename... Ts, size_t... Is>
+class indexed_storage<DestructorClass, type_index<Ts, Is>...> {
+ private:
+  using base_type =
+      storage_base<DestructorClass, type_index<Ts, Is>..., type_index<empty_type, empty_index>>;
+
+ public:
+  static constexpr bool nothrow_default_constructible =
+      std::is_nothrow_default_constructible<first_t<Ts...>>::value;
+  static constexpr bool nothrow_move_constructible =
+      conjunction_v<std::is_nothrow_move_constructible<Ts>...>;
+  static constexpr bool nothrow_move_assignable =
+      conjunction_v<std::is_nothrow_move_assignable<Ts>...>;
+
+  constexpr indexed_storage() = default;
+
+  constexpr indexed_storage(trivial_init_t) : indexed_storage{} {}
+
+  constexpr indexed_storage(default_init_t) : index_{0}, base_{index_tag<0>{}} {}
+
+  // Only used by trivial copy/move types.
+  constexpr indexed_storage(const indexed_storage& other) = default;
+  constexpr indexed_storage& operator=(const indexed_storage& other) = default;
+  constexpr indexed_storage(indexed_storage&& other) = default;
+  constexpr indexed_storage& operator=(indexed_storage&& other) = default;
+
+  template <typename T, typename... Args>
+  constexpr indexed_storage(type_tag<T>, Args&&... args)
+      : base_(type_tag<T>{}, std::forward<Args>(args)...) {
+    index_ = base_.index(type_tag<T>{});
+  }
+  template <size_t Index, typename... Args>
+  constexpr indexed_storage(index_tag<Index>, Args&&... args)
+      : index_{Index}, base_(index_tag<Index>{}, std::forward<Args>(args)...) {}
+
+  constexpr indexed_storage(maybe_init_t, const indexed_storage& other)
+      : index_{other.index()}, base_{} {
+    base_.construct_at(other.index(), other.base_);
+  }
+  constexpr indexed_storage(maybe_init_t, indexed_storage&& other)
+      : index_{other.index()}, base_{} {
+    base_.construct_at(other.index(), std::move(other.base_));
+  }
+
+  ~indexed_storage() = default;
+
+  constexpr index_type index() const { return index_; }
+  constexpr bool is_empty() const { return index() == empty_index; }
+  template <typename T>
+  constexpr bool has_value(type_tag<T>) const {
+    return index() == base_.index(type_tag<T>{});
+  }
+  template <size_t Index>
+  constexpr bool has_value(index_tag<Index>) const {
+    return index() == Index;
+  }
+
+  template <typename T>
+  constexpr auto& get(type_tag<T>) {
+    return base_.get(type_tag<T>{});
+  }
+  template <typename T>
+  constexpr const auto& get(type_tag<T>) const {
+    return base_.get(type_tag<T>{});
+  }
+  template <size_t Index>
+  constexpr auto& get(index_tag<Index>) {
+    return base_.get(index_tag<Index>{});
+  }
+  template <size_t Index>
+  constexpr const auto& get(index_tag<Index>) const {
+    return base_.get(index_tag<Index>{});
+  }
+
+  template <typename T, typename... Args>
+  constexpr void construct(type_tag<T>, Args&&... args) {
+    index_ = base_.construct(type_tag<T>{}, std::forward<Args>(args)...);
+  }
+  template <size_t Index, typename... Args>
+  constexpr void construct(index_tag<Index>, Args&&... args) {
+    index_ = base_.construct(index_tag<Index>{}, std::forward<Args>(args)...);
+  }
+
+  constexpr void assign(const indexed_storage& other) {
+    if (index() == other.index()) {
+      base_.assign_at(index_, other.base_);
+    } else {
+      reset();
+      base_.construct_at(other.index_, other.base_);
+      index_ = other.index_;
+    }
+  }
+  constexpr void assign(indexed_storage&& other) {
+    if (index() == other.index()) {
+      base_.assign_at(index_, std::move(other.base_));
+    } else {
+      reset();
+      base_.construct_at(other.index_, std::move(other.base_));
+      index_ = other.index_;
+    }
+  }
+
+  template <typename V>
+  constexpr bool visit(V&& visitor) {
+    return base_.visit(index_, std::forward<V>(visitor));
+  }
+  template <typename V>
+  constexpr bool visit(V&& visitor) const {
+    return base_.visit(index_, std::forward<V>(visitor));
+  }
+
+  constexpr void swap(indexed_storage& other) {
+    if (index() == other.index()) {
+      // Swap directly when the variants are the same, including empty.
+      base_.swap_at(index_, other.base_);
+    } else {
+      // Swap when the variants are different, including one being empty.
+      // This approach avoids GCC -Wmaybe-uninitialized warnings by
+      // initializing and accessing |temp| unconditionally within a
+      // conditional scope. The alternative, using the maybe_init_t
+      // constructor confuses GCC because it doesn't understand that the
+      // index checks prevent uninitialized access.
+      auto do_swap = [](indexed_storage& a, indexed_storage& b) {
+        return a.base_.visit(a.index_, [&a, &b](auto type_tag_v, auto index_tag_v, auto* element) {
+          indexed_storage temp{index_tag_v, std::move(element->value)};
+          a.reset();
+
+          a.base_.construct_at(b.index_, std::move(b.base_));
+          a.index_ = b.index_;
+          b.reset();
+
+          b.base_.construct_at(temp.index_, std::move(temp.base_));
+          b.index_ = temp.index_;
+          temp.reset();
+        });
+      };
+
+      // The visitor above returns false when the first argument is empty
+      // and no action is taken. In that case, the other order is tried to
+      // complete the half-empty swap.
+      do_swap(*this, other) || do_swap(other, *this);
+    }
+  }
+
+  // Destroys the active variant. Does nothing when already empty.
+  constexpr void reset() {
+    base_.reset(index_);
+    index_ = empty_index;
+  }
+
+ private:
+  index_type index_{empty_index};
+  base_type base_;
+};
+
+// Internal variant storage type used by fit::optional and fit::variant.
+// Specializations of this type select trivial vs. non-trivial copy/move
+// construction, assignment operators, and destructor based on the storage class
+// of the types in Ts.
+template <typename StorageClass, typename... Ts>
+struct storage;
+
+template <typename... Ts, size_t... Is>
+struct storage<storage_class<destructor_class::trivial, copy_class::trivial, move_class::trivial>,
+               type_index<Ts, Is>...>
+    : indexed_storage<destructor_class::trivial, type_index<Ts, Is>...> {
+  using base_type = indexed_storage<destructor_class::trivial, type_index<Ts, Is>...>;
+  using base_type::base_type;
+  constexpr storage() = default;
+};
+
+template <typename... Ts, size_t... Is>
+struct storage<
+    storage_class<destructor_class::trivial, copy_class::non_trivial, move_class::trivial>,
+    type_index<Ts, Is>...> : indexed_storage<destructor_class::trivial, type_index<Ts, Is>...> {
+  using base_type = indexed_storage<destructor_class::trivial, type_index<Ts, Is>...>;
+  using base_type::base_type;
+
+  ~storage() = default;
+  constexpr storage() = default;
+
+  constexpr storage(const storage& other) : base_type{maybe_init_v, other} {}
+
+  constexpr storage& operator=(const storage& other) {
+    this->assign(other);
+    return *this;
+  }
+
+  constexpr storage(storage&&) = default;
+  constexpr storage& operator=(storage&&) = default;
+};
+
+template <typename... Ts, size_t... Is>
+struct storage<
+    storage_class<destructor_class::trivial, copy_class::trivial, move_class::non_trivial>,
+    type_index<Ts, Is>...> : indexed_storage<destructor_class::trivial, type_index<Ts, Is>...> {
+  using base_type = indexed_storage<destructor_class::trivial, type_index<Ts, Is>...>;
+  using base_type::base_type;
+
+  ~storage() = default;
+  constexpr storage() = default;
+  constexpr storage(const storage&) = default;
+  constexpr storage& operator=(const storage&) = default;
+
+  constexpr storage(storage&& other) noexcept(base_type::nothrow_move_constructible)
+      : base_type{maybe_init_v, std::move(other)} {}
+
+  constexpr storage& operator=(storage&& other) noexcept(base_type::nothrow_move_assignable) {
+    this->assign(std::move(other));
+    return *this;
+  }
+};
+
+template <typename... Ts, size_t... Is>
+struct storage<
+    storage_class<destructor_class::trivial, copy_class::non_trivial, move_class::non_trivial>,
+    type_index<Ts, Is>...> : indexed_storage<destructor_class::trivial, type_index<Ts, Is>...> {
+  using base_type = indexed_storage<destructor_class::trivial, type_index<Ts, Is>...>;
+  using base_type::base_type;
+
+  ~storage() = default;
+  constexpr storage() = default;
+
+  constexpr storage(const storage& other) : base_type{maybe_init_v, other} {}
+
+  constexpr storage& operator=(const storage& other) {
+    this->assign(other);
+    return *this;
+  }
+
+  constexpr storage(storage&& other) noexcept(base_type::nothrow_move_constructible)
+      : base_type{maybe_init_v, std::move(other)} {}
+
+  constexpr storage& operator=(storage&& other) noexcept(base_type::nothrow_move_assignable) {
+    this->assign(std::move(other));
+    return *this;
+  }
+};
+
+// Specialization for non-trivially movable/copyable types. Types with a non-
+// trivial destructor are always non-trivially movable/copyable.
+template <copy_class CopyClass, move_class MoveClass, typename... Ts, size_t... Is>
+struct storage<storage_class<destructor_class::non_trivial, CopyClass, MoveClass>,
+               type_index<Ts, Is>...>
+    : indexed_storage<destructor_class::non_trivial, type_index<Ts, Is>...> {
+  using base_type = indexed_storage<destructor_class::non_trivial, type_index<Ts, Is>...>;
+  using base_type::base_type;
+
+  ~storage() { this->reset(); }
+
+  constexpr storage() = default;
+
+  constexpr storage(const storage& other) : base_type{maybe_init_v, other} {}
+
+  constexpr storage& operator=(const storage& other) {
+    this->assign(other);
+    return *this;
+  }
+
+  constexpr storage(storage&& other) noexcept(base_type::nothrow_move_constructible)
+      : base_type{maybe_init_v, std::move(other)} {}
+
+  constexpr storage& operator=(storage&& other) noexcept(base_type::nothrow_move_assignable) {
+    this->assign(std::move(other));
+    return *this;
+  }
+};
+
+template <typename... Ts, size_t... Is>
+constexpr auto make_storage(std::index_sequence<Is...>) {
+  return storage<make_storage_class<Ts...>, type_index<Ts, Is>...>{};
+}
+
+template <typename... Ts>
+using storage_type = decltype(make_storage<Ts...>(std::index_sequence_for<Ts...>{}));
+
+}  // namespace internal
+}  // namespace fit
+
+#endif  // LIB_FIT_STORAGE_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/string_view.h b/pkg/fit/include/lib/fit/string_view.h
new file mode 100644
index 0000000..54fff50
--- /dev/null
+++ b/pkg/fit/include/lib/fit/string_view.h
@@ -0,0 +1,557 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_STRING_VIEW_H_
+#define LIB_FIT_STRING_VIEW_H_
+
+#include <cassert>
+#include <cstdlib>
+#include <ios>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+namespace fit {
+
+namespace internal {
+
+// Constexpr filler for std::swap. No specialization for arrays.
+template <typename T>
+constexpr void constexpr_swap(T& a, T& b) noexcept {
+  T tmp = std::move(a);
+  a = std::move(b);
+  b = std::move(tmp);
+}
+
+// Constexpr filler for C++17 std::addressof.
+template <typename T>
+constexpr T* addressof(T& arg) {
+  return reinterpret_cast<T*>(&const_cast<char&>(reinterpret_cast<const volatile char&>(arg)));
+}
+
+// Filler for char_traits<CharT>::compare
+template <typename CharT>
+constexpr int compare(const CharT* s1, const CharT* s2, std::size_t count) {
+  for (std::size_t curr = 0; curr < count; ++curr) {
+    // Exit as soon as we find a different character.
+    if (std::char_traits<CharT>::lt(s1[curr], s2[curr])) {
+      return -1;
+    } else if (!std::char_traits<CharT>::eq(s1[curr], s2[curr])) {
+      return 1;
+    }
+  }
+  // If all characters within [s1, s1+count) and [s2, s2+count) are equal
+  // return 0.
+  return 0;
+}
+
+// Returns the distance from |begin| to first character in [|it|, |end|) that is equal to
+// |needle.front()|.
+// Returns |StringViewType::npos| if no such character is found.
+//
+// Complexity: O(|std::distance(it, end)|).
+template <typename StringViewType, typename Iterator>
+typename StringViewType::size_type find_char(Iterator it, Iterator begin, Iterator end,
+                                             StringViewType needle) {
+  // Look starting point.
+  while (it != end && !StringViewType::traits_type::eq(*it, needle.front())) {
+    ++it;
+  }
+
+  if (it == end) {
+    return StringViewType::npos;
+  }
+  return static_cast<typename StringViewType::size_type>(std::distance(begin, it));
+}
+
+// Returns the distance from the first character starting from |begin| that matches
+// any characters in |matchers|.
+// Returns |StringViewType::npos| if no characters are within |matchers|.
+//
+// Complexity: O(|std::distance(begin, end)|*|matchers.length()|).
+template <typename StringViewType, typename Iterator>
+constexpr typename StringViewType::size_type find_first_of(Iterator begin, Iterator end,
+                                                           StringViewType matchers) {
+  typename StringViewType::size_type curr = 0;
+  for (Iterator it = begin; it < end; ++it) {
+    for (const auto& matcher : matchers) {
+      if (StringViewType::traits_type::eq(*it, matcher)) {
+        return curr;
+      }
+    }
+    ++curr;
+  }
+
+  return StringViewType::npos;
+}
+
+// Returns the distance from the first character starting from |begin| that does not match
+// any characters in |matchers|.
+// Returns |StringViewType::npos| if all characters are within |matchers|.
+//
+// Complexity: O(|std::distance(begin, end)|*|matchers.length()|).
+template <typename StringViewType, typename Iterator>
+constexpr typename StringViewType::size_type find_first_not_of(Iterator begin, Iterator end,
+                                                               StringViewType matchers) {
+  typename StringViewType::size_type curr = 0;
+
+  for (Iterator it = begin; it < end; ++it) {
+    bool matched = false;
+    for (const auto& matcher : matchers) {
+      if (StringViewType::traits_type::eq(*it, matcher)) {
+        matched = true;
+        break;
+      }
+    }
+
+    if (!matched) {
+      return curr;
+    }
+    ++curr;
+  }
+
+  return StringViewType::npos;
+}
+
+// Returns the starting point of |needle| within |haystack|.
+// If no match is found, return |StringViewType::npos|.
+//
+// Complexity: O(|std::distance(begin, end)| * |needle.length()|)
+template <typename StringViewType, typename Iterator>
+constexpr typename StringViewType::size_type find(Iterator begin, Iterator end,
+                                                  const StringViewType needle) {
+  // If the needle does not fit in the haystack, there is no possible match.
+  if (static_cast<typename StringViewType::size_type>(std::distance(begin, end)) <
+      needle.length()) {
+    return StringViewType::npos;
+  }
+
+  if (needle.empty()) {
+    return 0;
+  }
+
+  Iterator it = begin;
+
+  while (it < end) {
+    typename StringViewType::size_type offset = find_char(it, begin, end, needle);
+    // If no match discard.
+    if (offset == StringViewType::npos) {
+      return StringViewType::npos;
+    }
+    it = begin + offset;
+
+    if (internal::compare<typename StringViewType::value_type>(&(*it), needle.data(),
+                                                               needle.size()) == 0) {
+      return std::distance(begin, it);
+    }
+    ++it;
+  }
+
+  // We did not find the substring in the haystack.
+  return StringViewType::npos;
+}
+
+}  // namespace internal
+
+// Provides a view to a sequence of characters.
+template <class CharT, class Traits = std::char_traits<CharT>>
+class basic_string_view {
+ public:
+  using traits_type = Traits;
+  using value_type = CharT;
+  using pointer = CharT*;
+  using const_pointer = const CharT*;
+  using reference = CharT&;
+  using const_reference = const CharT&;
+  using iterator = const_pointer;
+  using const_iterator = iterator;
+  using reverse_iterator = std::reverse_iterator<const_iterator>;
+  using const_reverse_iterator = reverse_iterator;
+  using size_type = std::size_t;
+  using difference_type = std::ptrdiff_t;
+
+  static constexpr size_type npos = static_cast<size_type>(-1);
+
+  constexpr basic_string_view() noexcept : data_(nullptr), length_(0) {}
+  constexpr basic_string_view(const CharT* s, size_type count) noexcept
+      : data_(s), length_(count) {}
+  constexpr basic_string_view(const CharT* s) noexcept : data_(s), length_(Traits::length(s)) {}
+  template <typename Allocator>
+  basic_string_view(const std::basic_string<CharT, Traits, Allocator>& s) noexcept
+      : data_(s.data()), length_(s.length()) {}
+  constexpr basic_string_view(const basic_string_view& other) noexcept = default;
+  basic_string_view(basic_string_view&&) noexcept = default;
+  constexpr basic_string_view& operator=(const basic_string_view& view) noexcept = default;
+  constexpr basic_string_view& operator=(basic_string_view&&) noexcept = default;
+  ~basic_string_view() = default;
+
+  constexpr iterator begin() const { return data_; }
+  constexpr iterator end() const { return begin() + length_; }
+  constexpr const_iterator cbegin() const { return data_; }
+  constexpr const_iterator cend() const { return begin() + length_; }
+
+  constexpr reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+  constexpr reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+  constexpr const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
+  constexpr const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
+
+  constexpr const_pointer data() const { return data_; }
+  constexpr size_type size() const { return length_; }
+  constexpr size_type length() const { return length_; }
+  constexpr size_type max_size() const { return std::numeric_limits<size_type>::max(); }
+
+  constexpr const_reference front() const { return this->operator[](0); }
+  constexpr const_reference back() const { return this->operator[](size() - 1); }
+  constexpr bool empty() const { return size() == 0; }
+
+  constexpr const_reference operator[](size_type pos) const { return *(data() + pos); }
+  constexpr const_reference at(size_type pos) const {
+    assert(pos < size());
+    return this->operator[](pos);
+  }
+
+  constexpr void remove_prefix(size_type n) {
+    data_ += n;
+    length_ -= n;
+  }
+  constexpr void remove_suffix(size_type n) { length_ -= n; }
+
+  constexpr void swap(basic_string_view& other) noexcept {
+    internal::constexpr_swap(data_, other.data_);
+    internal::constexpr_swap(length_, other.length_);
+  }
+
+  size_type copy(CharT* dest, size_type count, size_type pos = 0) const {
+    assert(pos < size());
+    Traits::copy(dest, data() + pos, calculate_length(pos, count));
+    return count;
+  }
+
+  constexpr basic_string_view substr(size_type pos = 0, size_type count = npos) const {
+    return basic_string_view(data() + pos, calculate_length(pos, count));
+  }
+
+  constexpr int compare(basic_string_view v) const {
+    const int result = internal::compare(data(), v.data(), std::min(size(), v.size()));
+    if (result == 0) {
+      return static_cast<int>(size() - v.size());
+    }
+    return result;
+  }
+
+  constexpr int compare(size_type pos1, size_type count1, basic_string_view v) const {
+    return substr(pos1, count1).compare(v);
+  }
+
+  constexpr int compare(size_type pos1, size_type count1, basic_string_view v, size_type pos2,
+                        size_type count2) const {
+    return substr(pos1, count1).compare(v.substr(pos2, count2));
+  }
+
+  constexpr int compare(const CharT* s) const { return compare(basic_string_view(s)); }
+
+  constexpr int compare(size_type pos1, size_type count1, const CharT* s) const {
+    return substr(pos1, count1).compare(basic_string_view(s));
+  }
+
+  constexpr int compare(size_type pos1, size_type count1, const CharT* s, size_type count2) const {
+    return substr(pos1, count1).compare(basic_string_view(s, count2));
+  }
+
+  constexpr size_type find(basic_string_view v, size_type pos = 0) const noexcept {
+    auto tmp = internal::find(substr(pos).begin(), substr(pos).end(), v);
+    return (tmp == npos) ? npos : pos + tmp;
+  }
+
+  constexpr size_type find(CharT ch, size_type pos = 0) const {
+    return find(basic_string_view(internal::addressof(ch), 1), pos);
+  }
+
+  constexpr size_type find(const CharT* s, size_type pos, size_type count) const {
+    return find(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type find(const CharT* s, size_type pos) const {
+    return find(basic_string_view(s), pos);
+  }
+
+  constexpr size_type rfind(basic_string_view v, size_type pos = 0) const noexcept {
+    auto tmp = internal::find(substr(pos).rbegin(), substr(pos).rend(), v);
+    return (tmp == npos) ? npos : length() - 1 - tmp;
+  }
+
+  constexpr size_type rfind(CharT ch, size_type pos = 0) const {
+    return rfind(basic_string_view(internal::addressof(ch), 1), pos);
+  }
+
+  constexpr size_type rfind(const CharT* s, size_type pos, size_type count) const {
+    return rfind(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type rfind(const CharT* s, size_type pos) const {
+    return rfind(basic_string_view(s), pos);
+  }
+
+  constexpr size_type find_first_of(basic_string_view v, size_type pos = 0) const noexcept {
+    auto tmp = internal::find_first_of(substr(pos).begin(), substr(pos).end(), v);
+    return tmp == npos ? npos : pos + tmp;
+  }
+
+  constexpr size_type find_first_of(CharT c, size_type pos = 0) const noexcept {
+    return find_first_of(basic_string_view(internal::addressof(c), 1), pos);
+  }
+
+  constexpr size_type find_first_of(const CharT* s, size_type pos, size_type count) const {
+    return find_first_of(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type find_first_of(const CharT* s, size_type pos = 0) const {
+    return find_first_of(basic_string_view(s), pos);
+  }
+
+  constexpr size_type find_last_of(basic_string_view v,
+                                   size_type pos = basic_string_view::npos) const noexcept {
+    const size_type fixed_length = (pos == npos) ? size() : pos + 1;
+    const size_type tmp = internal::find_first_of(substr(0, fixed_length).rbegin(),
+                                                  substr(0, fixed_length).rend(), v);
+    return tmp == npos ? npos : fixed_length - 1 - tmp;
+  }
+
+  constexpr size_type find_last_of(CharT c, size_type pos = basic_string_view::npos) const
+      noexcept {
+    return find_last_of(basic_string_view(internal::addressof(c), 1), pos);
+  }
+
+  constexpr size_type find_last_of(const CharT* s, size_type pos, size_type count) const {
+    return find_last_of(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type find_last_of(const CharT* s, size_type pos = basic_string_view::npos) const {
+    return find_last_of(basic_string_view(s), pos);
+  }
+
+  constexpr size_type find_first_not_of(basic_string_view v, size_type pos = 0) const noexcept {
+    const auto tmp = internal::find_first_not_of(substr(pos).begin(), substr(pos).end(), v);
+    return tmp == npos ? npos : pos + tmp;
+  }
+
+  constexpr size_type find_first_not_of(CharT c, size_type pos = 0) const noexcept {
+    return find_first_not_of(basic_string_view(internal::addressof(c), 1), pos);
+  }
+
+  constexpr size_type find_first_not_of(const CharT* s, size_type pos, size_type count) const {
+    return find_first_not_of(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type find_first_not_of(const CharT* s, size_type pos = 0) const {
+    return find_first_not_of(basic_string_view(s), pos);
+  }
+
+  constexpr size_type find_last_not_of(basic_string_view v,
+                                       size_type pos = basic_string_view::npos) const noexcept {
+    const size_type fixed_length = (pos == npos) ? size() : pos + 1;
+    auto tmp = internal::find_first_not_of(substr(0, fixed_length).rbegin(),
+                                           substr(0, fixed_length).rend(), v);
+    return tmp == npos ? npos : fixed_length - 1 - tmp;
+  }
+
+  constexpr size_type find_last_not_of(CharT c, size_type pos = basic_string_view::npos) const
+      noexcept {
+    return find_last_not_of(basic_string_view(internal::addressof(c), 1), pos);
+  }
+
+  constexpr size_type find_last_not_of(const CharT* s, size_type pos, size_type count) const {
+    return find_last_not_of(basic_string_view(s, count), pos);
+  }
+
+  constexpr size_type find_last_not_of(const CharT* s,
+                                       size_type pos = basic_string_view::npos) const {
+    return find_last_not_of(basic_string_view(s), pos);
+  }
+
+ private:
+  constexpr size_type calculate_length(size_type pos, size_type count) const {
+    if (count == npos) {
+      count = size();
+    }
+    return std::min(count, size() - pos);
+  }
+
+  const_pointer data_;
+  size_type length_;
+};
+
+// Operators and overloads to satisfy all conversions.
+//
+// Defined overloads are of the form:
+//   <basic_string_view, basic_string_view>
+//   <RawType, basic_string_view>
+//   <basic_string_view, RawType>
+//
+// When |RawType| is lhs: std::is_constructible<basic_string_view, RawType>::value must be true.
+// When |RawType| is rhs: There must be an overload of basic_string_view::compare for |RawType|.
+template <class CharT, class Traits>
+constexpr bool operator==(fit::basic_string_view<CharT, Traits> lhs,
+                          fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) == 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator==(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) == 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator==(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) == 0;
+}
+
+template <class CharT, class Traits>
+constexpr bool operator!=(fit::basic_string_view<CharT, Traits> lhs,
+                          fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) != 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator!=(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) != 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator!=(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) != 0;
+}
+
+template <class CharT, class Traits>
+constexpr bool operator<(fit::basic_string_view<CharT, Traits> lhs,
+                         fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) < 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator<(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) < 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator<(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) < 0;
+}
+
+template <class CharT, class Traits>
+constexpr bool operator>(fit::basic_string_view<CharT, Traits> lhs,
+                         fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) > 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator>(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) > 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator>(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) > 0;
+}
+
+template <class CharT, class Traits>
+constexpr bool operator<=(fit::basic_string_view<CharT, Traits> lhs,
+                          fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) <= 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator<=(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) <= 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator<=(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) <= 0;
+}
+
+template <class CharT, class Traits>
+constexpr bool operator>=(fit::basic_string_view<CharT, Traits> lhs,
+                          fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return lhs.compare(rhs) >= 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator>=(RawType lhs, fit::basic_string_view<CharT, Traits> rhs) noexcept {
+  return fit::basic_string_view<CharT, Traits>(lhs).compare(rhs) >= 0;
+}
+
+template <class CharT, class Traits, class RawType>
+constexpr bool operator>=(fit::basic_string_view<CharT, Traits> lhs, RawType rhs) noexcept {
+  return lhs.compare(rhs) >= 0;
+}
+
+// Specializations.
+using string_view = fit::basic_string_view<char>;
+
+// Constructs a string_view from ""_sv literal.
+// Literals with no leading underscore are reserved for the standard library.
+// https://en.cppreference.com/w/cpp/string/basic_string_view/operator%22%22sv
+inline namespace literals {
+inline namespace string_view_literals {
+
+constexpr fit::string_view operator"" _sv(typename fit::string_view::const_pointer str,
+                                          typename fit::string_view::size_type len) noexcept {
+  return fit::string_view(str, len);
+}
+}  // namespace string_view_literals
+}  // namespace literals
+
+}  // namespace fit
+
+namespace std {
+// Hash needs to match basic_string view hash of the same string, so we need to rely on compiler
+// implementation.
+// https://en.cppreference.com/w/cpp/string/basic_string_view/hash
+template <class CharT>
+struct hash<fit::basic_string_view<CharT, std::char_traits<CharT>>> {
+  std::size_t operator()(const fit::basic_string_view<CharT, std::char_traits<CharT>> val) const {
+    return __do_string_hash(val.data(), val.data() + val.length());
+  }
+};
+
+// Output stream specialization for fit::string_view.
+//
+// https://en.cppreference.com/w/cpp/string/basic_string_view/operator_ltlt
+template <class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,
+                                              fit::basic_string_view<CharT, Traits> v) {
+  using size_type = typename fit::basic_string_view<CharT, Traits>::size_type;
+  const size_type fixed_length = std::min(static_cast<size_type>(os.width()), v.length());
+  const size_type fill_length =
+      (static_cast<size_type>(os.width()) > v.length()) ? os.width() - v.length() : 0;
+
+  auto fill_space = [](std::basic_ostream<CharT, Traits>& os, size_type fill_length) {
+    for (std::size_t i = 0; i < fill_length; ++i) {
+      os.put(os.fill());
+    }
+  };
+
+  bool fill_left = (os.flags() & std::ios_base::adjustfield) == std::ios_base::left;
+
+  if (!fill_left) {
+    fill_space(os, fill_length);
+  }
+
+  os.write(v.data(), fixed_length);
+
+  if (fill_left) {
+    fill_space(os, fill_length);
+  }
+
+  os.width(0);
+
+  return os;
+}
+
+}  // namespace std
+
+#endif
diff --git a/pkg/fit/include/lib/fit/thread_safety.h b/pkg/fit/include/lib/fit/thread_safety.h
index 8ffc5ad..9545def 100644
--- a/pkg/fit/include/lib/fit/thread_safety.h
+++ b/pkg/fit/include/lib/fit/thread_safety.h
@@ -7,8 +7,7 @@
 
 // Thread-safety annotations.
 // Currently these are only supported on Clang.
-#if defined(__clang__) &&                                \
-    defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) && \
+#if defined(__clang__) && defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) && \
     __has_attribute(acquire_capability)
 #define FIT_THREAD_ANNOTATION(x) __attribute__((x))
 #else
@@ -27,4 +26,4 @@
 #define FIT_SCOPED_CAPABILITY FIT_THREAD_ANNOTATION(__scoped_lockable__)
 #define FIT_NO_THREAD_SAFETY_ANALYSIS FIT_THREAD_ANNOTATION(__no_thread_safety_analysis__)
 
-#endif // LIB_FIT_THREAD_SAFETY_H_
+#endif  // LIB_FIT_THREAD_SAFETY_H_
diff --git a/pkg/fit/include/lib/fit/traits.h b/pkg/fit/include/lib/fit/traits.h
index 933005e..ff43b92 100644
--- a/pkg/fit/include/lib/fit/traits.h
+++ b/pkg/fit/include/lib/fit/traits.h
@@ -10,15 +10,65 @@
 
 namespace fit {
 
-// C++ 14 compatible implementation of std::void_t.
+// C++14 compatible polyfill for C++17 traits.
 #if defined(__cplusplus) && __cplusplus >= 201703L
+
 template <typename... T>
 using void_t = std::void_t<T...>;
+
+template <typename... Ts>
+using conjunction = std::conjunction<Ts...>;
+template <typename... Ts>
+inline constexpr bool conjunction_v = std::conjunction_v<Ts...>;
+
+template <typename... Ts>
+using disjunction = std::disjunction<Ts...>;
+template <typename... Ts>
+inline constexpr bool disjunction_v = std::disjunction_v<Ts...>;
+
+template <typename... Ts>
+using negation = std::negation<Ts...>;
+template <typename... Ts>
+inline constexpr bool negation_v = std::negation_v<Ts...>;
+
 #else
+
 template <typename... T>
-struct make_void { typedef void type; };
+struct make_void {
+  typedef void type;
+};
 template <typename... T>
 using void_t = typename make_void<T...>::type;
+
+template <typename... Ts>
+struct conjunction : std::true_type {};
+template <typename T>
+struct conjunction<T> : T {};
+template <typename First, typename... Rest>
+struct conjunction<First, Rest...>
+    : std::conditional_t<bool(First::value), conjunction<Rest...>, First> {};
+
+template <typename... Ts>
+constexpr bool conjunction_v = conjunction<Ts...>::value;
+
+template <typename... Ts>
+struct disjunction : std::false_type {};
+template <typename T>
+struct disjunction<T> : T {};
+template <typename First, typename... Rest>
+struct disjunction<First, Rest...>
+    : std::conditional_t<bool(First::value), First, disjunction<Rest...>> {};
+
+template <typename... Ts>
+constexpr bool disjunction_v = disjunction<Ts...>::value;
+
+// Utility type that negates its truth-like parameter type.
+template <typename T>
+struct negation : std::integral_constant<bool, !bool(T::value)> {};
+
+template <typename T>
+constexpr bool negation_v = negation<T>::value;
+
 #endif
 
 // Encapsulates capture of a parameter pack. Typical use is to use instances of this empty struct
@@ -36,10 +86,10 @@
 //  }
 template <typename... T>
 struct parameter_pack {
-    static constexpr size_t size = sizeof...(T);
+  static constexpr size_t size = sizeof...(T);
 
-    template <size_t i>
-    using at = typename std::tuple_element_t<i, std::tuple<T...>>;
+  template <size_t i>
+  using at = typename std::tuple_element_t<i, std::tuple<T...>>;
 };
 
 // |callable_traits| captures elements of interest from function-like types (functions, function
@@ -70,41 +120,36 @@
 template <typename FunctorType, typename ReturnType, typename... ArgTypes>
 struct callable_traits<ReturnType (FunctorType::*)(ArgTypes...) const>
     : public callable_traits<ReturnType (*)(ArgTypes...)> {
-
-    using type = FunctorType;
+  using type = FunctorType;
 };
 
 // Function pointer specialization.
 template <typename ReturnType, typename... ArgTypes>
 struct callable_traits<ReturnType (*)(ArgTypes...)>
     : public callable_traits<ReturnType(ArgTypes...)> {
-
-    using type = ReturnType (*)(ArgTypes...);
+  using type = ReturnType (*)(ArgTypes...);
 };
 
 // Base specialization.
 template <typename ReturnType, typename... ArgTypes>
 struct callable_traits<ReturnType(ArgTypes...)> {
-    using signature = ReturnType(ArgTypes...);
-    using return_type = ReturnType;
-    using args = parameter_pack<ArgTypes...>;
+  using signature = ReturnType(ArgTypes...);
+  using return_type = ReturnType;
+  using args = parameter_pack<ArgTypes...>;
 
-    callable_traits() = delete;
+  callable_traits() = delete;
 };
 
 // Determines whether a type has an operator() that can be invoked.
 template <typename T, typename = void_t<>>
 struct is_callable : public std::false_type {};
 template <typename ReturnType, typename... ArgTypes>
-struct is_callable<ReturnType (*)(ArgTypes...)>
-    : public std::true_type {};
+struct is_callable<ReturnType (*)(ArgTypes...)> : public std::true_type {};
 template <typename FunctorType, typename ReturnType, typename... ArgTypes>
-struct is_callable<ReturnType (FunctorType::*)(ArgTypes...)>
-    : public std::true_type {};
+struct is_callable<ReturnType (FunctorType::*)(ArgTypes...)> : public std::true_type {};
 template <typename T>
-struct is_callable<T, void_t<decltype(&T::operator())>>
-    : public std::true_type {};
+struct is_callable<T, void_t<decltype(&T::operator())>> : public std::true_type {};
 
-} // namespace fit
+}  // namespace fit
 
-#endif // LIB_FIT_TRAITS_H_
+#endif  // LIB_FIT_TRAITS_H_
diff --git a/pkg/fit/include/lib/fit/utility_internal.h b/pkg/fit/include/lib/fit/utility_internal.h
new file mode 100644
index 0000000..2351831
--- /dev/null
+++ b/pkg/fit/include/lib/fit/utility_internal.h
@@ -0,0 +1,134 @@
+// Copyright 2019 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.
+
+#ifndef LIB_FIT_UTILITY_INTERNAL_H_
+#define LIB_FIT_UTILITY_INTERNAL_H_
+
+#include <type_traits>
+#include <utility>
+
+#include "traits.h"
+
+namespace fit {
+namespace internal {
+
+// Utility to return the first type in a parameter pack.
+template <typename... Ts>
+struct first;
+template <typename First, typename... Rest>
+struct first<First, Rest...> {
+  using type = First;
+};
+
+template <typename... Ts>
+using first_t = typename first<Ts...>::type;
+
+// Utility to count the occurences of type T in the parameter pack Ts.
+template <typename T, typename... Ts>
+struct occurences_of : std::integral_constant<size_t, 0> {};
+template <typename T, typename U>
+struct occurences_of<T, U> : std::integral_constant<size_t, std::is_same<T, U>::value> {};
+template <typename T, typename First, typename... Rest>
+struct occurences_of<T, First, Rest...>
+    : std::integral_constant<size_t,
+                             occurences_of<T, First>::value + occurences_of<T, Rest...>::value> {};
+
+template <typename T, typename... Ts>
+constexpr size_t occurences_of_v = occurences_of<T, Ts...>::value;
+
+// Utility to remove const, volatile, and reference qualifiers.
+template <typename T>
+using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
+
+// Evaluates to truth-like when type T matches type U with cv-reference removed.
+template <typename T, typename U>
+using not_same_type = negation<std::is_same<T, remove_cvref_t<U>>>;
+
+// Concept helper for constructors.
+template <typename... Conditions>
+using requires_conditions = std::enable_if_t<conjunction_v<Conditions...>, bool>;
+
+// Concept helper for assignment operators.
+template <typename Return, typename... Conditions>
+using assignment_requires_conditions =
+    std::enable_if_t<conjunction_v<Conditions...>, std::add_lvalue_reference_t<Return>>;
+
+// Evaluates to true when every element type of Ts is trivially destructible.
+template <typename... Ts>
+constexpr bool is_trivially_destructible_v = conjunction_v<std::is_trivially_destructible<Ts>...>;
+
+// Evaluates to true when every element type of Ts is trivially copyable.
+template <typename... Ts>
+constexpr bool is_trivially_copyable_v =
+    (conjunction_v<std::is_trivially_copy_assignable<Ts>...> &&
+     conjunction_v<std::is_trivially_copy_constructible<Ts>...>);
+
+// Evaluates to true when every element type of Ts is trivially movable.
+template <typename... Ts>
+constexpr bool is_trivially_movable_v =
+    (conjunction_v<std::is_trivially_move_assignable<Ts>...> &&
+     conjunction_v<std::is_trivially_move_constructible<Ts>...>);
+
+// Enable if relational operator is convertible to bool and the optional
+// conditions are true.
+template <typename Op, typename... Conditions>
+using enable_relop_t =
+    std::enable_if_t<(std::is_convertible<Op, bool>::value && conjunction_v<Conditions...>), bool>;
+
+template <typename T>
+struct identity {
+  using type = T;
+};
+
+// Evaluates to true when T is an unbounded array.
+template <typename T>
+struct is_unbounded_array : conjunction<std::is_array<T>, negation<std::extent<T>>> {};
+
+// Returns true when T is a complete type or an unbounded array.
+template <typename T, size_t = sizeof(T)>
+constexpr bool is_complete_or_unbounded_array(identity<T>) {
+  return true;
+}
+template <typename Identity, typename T = typename Identity::type>
+constexpr bool is_complete_or_unbounded_array(Identity) {
+  return disjunction<std::is_reference<T>, std::is_function<T>, std::is_void<T>,
+                     is_unbounded_array<T>>::value;
+}
+
+// Using swap for ADL. This directive is contained within the fit::internal
+// namespace, which prevents leaking std::swap into user namespaces. Doing this
+// at namespace scope is necessary to lookup swap via ADL while preserving the
+// noexcept() specification of the resulting lookup.
+using std::swap;
+
+// Evaluates to true when T is swappable.
+template <typename T, typename = void>
+struct is_swappable : std::false_type {
+  static_assert(is_complete_or_unbounded_array(identity<T>{}),
+                "T must be a complete type or an unbounded array!");
+};
+template <typename T>
+struct is_swappable<T, void_t<decltype(swap(std::declval<T&>(), std::declval<T&>()))>>
+    : std::true_type {
+  static_assert(is_complete_or_unbounded_array(identity<T>{}),
+                "T must be a complete type or an unbounded array!");
+};
+
+// Evaluates to true when T is nothrow swappable.
+template <typename T, typename = void>
+struct is_nothrow_swappable : std::false_type {
+  static_assert(is_complete_or_unbounded_array(identity<T>{}),
+                "T must be a complete type or an unbounded array!");
+};
+template <typename T>
+struct is_nothrow_swappable<T, void_t<decltype(swap(std::declval<T&>(), std::declval<T&>()))>>
+    : std::integral_constant<bool, noexcept(swap(std::declval<T&>(), std::declval<T&>()))> {
+  static_assert(is_complete_or_unbounded_array(identity<T>{}),
+                "T must be a complete type or an unbounded array!");
+};
+
+}  // namespace internal
+}  // namespace fit
+
+#endif  //  LIB_FIT_UTILITY_INTERNAL_H_
diff --git a/pkg/fit/include/lib/fit/variant.h b/pkg/fit/include/lib/fit/variant.h
index f91a4a2..a5fd943 100644
--- a/pkg/fit/include/lib/fit/variant.h
+++ b/pkg/fit/include/lib/fit/variant.h
@@ -5,400 +5,629 @@
 #ifndef LIB_FIT_VARIANT_H_
 #define LIB_FIT_VARIANT_H_
 
-#include <assert.h>
-
+#include <exception>
 #include <new>
 #include <type_traits>
 #include <utility>
 
+#include "constructors_internal.h"
+#include "in_place_internal.h"
+#include "storage_internal.h"
+#include "traits.h"
+#include "utility_internal.h"
+
 namespace fit {
-namespace internal {
 
-// This is a very basic partial implementation of |std::variant| which
-// is compatible with C++ 14.  In its current state, it only implements
-// enough of the API for internal usage.  Transforming this into a more
-// complete and precise implementation of |std::variant| is left as an
-// exercise for the reader.  ;)
-//
-// Some key differences:
-// - always requires first type to be monostate
-// - always default constructible
-// - no relational operators
-// - no visitors
-// - no find by type, only find by index
-// - no exception support
-// - simplified get/set methods
-
-// Unit type.
+// A default-constructible type that may be used as the first variant type to
+// make fit::variant default-constructible when other variants are not. This
+// type may also be used as an alternative representing an empty value.
 struct monostate final {
-    constexpr bool operator==(const monostate& other) const { return true; }
-    constexpr bool operator!=(const monostate& other) const { return false; }
+  constexpr bool operator==(const monostate& other) const { return true; }
+  constexpr bool operator!=(const monostate& other) const { return false; }
+  constexpr bool operator<(const monostate& other) const { return false; }
+  constexpr bool operator>(const monostate& other) const { return false; }
+  constexpr bool operator<=(const monostate& other) const { return true; }
+  constexpr bool operator>=(const monostate& other) const { return true; }
 };
 
-// Tag for requesting in-place initialization of a variant alternative by index.
-template <size_t index>
-struct in_place_index_t final {};
+namespace internal {
+
+// Helper type to avoid recursive instantiations of the full variant type.
+template <typename...>
+struct variant_list {};
+
+// Gets the number of alternatives in a variant_list as a compile-time constant.
+template <typename T>
+struct variant_list_size;
+
+template <typename... Ts>
+struct variant_list_size<variant_list<Ts...>> : std::integral_constant<size_t, sizeof...(Ts)> {};
+
+// Helper to get the type of a variant_list alternative with the given index.
+template <size_t Index, typename VariantList>
+struct variant_alternative;
+
+template <size_t Index, typename T0, typename... Ts>
+struct variant_alternative<Index, variant_list<T0, Ts...>>
+    : variant_alternative<Index - 1, variant_list<Ts...>> {};
+
+template <typename T0, typename... Ts>
+struct variant_alternative<0, variant_list<T0, Ts...>> {
+  using type = T0;
+};
+
+}  // namespace internal
+
+// Forward declaration.
+template <typename... Ts>
+class variant;
+
+// Gets the type of a variant alternative with the given index.
+template <size_t Index, typename Variant>
+struct variant_alternative;
+
+template <size_t Index, typename... Ts>
+struct variant_alternative<Index, variant<Ts...>>
+    : ::fit::internal::variant_alternative<Index, ::fit::internal::variant_list<Ts...>> {};
+
+template <size_t index, typename Variant>
+using variant_alternative_t = typename variant_alternative<index, Variant>::type;
+
+// Gets the number of alternatives in a variant as a compile-time constant
+// expression.
+template <typename T>
+struct variant_size;
+
+template <typename... Ts>
+struct variant_size<variant<Ts...>> : std::integral_constant<size_t, sizeof...(Ts)> {};
+
+template <typename T>
+struct variant_size<const T> : variant_size<T> {};
+template <typename T>
+struct variant_size<volatile T> : variant_size<T> {};
+template <typename T>
+struct variant_size<const volatile T> : variant_size<T> {};
 
 #ifdef __cpp_inline_variables
 
-// Inline variables are only available on C++ 17 and beyond.
-template <size_t index>
-inline constexpr in_place_index_t<index> in_place_index{};
+template <typename T>
+inline constexpr size_t variant_size_v = variant_size<T>::value;
 
 #else
 
-// On C++ 14 we need to provide storage for the variable so we define
-// |in_place_index| as a reference instead.
-template <size_t index>
-struct in_place_index_holder {
-    static constexpr in_place_index_t<index> instance{};
+template <typename T>
+struct variant_size_holder {
+  static constexpr size_t value{variant_size<T>::value};
 };
 
-template <size_t index>
-constexpr in_place_index_t<index> in_place_index_holder<index>::instance;
+template <typename T>
+constexpr size_t variant_size_holder<T>::value;
 
-template <size_t index>
-static constexpr const in_place_index_t<index>& in_place_index =
-    in_place_index_holder<index>::instance;
+template <typename T>
+static constexpr const size_t& variant_size_v = variant_size_holder<T>::value;
 
-#endif // __cpp_inline_variables
+#endif
 
-// Stores the contents of the variant as a recursively nested union
-// of alternatives.  Conceptually it might be simpler to use
-// std::in_place_storage<> but we would lose the ability to treat the
-// storage as a literal type.
-template <typename... Ts>
-union variant_storage final {
-    static constexpr bool copy_construct_supported = true;
-    static constexpr bool move_construct_supported = true;
+// Exception type to report bad accesses to variant.
+class bad_variant_access : public std::exception {
+ public:
+  bad_variant_access() noexcept {}
 
-    void copy_construct_from(size_t index, const variant_storage& other) {}
-    void move_construct_from(size_t index, variant_storage&& other) {}
-    void destroy(size_t index) {}
-    void swap(size_t index, variant_storage& other) {}
+  const char* what() const noexcept override { return reason_; }
+
+ private:
+  template <typename... Ts>
+  friend class variant;
+
+  bad_variant_access(const char* reason) noexcept : reason_{reason} {}
+
+  // String describing the reason for the bad access. Must point to a string
+  // with static storage duration.
+  const char* reason_;
 };
 
-template <typename T0, typename... Ts>
-union variant_storage<T0, Ts...> final {
-    static constexpr bool copy_construct_supported =
-        std::is_copy_constructible<T0>::value &&
-        variant_storage<Ts...>::copy_construct_supported;
-    static constexpr bool move_construct_supported =
-        std::is_move_constructible<T0>::value &&
-        variant_storage<Ts...>::move_construct_supported;
+namespace internal {
 
-    constexpr variant_storage() = default;
-
-    template <typename... Args>
-    explicit constexpr variant_storage(in_place_index_t<0>, Args&&... args)
-        : alt(std::forward<Args>(args)...) {}
-
-    template <size_t index, typename... Args>
-    explicit constexpr variant_storage(in_place_index_t<index>, Args&&... args)
-        : rest(in_place_index<index - 1>, std::forward<Args>(args)...) {}
-
-    constexpr T0& get(in_place_index_t<0>) { return alt; }
-
-    constexpr const T0& get(in_place_index_t<0>) const { return alt; }
-
-    template <size_t index>
-    constexpr auto& get(in_place_index_t<index>) {
-        return rest.get(in_place_index<index - 1>);
-    }
-
-    template <size_t index>
-    constexpr const auto& get(in_place_index_t<index>) const {
-        return rest.get(in_place_index<index - 1>);
-    }
-
-    template <typename... Args>
-    auto& emplace(in_place_index_t<0>, Args&&... args) {
-        new (&alt) T0(std::forward<Args>(args)...);
-        return alt;
-    }
-
-    template <size_t index, typename... Args>
-    auto& emplace(in_place_index_t<index>, Args&&... args) {
-        return rest.emplace(in_place_index<index - 1>,
-                            std::forward<Args>(args)...);
-    }
-
-    void copy_construct_from(size_t index, const variant_storage& other) {
-        if (index == 0) {
-            new (&alt) T0(other.alt);
-        } else {
-            rest.copy_construct_from(index - 1, other.rest);
-        }
-    }
-
-    void move_construct_from(size_t index, variant_storage&& other) {
-        if (index == 0) {
-            new (&alt) T0(std::move(other.alt));
-        } else {
-            rest.move_construct_from(index - 1, std::move(other.rest));
-        }
-    }
-
-    void destroy(size_t index) {
-        if (index == 0) {
-            alt.~T0();
-        } else {
-            rest.destroy(index - 1);
-        }
-    }
-
-    void swap(size_t index, variant_storage& other) {
-        using std::swap;
-        if (index == 0) {
-            swap(alt, other.alt);
-        } else {
-            rest.swap(index - 1, other.rest);
-        }
-    }
-
-    T0 alt;
-    variant_storage<Ts...> rest;
+// Helper type to check that conversions do not narrow.
+template <typename T>
+struct check_narrow {
+  T x[1];
 };
 
-// Holds the index and storage for a variant with a trivial destructor.
-template <typename... Ts>
-class variant_base_impl_trivial;
-template <typename... Ts>
-class variant_base_impl_trivial<monostate, Ts...> {
-public:
-    constexpr variant_base_impl_trivial()
-        : index_(0),
-          storage_(in_place_index<0>, monostate{}) {}
-
-    template <size_t index, typename... Args>
-    explicit constexpr variant_base_impl_trivial(
-        in_place_index_t<index>, Args&&... args)
-        : index_(index),
-          storage_(in_place_index<index>, std::forward<Args>(args)...) {}
-
-    // Used by emplace.
-    void destroy() {}
-
-protected:
-    size_t index_;
-    variant_storage<monostate, Ts...> storage_;
+// Builds a check(Ti) function for each alternative Ti. This trait is evaluated
+// for each element of fit::variant<Ts...>. Essentially: for (Index, Ti) in Ts.
+//
+// Index is the zero-based index of the corresponding element Ti in the pack Ts.
+// T is the type deduced from the converting constructor or assignment operator
+// of fit::variant for which we want to find an appropriately convertible
+// element.
+//
+// The specializations below match the element Ti that passes the conversion
+// checks.
+template <size_t Index, typename T, typename Ti,
+          bool IsBool = std::is_same<bool, std::remove_cv_t<Ti>>::value, typename = void>
+struct check_valid_option {
+  // Non-static so that check_valid_option<...>::check is always a valid
+  // name, but doesn't participate in the overload resolution in the
+  // valid_option_index selection trait.
+  void check();
 };
 
-// Holds the index and storage for a variant with a non-trivial destructor.
-template <typename... Ts>
-class variant_base_impl_non_trivial;
-template <typename... Ts>
-class variant_base_impl_non_trivial<monostate, Ts...> {
-public:
-    constexpr variant_base_impl_non_trivial()
-        : index_(0),
-          storage_(in_place_index<0>, monostate{}) {}
-
-    template <size_t index, typename... Args>
-    explicit constexpr variant_base_impl_non_trivial(
-        in_place_index_t<index>, Args&&... args)
-        : index_(index),
-          storage_(in_place_index<index>, std::forward<Args>(args)...) {}
-
-    ~variant_base_impl_non_trivial() {
-        destroy();
-    }
-
-    // Used by emplace and by the destructor.
-    void destroy() {
-        storage_.destroy(index_);
-    }
-
-protected:
-    size_t index_;
-    union {
-        variant_storage<monostate, Ts...> storage_;
-    };
+// Checks that Ti x[] = {std::forward<T>()} is well formed.
+template <size_t Index, typename T, typename Ti>
+struct check_valid_option<Index, T, Ti, false,
+                          void_t<decltype(check_narrow<Ti>{{std::declval<T>()}})>> {
+  static std::integral_constant<size_t, Index> check(Ti);
 };
 
-// Selects an appropriate variant base class depending on whether
-// its destructor is trivial or non-trivial.
-template <typename... Ts>
-using variant_base_impl =
-    std::conditional_t<
-        std::is_destructible<
-            variant_base_impl_trivial<Ts...>>::value,
-        variant_base_impl_trivial<Ts...>,
-        variant_base_impl_non_trivial<Ts...>>;
-
-// Implements non-trivial move-construction and move-assignment.
-template <typename... Ts>
-class variant_move_impl_non_trivial : protected variant_base_impl<Ts...> {
-    using base = variant_base_impl<Ts...>;
-
-public:
-    using base::base;
-
-    variant_move_impl_non_trivial(
-        const variant_move_impl_non_trivial& other) = default;
-
-    variant_move_impl_non_trivial(
-        variant_move_impl_non_trivial&& other) {
-        index_ = other.index_;
-        storage_.move_construct_from(index_, std::move(other.storage_));
-    }
-
-    variant_move_impl_non_trivial& operator=(
-        const variant_move_impl_non_trivial& other) = default;
-
-    variant_move_impl_non_trivial& operator=(
-        variant_move_impl_non_trivial&& other) {
-        if (&other == this)
-            return *this;
-        storage_.destroy(index_);
-        index_ = other.index_;
-        storage_.move_construct_from(index_, std::move(other.storage_));
-        return *this;
-    }
-
-protected:
-    using base::index_;
-    using base::storage_;
+// Checks that remove_cvref_t<T> is bool when Ti is cv bool.
+template <size_t Index, typename T, typename Ti>
+struct check_valid_option<Index, T, Ti, true,
+                          std::enable_if_t<std::is_same<bool, remove_cvref_t<T>>::value>> {
+  static std::integral_constant<size_t, Index> check(Ti);
 };
 
-// Selects an appropriate variant base class for moving.
-template <typename... Ts>
-using variant_move_impl =
-    std::conditional_t<
-        (std::is_move_constructible<variant_base_impl<Ts...>>::value &&
-         std::is_move_assignable<variant_base_impl<Ts...>>::value) ||
-            !variant_storage<Ts...>::move_construct_supported,
-        variant_base_impl<Ts...>,
-        variant_move_impl_non_trivial<Ts...>>;
-
-// Implements non-trivial copy-construction and copy-assignment.
-template <typename... Ts>
-class variant_copy_impl_non_trivial : protected variant_move_impl<Ts...> {
-    using base = variant_move_impl<Ts...>;
-
-public:
-    using base::base;
-
-    variant_copy_impl_non_trivial(
-        const variant_copy_impl_non_trivial& other) {
-        index_ = other.index_;
-        storage_.copy_construct_from(index_, other.storage_);
-    }
-
-    variant_copy_impl_non_trivial(
-        variant_copy_impl_non_trivial&&) = default;
-
-    variant_copy_impl_non_trivial& operator=(
-        const variant_copy_impl_non_trivial& other) {
-        if (&other == this)
-            return *this;
-        storage_.destroy(index_);
-        index_ = other.index_;
-        storage_.copy_construct_from(index_, other.storage_);
-        return *this;
-    }
-
-    variant_copy_impl_non_trivial& operator=(
-        variant_copy_impl_non_trivial&&) = default;
-
-protected:
-    using base::index_;
-    using base::storage_;
+// Mixes in instantiations of check_valid_option for each element in
+// fit::variant<Ts...>, creating a set of check(Ti) functions that might match
+// T following the conversion rules.
+template <typename T, typename VariantList,
+          typename = std::make_index_sequence<variant_list_size<VariantList>::value>>
+struct find_valid_option {
+  // Non-static so that find_valid_option<...>::check is always a valid name
+  // in the using clause of the recursive case, but doesn't participate in the
+  // overload resolution in the valid_option_index trait.
+  void check();
 };
 
-// Selects an appropriate variant base class for copying.
-// Use the base impl if the type is trivially
+// Recursive case. This would be simpler with C++17 pack expansion in using
+// directives, but this must function in C++14.
+template <typename T, typename Ti, size_t Index, typename... Ts, size_t... Is>
+struct find_valid_option<T, variant_list<Ti, Ts...>, std::index_sequence<Index, Is...>>
+    : check_valid_option<Index, T, Ti>,
+      find_valid_option<T, variant_list<Ts...>, std::index_sequence<Is...>> {
+  // Introduce the base class definitions of check() into this scope. The
+  // static check(Ti) methods participate in overload resolution in the
+  // valid_option_index trait, while the non-static check() methods are
+  // ignored.
+  using check_valid_option<Index, T, Ti>::check;
+  using find_valid_option<T, variant_list<Ts...>, std::index_sequence<Is...>>::check;
+};
+
+// Evaluates to the index of the valid target type Ti selected from
+// fit::variant<Ts...>. The type expression is well formed IFF a single valid
+// target type is available that converts from T.
+template <typename T, typename VariantList>
+using valid_option_index = decltype(find_valid_option<T, VariantList>::check(std::declval<T>()));
+
+// Evaluates to the index of the valid target Ti that converts from T or the
+// reserved empty index when no uniquely suitable option is available.
+template <typename T, typename Variant, typename = void>
+struct selected_index : std::integral_constant<size_t, ::fit::internal::empty_index> {};
+
+template <typename T, typename... Ts>
+struct selected_index<T, variant<Ts...>, void_t<valid_option_index<T, variant_list<Ts...>>>>
+    : valid_option_index<T, variant_list<Ts...>> {};
+
+}  // namespace internal
+
+// A resonably complete implementation of std::variant compatible with C++14.
 template <typename... Ts>
-using variant_copy_impl =
-    std::conditional_t<
-        (std::is_copy_constructible<variant_move_impl<Ts...>>::value &&
-         std::is_copy_assignable<variant_move_impl<Ts...>>::value) ||
-            !variant_storage<Ts...>::copy_construct_supported,
-        variant_move_impl<Ts...>,
-        variant_copy_impl_non_trivial<Ts...>>;
+class variant
+    : private ::fit::internal::modulate_default_constructor<::fit::internal::first_t<Ts...>>,
+      private ::fit::internal::modulate_copy_and_move<Ts...> {
+ private:
+  static_assert(sizeof...(Ts) > 0, "Variant must have at least one type!");
 
-// Actual variant type.
-template <typename... Ts>
-class variant : private variant_copy_impl<Ts...> {
-    using base = variant_copy_impl<Ts...>;
+  static constexpr bool nothrow_default_constructible =
+      std::is_nothrow_default_constructible<::fit::internal::first_t<Ts...>>::value;
 
-public:
-    constexpr variant() = default;
+  static constexpr bool nothrow_move_constructible =
+      conjunction_v<std::is_nothrow_move_constructible<Ts>...>;
 
-    template <size_t index, typename... Args>
-    explicit constexpr variant(in_place_index_t<index> i, Args&&... args)
-        : base(i, std::forward<Args>(args)...) {}
+  static constexpr auto default_init_v = ::fit::internal::default_init_v;
+  static constexpr auto trivial_init_v = ::fit::internal::trivial_init_v;
 
-    variant(const variant&) = default;
-    variant(variant&&) = default;
-    ~variant() = default;
+  template <typename T>
+  using type_tag = ::fit::internal::type_tag<T>;
+  template <size_t Index>
+  using index_tag = ::fit::internal::index_tag<Index>;
 
-    variant& operator=(const variant&) = default;
-    variant& operator=(variant&&) = default;
+  template <typename T>
+  using not_self_type = ::fit::internal::not_same_type<variant, T>;
 
-    constexpr size_t index() const { return index_; }
+  template <typename T>
+  using not_in_place = ::fit::internal::not_same_type<in_place_t, T>;
 
-    template <size_t index>
-    constexpr auto& get() {
-        assert(index_ == index);
-        return storage_.get(in_place_index<index>);
+  template <typename T>
+  struct occurs_once
+      : std::integral_constant<bool, ::fit::internal::occurences_of_v<T, Ts...> == 1> {};
+
+  template <typename... Conditions>
+  using requires_conditions = ::fit::internal::requires_conditions<Conditions...>;
+
+  template <typename... Conditions>
+  using assignment_requires_conditions =
+      ::fit::internal::assignment_requires_conditions<variant&, Conditions...>;
+
+  template <typename T, typename... Args>
+  using emplace_constructible_by_type =
+      std::enable_if_t<(::fit::internal::occurences_of_v<T, Ts...> == 1 &&
+                        std::is_constructible<T, Args...>::value),
+                       std::add_lvalue_reference_t<T>>;
+
+  template <size_t Index, typename = std::enable_if_t<(Index < sizeof...(Ts))>>
+  using alternative_t = variant_alternative_t<Index, variant>;
+
+  template <size_t Index, typename... Args>
+  using emplace_constructible_by_index =
+      std::enable_if_t<std::is_constructible<alternative_t<Index>, Args...>::value,
+                       std::add_lvalue_reference_t<alternative_t<Index>>>;
+
+  template <typename T>
+  static constexpr size_t selected_index = ::fit::internal::selected_index<T, variant>::value;
+
+  template <typename T, typename = std::enable_if<not_self_type<T>::value>>
+  using selected_t = alternative_t<selected_index<T>>;
+
+  [[noreturn]] static constexpr void throw_bad_variant_access(const char* reason) {
+#if __cpp_exceptions
+    throw bad_variant_access(reason);
+#else
+    (void)reason;
+    __builtin_abort();
+#endif
+  }
+
+ public:
+  // Default constructors.
+
+  constexpr variant() noexcept(nothrow_default_constructible) : storage_{default_init_v} {}
+
+  // Copy/move constructors and assignment operators.
+
+  constexpr variant(const variant&) = default;
+  constexpr variant& operator=(const variant&) = default;
+
+  constexpr variant(variant&&) noexcept(nothrow_move_constructible) = default;
+  constexpr variant& operator=(variant&&) = default;
+
+  // Converting constructors.
+
+  template <typename T,
+            requires_conditions<std::integral_constant<bool, (sizeof...(Ts) > 0)>,
+                                not_in_place<T>> = true,
+            typename Ti = selected_t<T&&>,
+            requires_conditions<occurs_once<Ti>, std::is_constructible<Ti, T>> = true>
+  constexpr variant(T&& value) noexcept(std::is_nothrow_constructible<Ti, T>::value)
+      : storage_(type_tag<Ti>{}, std::forward<T>(value)) {}
+
+  template <typename T, typename... Args,
+            requires_conditions<occurs_once<T>, std::is_constructible<T, Args...>> = true>
+  explicit constexpr variant(in_place_type_t<T>, Args&&... args)
+      : storage_(type_tag<T>{}, std::forward<Args>(args)...) {}
+
+  template <typename T, typename U, typename... Args,
+            requires_conditions<occurs_once<T>, std::is_constructible<T, std::initializer_list<T>&,
+                                                                      Args...>> = true>
+  explicit constexpr variant(in_place_type_t<T>, std::initializer_list<U> init_list, Args&&... args)
+      : storage_(type_tag<T>{}, init_list, std::forward<Args>(args)...) {}
+
+  template <size_t Index, typename... Args,
+            requires_conditions<std::is_constructible<alternative_t<Index>, Args...>> = true>
+  explicit constexpr variant(in_place_index_t<Index>, Args&&... args)
+      : storage_(index_tag<Index>{}, std::forward<Args>(args)...) {}
+
+  template <size_t Index, typename U, typename... Args,
+            requires_conditions<std::is_constructible<alternative_t<Index>,
+                                                      std::initializer_list<U>&, Args...>> = true>
+  explicit constexpr variant(in_place_index_t<Index>, std::initializer_list<U> init_list,
+                             Args&&... args)
+      : storage_(index_tag<Index>{}, init_list, std::forward<Args>(args)...) {}
+
+  ~variant() = default;
+
+  // Converting assignment.
+
+  template <typename T>
+  constexpr assignment_requires_conditions<
+      occurs_once<selected_t<T>>, std::is_constructible<selected_t<T&&>, T>,
+      std::is_assignable<selected_t<T&&>&, T>,
+      disjunction<std::is_nothrow_constructible<selected_t<T&&>, T>,
+                  negation<std::is_nothrow_move_constructible<selected_t<T&&>>>>>
+  operator=(T&& value) noexcept(std::is_nothrow_assignable<selected_t<T&&>&, T>::value&&
+                                    std::is_nothrow_constructible<selected_t<T&&>, T>::value) {
+    constexpr auto index = selected_index<T>;
+    if (storage_.index() == index) {
+      storage_.get(index_tag<index>{}) = std::forward<T>(value);
+    } else {
+      this->emplace<index>(std::forward<T>(value));
     }
+    return *this;
+  }
 
-    template <size_t index>
-    constexpr const auto& get() const {
-        assert(index_ == index);
-        return storage_.get(in_place_index<index>);
+  template <typename T>
+  constexpr assignment_requires_conditions<
+      occurs_once<selected_t<T>>, std::is_constructible<selected_t<T&&>, T>,
+      std::is_assignable<selected_t<T&&>&, T>,
+      conjunction<negation<std::is_nothrow_constructible<selected_t<T&&>, T>>,
+                  std::is_nothrow_move_constructible<selected_t<T&&>>>>
+  operator=(T&& value) noexcept(std::is_nothrow_assignable<selected_t<T&&>&, T>::value&&
+                                    std::is_nothrow_constructible<selected_t<T&&>, T>::value) {
+    constexpr auto index = selected_index<T>;
+    if (storage_.index() == index) {
+      storage_.get(index_tag<index>{}) = std::forward<T>(value);
+    } else {
+      this->operator=(variant(std::forward<T>(value)));
     }
+    return *this;
+  }
 
-    template <size_t index, typename... Args>
-    auto& emplace(Args&&... args) {
-        this->destroy();
-        index_ = index;
-        return storage_.emplace(in_place_index<index>,
-                                std::forward<Args>(args)...);
+  constexpr size_t index() const noexcept { return storage_.index(); }
+
+  // TODO(eieio): Remove uses of these in favor of non-member get.
+  template <size_t Index>
+  constexpr auto& get() & {
+    if (storage_.has_value(index_tag<Index>{})) {
+      return storage_.get(index_tag<Index>{});
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
     }
-
-    void swap(variant& other) {
-        using std::swap;
-        if (&other == this)
-            return;
-        if (index_ == other.index_) {
-            storage_.swap(index_, other.storage_);
-        } else {
-            variant temp(std::move(*this));
-            *this = std::move(other);
-            other = std::move(temp);
-        }
+  }
+  template <size_t Index>
+  constexpr const auto& get() const& {
+    if (storage_.has_value(index_tag<Index>{})) {
+      return storage_.get(index_tag<Index>{});
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
     }
+  }
+  template <size_t Index>
+  constexpr auto&& get() && {
+    if (storage_.has_value(index_tag<Index>{})) {
+      return std::move(storage_.get(index_tag<Index>{}));
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
+  template <size_t Index>
+  constexpr const auto&& get() const&& {
+    if (storage_.has_value(index_tag<Index>{})) {
+      return std::move(storage_.get(index_tag<Index>{}));
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
 
-private:
-    using base::index_;
-    using base::storage_;
+  template <typename T>
+  constexpr auto& get() & {
+    if (storage_.has_value(type_tag<T>{})) {
+      return storage_.get(type_tag<T>{});
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
+  template <typename T>
+  constexpr const auto& get() const& {
+    if (storage_.has_value(type_tag<T>{})) {
+      return storage_.get(type_tag<T>{});
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
+  template <typename T>
+  constexpr auto&& get() && {
+    if (storage_.has_value(type_tag<T>{})) {
+      return std::move(storage_.get(type_tag<T>{}));
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
+  template <typename T>
+  constexpr const auto&& get() const&& {
+    if (storage_.has_value(type_tag<T>{})) {
+      return std::move(storage_.get(type_tag<T>{}));
+    } else {
+      throw_bad_variant_access("Bad get<>() from variant!");
+    }
+  }
+
+  // Emplacement.
+
+  template <typename T, typename... Args>
+  constexpr emplace_constructible_by_type<T, Args&&...> emplace(Args&&... args) {
+    storage_.reset();
+    storage_.construct(type_tag<T>{}, std::forward<Args>(args)...);
+    return storage_.get(type_tag<T>{});
+  }
+
+  template <typename T, typename U, typename... Args>
+  constexpr emplace_constructible_by_type<T, std::initializer_list<U>&, Args&&...> emplace(
+      std::initializer_list<U> init_list, Args&&... args) {
+    storage_.reset();
+    storage_.construct(type_tag<T>{}, init_list, std::forward<Args>(args)...);
+    return storage_.get(type_tag<T>{});
+  }
+
+  template <size_t Index, typename... Args>
+  constexpr emplace_constructible_by_index<Index, Args&&...> emplace(Args&&... args) {
+    storage_.reset();
+    storage_.construct(index_tag<Index>{}, std::forward<Args>(args)...);
+    return storage_.get(index_tag<Index>{});
+  }
+
+  template <size_t Index, typename U, typename... Args>
+  constexpr emplace_constructible_by_index<Index, std::initializer_list<U>&, Args&&...> emplace(
+      std::initializer_list<U> init_list, Args&&... args) {
+    storage_.reset();
+    storage_.construct(index_tag<Index>{}, init_list, std::forward<Args>(args)...);
+    return storage_.get(index_tag<Index>{});
+  }
+
+  // Swap.
+
+  void swap(variant& other) { storage_.swap(other.storage_); }
+
+  // Comparison.
+
+  friend constexpr bool operator==(const variant& lhs, const variant& rhs) {
+    bool result = false;
+    const bool has_value =
+        lhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (lhs.index() != rhs.index()) {
+            result = false;
+          } else {
+            result = lhs.storage_.get(active_index_tag) == rhs.storage_.get(active_index_tag);
+          }
+        });
+    return !has_value || result;
+  }
+  friend constexpr bool operator!=(const variant& lhs, const variant& rhs) {
+    bool result = true;
+    const bool has_value =
+        lhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (lhs.index() != rhs.index()) {
+            result = true;
+          } else {
+            result = lhs.storage_.get(active_index_tag) != rhs.storage_.get(active_index_tag);
+          }
+        });
+    return has_value && result;
+  }
+  friend constexpr bool operator<(const variant& lhs, const variant& rhs) {
+    bool result = true;
+    const bool has_value =
+        rhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (lhs.storage_.is_empty()) {
+            result = true;
+          } else if (lhs.index() < rhs.index()) {
+            result = true;
+          } else if (lhs.index() > rhs.index()) {
+            result = false;
+          } else {
+            result = lhs.storage_.get(active_index_tag) < rhs.storage_.get(active_index_tag);
+          }
+        });
+    return has_value && result;
+  }
+  friend constexpr bool operator>(const variant& lhs, const variant& rhs) {
+    bool result = true;
+    const bool has_value =
+        lhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (rhs.storage_.is_empty()) {
+            result = true;
+          } else if (lhs.index() > rhs.index()) {
+            result = true;
+          } else if (lhs.index() < rhs.index()) {
+            result = false;
+          } else {
+            result = lhs.storage_.get(active_index_tag) > rhs.storage_.get(active_index_tag);
+          }
+        });
+    return has_value && result;
+  }
+  friend constexpr bool operator<=(const variant& lhs, const variant& rhs) {
+    bool result = false;
+    const bool has_value =
+        lhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (rhs.storage_.is_empty()) {
+            result = false;
+          } else if (lhs.index() < rhs.index()) {
+            result = true;
+          } else if (lhs.index() > rhs.index()) {
+            result = false;
+          } else {
+            result = lhs.storage_.get(active_index_tag) <= rhs.storage_.get(active_index_tag);
+          }
+        });
+    return !has_value || result;
+  }
+  friend constexpr bool operator>=(const variant& lhs, const variant& rhs) {
+    bool result = false;
+    const bool has_value =
+        rhs.storage_.visit([&result, &lhs, &rhs](auto, auto active_index_tag, const auto*) {
+          if (lhs.storage_.is_empty()) {
+            result = false;
+          } else if (lhs.index() > rhs.index()) {
+            result = true;
+          } else if (lhs.index() < rhs.index()) {
+            result = false;
+          } else {
+            result = lhs.storage_.get(active_index_tag) >= rhs.storage_.get(active_index_tag);
+          }
+        });
+    return !has_value || result;
+  }
+
+ private:
+  ::fit::internal::storage_type<Ts...> storage_;
 };
 
 // Swaps variants.
 template <typename... Ts>
 void swap(variant<Ts...>& a, variant<Ts...>& b) {
-    a.swap(b);
+  a.swap(b);
 }
 
-// Gets the type of a variant alternative with the given index.
-template <size_t index, typename Variant>
-struct variant_alternative;
+// Accesses the variant by zero-based index.
+//
+// Accesses should use ADL, similar to the pattern for std::swap:
+//
+//  using std::get;
+//  get<some_index>(some_fit_variant);
+//
+// This makes code adaptable to substituting std::variant for fit::variant on
+// newer compilers.
+template <size_t Index, typename... Ts>
+constexpr auto& get(variant<Ts...>& value) {
+  return value.template get<Index>();
+}
+template <size_t Index, typename... Ts>
+constexpr auto&& get(variant<Ts...>&& value) {
+  return std::move(value).template get<Index>();
+}
+template <size_t Index, typename... Ts>
+constexpr const auto& get(const variant<Ts...>& value) {
+  return value.template get<Index>();
+}
+template <size_t Index, typename... Ts>
+constexpr const auto&& get(const variant<Ts...>&& value) {
+  return std::move(value).template get<Index>();
+}
 
-template <size_t index, typename T0, typename... Ts>
-struct variant_alternative<index, variant<T0, Ts...>>
-    : variant_alternative<index - 1, variant<Ts...>> {};
+// Accesses the variant by unique type. See note above about ADL.
+template <typename T, typename... Ts>
+constexpr auto& get(variant<Ts...>& value) {
+  return value.template get<T>();
+}
+template <typename T, typename... Ts>
+constexpr auto&& get(variant<Ts...>&& value) {
+  return std::move(value).template get<T>();
+}
+template <typename T, typename... Ts>
+constexpr const auto& get(const variant<Ts...>& value) {
+  return value.template get<T>();
+}
+template <typename T, typename... Ts>
+constexpr const auto&& get(const variant<Ts...>&& value) {
+  return std::move(value).template get<T>();
+}
 
-template <typename T0, typename... Ts>
-struct variant_alternative<0, variant<T0, Ts...>> {
-    using type = T0;
-};
+// Checks if the variant holds type T. See note above about ADL.
+template <typename T, typename... Ts>
+constexpr bool holds_alternative(const variant<Ts...>& value) {
+  constexpr auto index = ::fit::internal::selected_index<T, variant<Ts...>>::value;
+  return value.index() == index;
+}
 
-template <size_t index, typename Variant>
-using variant_alternative_t = typename variant_alternative<index, Variant>::type;
+// TODO(eieio): Remove once the old ::fit::internal spellings of these types is
+// removed from FIDL.
+namespace internal {
 
-} // namespace internal
-} // namespace fit
+using ::fit::monostate;
+using ::fit::variant;
 
-#endif // LIB_FIT_VARIANT_H_
+}  // namespace internal
+
+}  // namespace fit
+
+#endif  // LIB_FIT_VARIANT_H_
diff --git a/pkg/fit/meta.json b/pkg/fit/meta.json
index db86eb9..1cfa090 100644
--- a/pkg/fit/meta.json
+++ b/pkg/fit/meta.json
@@ -1,57 +1,44 @@
 {
-  "banjo_deps": [], 
-  "deps": [], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/fit/promise.cpp", 
-    "pkg/fit/scheduler.cpp", 
-    "pkg/fit/sequencer.cpp", 
-    "pkg/fit/single_threaded_executor.cpp", 
-    "pkg/fit/include/lib/fit/bridge.h", 
-    "pkg/fit/include/lib/fit/bridge_internal.h", 
-    "pkg/fit/include/lib/fit/defer.h", 
-    "pkg/fit/include/lib/fit/function.h", 
-    "pkg/fit/include/lib/fit/function_internal.h", 
-    "pkg/fit/include/lib/fit/function_traits.h", 
-    "pkg/fit/include/lib/fit/nullable.h", 
-    "pkg/fit/include/lib/fit/optional.h", 
-    "pkg/fit/include/lib/fit/promise.h", 
-    "pkg/fit/include/lib/fit/promise_internal.h", 
-    "pkg/fit/include/lib/fit/result.h", 
-    "pkg/fit/include/lib/fit/scheduler.h", 
-    "pkg/fit/include/lib/fit/sequencer.h", 
-    "pkg/fit/include/lib/fit/single_threaded_executor.h", 
-    "pkg/fit/include/lib/fit/thread_safety.h", 
-    "pkg/fit/include/lib/fit/traits.h", 
-    "pkg/fit/include/lib/fit/variant.h"
-  ], 
+  "banjo_deps": [],
+  "deps": [],
+  "fidl_deps": [],
   "headers": [
-    "pkg/fit/include/lib/fit/bridge.h", 
-    "pkg/fit/include/lib/fit/bridge_internal.h", 
-    "pkg/fit/include/lib/fit/defer.h", 
-    "pkg/fit/include/lib/fit/function.h", 
-    "pkg/fit/include/lib/fit/function_internal.h", 
-    "pkg/fit/include/lib/fit/function_traits.h", 
-    "pkg/fit/include/lib/fit/nullable.h", 
-    "pkg/fit/include/lib/fit/optional.h", 
-    "pkg/fit/include/lib/fit/promise.h", 
-    "pkg/fit/include/lib/fit/promise_internal.h", 
-    "pkg/fit/include/lib/fit/result.h", 
-    "pkg/fit/include/lib/fit/scheduler.h", 
-    "pkg/fit/include/lib/fit/sequencer.h", 
-    "pkg/fit/include/lib/fit/single_threaded_executor.h", 
-    "pkg/fit/include/lib/fit/thread_safety.h", 
-    "pkg/fit/include/lib/fit/traits.h", 
+    "pkg/fit/include/lib/fit/barrier.h",
+    "pkg/fit/include/lib/fit/bridge.h",
+    "pkg/fit/include/lib/fit/bridge_internal.h",
+    "pkg/fit/include/lib/fit/constructors_internal.h",
+    "pkg/fit/include/lib/fit/defer.h",
+    "pkg/fit/include/lib/fit/function.h",
+    "pkg/fit/include/lib/fit/function_internal.h",
+    "pkg/fit/include/lib/fit/function_traits.h",
+    "pkg/fit/include/lib/fit/in_place_internal.h",
+    "pkg/fit/include/lib/fit/nullable.h",
+    "pkg/fit/include/lib/fit/optional.h",
+    "pkg/fit/include/lib/fit/promise.h",
+    "pkg/fit/include/lib/fit/promise_internal.h",
+    "pkg/fit/include/lib/fit/result.h",
+    "pkg/fit/include/lib/fit/scheduler.h",
+    "pkg/fit/include/lib/fit/scope.h",
+    "pkg/fit/include/lib/fit/sequencer.h",
+    "pkg/fit/include/lib/fit/single_threaded_executor.h",
+    "pkg/fit/include/lib/fit/storage_internal.h",
+    "pkg/fit/include/lib/fit/source_location.h",
+    "pkg/fit/include/lib/fit/string_view.h",
+    "pkg/fit/include/lib/fit/thread_safety.h",
+    "pkg/fit/include/lib/fit/traits.h",
+    "pkg/fit/include/lib/fit/utility_internal.h",
     "pkg/fit/include/lib/fit/variant.h"
-  ], 
-  "include_dir": "pkg/fit/include", 
-  "name": "fit", 
-  "root": "pkg/fit", 
+  ],
+  "include_dir": "pkg/fit/include",
+  "name": "fit",
+  "root": "pkg/fit",
   "sources": [
-    "pkg/fit/promise.cpp", 
-    "pkg/fit/scheduler.cpp", 
-    "pkg/fit/sequencer.cpp", 
-    "pkg/fit/single_threaded_executor.cpp"
-  ], 
+    "pkg/fit/barrier.cc",
+    "pkg/fit/promise.cc",
+    "pkg/fit/scheduler.cc",
+    "pkg/fit/scope.cc",
+    "pkg/fit/sequencer.cc",
+    "pkg/fit/single_threaded_executor.cc"
+  ],
   "type": "cc_source_library"
 }
\ No newline at end of file
diff --git a/pkg/fit/promise.cc b/pkg/fit/promise.cc
new file mode 100644
index 0000000..f25e8ab
--- /dev/null
+++ b/pkg/fit/promise.cc
@@ -0,0 +1,58 @@
+// 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.
+
+#include <lib/fit/promise.h>
+
+namespace fit {
+
+suspended_task::suspended_task(const suspended_task& other)
+    : resolver_(other.resolver_),
+      ticket_(resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0) {}
+
+suspended_task::suspended_task(suspended_task&& other)
+    : resolver_(other.resolver_), ticket_(other.ticket_) {
+  other.resolver_ = nullptr;
+}
+
+suspended_task::~suspended_task() { reset(); }
+
+void suspended_task::resolve(bool resume_task) {
+  if (resolver_) {
+    // Move the ticket to the stack to guard against possible re-entrance
+    // occurring as a side-effect of the task's own destructor running.
+    resolver* cached_resolver = resolver_;
+    ticket cached_ticket = ticket_;
+    resolver_ = nullptr;
+    cached_resolver->resolve_ticket(cached_ticket, resume_task);
+  }
+}
+
+suspended_task& suspended_task::operator=(const suspended_task& other) {
+  if (this != &other) {
+    reset();
+    resolver_ = other.resolver_;
+    ticket_ = resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0;
+  }
+  return *this;
+}
+
+suspended_task& suspended_task::operator=(suspended_task&& other) {
+  if (this != &other) {
+    reset();
+    resolver_ = other.resolver_;
+    ticket_ = other.ticket_;
+    other.resolver_ = nullptr;
+  }
+  return *this;
+}
+
+void suspended_task::swap(suspended_task& other) {
+  if (this != &other) {
+    using std::swap;
+    swap(resolver_, other.resolver_);
+    swap(ticket_, other.ticket_);
+  }
+}
+
+}  // namespace fit
diff --git a/pkg/fit/promise.cpp b/pkg/fit/promise.cpp
deleted file mode 100644
index 8309f00..0000000
--- a/pkg/fit/promise.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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.
-
-// Can't compile this for Zircon userspace yet since libstdc++ isn't available.
-#ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
-
-#include <lib/fit/promise.h>
-
-namespace fit {
-
-suspended_task::suspended_task(const suspended_task& other)
-    : resolver_(other.resolver_),
-      ticket_(resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0) {}
-
-suspended_task::suspended_task(suspended_task&& other)
-    : resolver_(other.resolver_), ticket_(other.ticket_) {
-    other.resolver_ = nullptr;
-}
-
-suspended_task::~suspended_task() {
-    reset();
-}
-
-void suspended_task::resolve(bool resume_task) {
-    if (resolver_) {
-        // Move the ticket to the stack to guard against possible re-entrance
-        // occurring as a side-effect of the task's own destructor running.
-        resolver* cached_resolver = resolver_;
-        ticket cached_ticket = ticket_;
-        resolver_ = nullptr;
-        cached_resolver->resolve_ticket(cached_ticket, resume_task);
-    }
-}
-
-suspended_task& suspended_task::operator=(const suspended_task& other) {
-    if (this != &other) {
-        reset();
-        resolver_ = other.resolver_;
-        ticket_ = resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0;
-    }
-    return *this;
-}
-
-suspended_task& suspended_task::operator=(suspended_task&& other) {
-    if (this != &other) {
-        reset();
-        resolver_ = other.resolver_;
-        ticket_ = other.ticket_;
-        other.resolver_ = nullptr;
-    }
-    return *this;
-}
-
-} // namespace fit
-
-#endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE
diff --git a/pkg/fit/scheduler.cc b/pkg/fit/scheduler.cc
new file mode 100644
index 0000000..144cc76
--- /dev/null
+++ b/pkg/fit/scheduler.cc
@@ -0,0 +1,122 @@
+// 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.
+
+#include <lib/fit/scheduler.h>
+
+#include <map>
+#include <queue>
+#include <utility>
+
+namespace fit {
+namespace subtle {
+
+scheduler::scheduler() = default;
+
+scheduler::~scheduler() = default;
+
+void scheduler::schedule_task(pending_task task) {
+  assert(task);
+  runnable_tasks_.push(std::move(task));
+}
+
+suspended_task::ticket scheduler::obtain_ticket(uint32_t initial_refs) {
+  suspended_task::ticket ticket = next_ticket_++;
+  tickets_.emplace(ticket, ticket_record(initial_refs));
+  return ticket;
+}
+
+void scheduler::finalize_ticket(suspended_task::ticket ticket, pending_task* task) {
+  auto it = tickets_.find(ticket);
+  assert(it != tickets_.end());
+  assert(!it->second.task);
+  assert(it->second.ref_count > 0);
+  assert(task);
+
+  it->second.ref_count--;
+  if (!*task) {
+    // task already finished
+  } else if (it->second.was_resumed) {
+    // task immediately became runnable
+    runnable_tasks_.push(std::move(*task));
+  } else if (it->second.ref_count > 0) {
+    // task remains suspended
+    it->second.task = std::move(*task);
+    suspended_task_count_++;
+  }  // else, task was abandoned and caller retains ownership of it
+  if (it->second.ref_count == 0) {
+    tickets_.erase(it);
+  }
+}
+
+void scheduler::duplicate_ticket(suspended_task::ticket ticket) {
+  auto it = tickets_.find(ticket);
+  assert(it != tickets_.end());
+  assert(it->second.ref_count > 0);
+
+  it->second.ref_count++;
+  assert(it->second.ref_count != 0);  // did we really make 4 billion refs?!
+}
+
+pending_task scheduler::release_ticket(suspended_task::ticket ticket) {
+  auto it = tickets_.find(ticket);
+  assert(it != tickets_.end());
+  assert(it->second.ref_count > 0);
+
+  it->second.ref_count--;
+  if (it->second.ref_count == 0) {
+    pending_task task = std::move(it->second.task);
+    if (task) {
+      assert(suspended_task_count_ > 0);
+      suspended_task_count_--;
+    }
+    tickets_.erase(it);
+    return task;
+  }
+  return pending_task();
+}
+
+bool scheduler::resume_task_with_ticket(suspended_task::ticket ticket) {
+  auto it = tickets_.find(ticket);
+  assert(it != tickets_.end());
+  assert(it->second.ref_count > 0);
+
+  bool did_resume = false;
+  it->second.ref_count--;
+  if (!it->second.was_resumed) {
+    it->second.was_resumed = true;
+    if (it->second.task) {
+      did_resume = true;
+      assert(suspended_task_count_ > 0);
+      suspended_task_count_--;
+      runnable_tasks_.push(std::move(it->second.task));
+    }
+  }
+  if (it->second.ref_count == 0) {
+    tickets_.erase(it);
+  }
+  return did_resume;
+}
+
+void scheduler::take_runnable_tasks(task_queue* tasks) {
+  assert(tasks && tasks->empty());
+  runnable_tasks_.swap(*tasks);
+}
+
+void scheduler::take_all_tasks(task_queue* tasks) {
+  assert(tasks && tasks->empty());
+
+  runnable_tasks_.swap(*tasks);
+  if (suspended_task_count_ > 0) {
+    for (auto& item : tickets_) {
+      if (item.second.task) {
+        assert(suspended_task_count_ > 0);
+        suspended_task_count_--;
+        tasks->push(std::move(item.second.task));
+      }
+    }
+  }
+}
+
+}  // namespace subtle
+}  // namespace fit
diff --git a/pkg/fit/scheduler.cpp b/pkg/fit/scheduler.cpp
deleted file mode 100644
index 69acc03..0000000
--- a/pkg/fit/scheduler.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// 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.
-
-// Can't compile this for Zircon userspace yet since libstdc++ isn't available.
-#ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
-
-#include <lib/fit/scheduler.h>
-
-#include <map>
-#include <queue>
-#include <utility>
-
-namespace fit {
-namespace subtle {
-
-scheduler::scheduler() = default;
-
-scheduler::~scheduler() = default;
-
-void scheduler::schedule_task(pending_task task) {
-    assert(task);
-    runnable_tasks_.push(std::move(task));
-}
-
-suspended_task::ticket scheduler::obtain_ticket(uint32_t initial_refs) {
-    suspended_task::ticket ticket = next_ticket_++;
-    tickets_.emplace(ticket, ticket_record(initial_refs));
-    return ticket;
-}
-
-void scheduler::finalize_ticket(suspended_task::ticket ticket,
-                                pending_task* task) {
-    auto it = tickets_.find(ticket);
-    assert(it != tickets_.end());
-    assert(!it->second.task);
-    assert(it->second.ref_count > 0);
-    assert(task);
-
-    it->second.ref_count--;
-    if (!*task) {
-        // task already finished
-    } else if (it->second.was_resumed) {
-        // task immediately became runnable
-        runnable_tasks_.push(std::move(*task));
-    } else if (it->second.ref_count > 0) {
-        // task remains suspended
-        it->second.task = std::move(*task);
-        suspended_task_count_++;
-    } // else, task was abandoned and caller retains ownership of it
-    if (it->second.ref_count == 0) {
-        tickets_.erase(it);
-    }
-}
-
-void scheduler::duplicate_ticket(suspended_task::ticket ticket) {
-    auto it = tickets_.find(ticket);
-    assert(it != tickets_.end());
-    assert(it->second.ref_count > 0);
-
-    it->second.ref_count++;
-    assert(it->second.ref_count != 0); // did we really make 4 billion refs?!
-}
-
-pending_task scheduler::release_ticket(suspended_task::ticket ticket) {
-    auto it = tickets_.find(ticket);
-    assert(it != tickets_.end());
-    assert(it->second.ref_count > 0);
-
-    it->second.ref_count--;
-    if (it->second.ref_count == 0) {
-        pending_task task = std::move(it->second.task);
-        if (task) {
-            assert(suspended_task_count_ > 0);
-            suspended_task_count_--;
-        }
-        tickets_.erase(it);
-        return task;
-    }
-    return pending_task();
-}
-
-bool scheduler::resume_task_with_ticket(suspended_task::ticket ticket) {
-    auto it = tickets_.find(ticket);
-    assert(it != tickets_.end());
-    assert(it->second.ref_count > 0);
-
-    bool did_resume = false;
-    it->second.ref_count--;
-    if (!it->second.was_resumed) {
-        it->second.was_resumed = true;
-        if (it->second.task) {
-            did_resume = true;
-            assert(suspended_task_count_ > 0);
-            suspended_task_count_--;
-            runnable_tasks_.push(std::move(it->second.task));
-        }
-    }
-    if (it->second.ref_count == 0) {
-        tickets_.erase(it);
-    }
-    return did_resume;
-}
-
-void scheduler::take_runnable_tasks(task_queue* tasks) {
-    assert(tasks && tasks->empty());
-    runnable_tasks_.swap(*tasks);
-}
-
-void scheduler::take_all_tasks(task_queue* tasks) {
-    assert(tasks && tasks->empty());
-
-    runnable_tasks_.swap(*tasks);
-    if (suspended_task_count_ > 0) {
-        for (auto& item : tickets_) {
-            if (item.second.task) {
-                assert(suspended_task_count_ > 0);
-                suspended_task_count_--;
-                tasks->push(std::move(item.second.task));
-            }
-        }
-    }
-}
-
-} // namespace subtle
-} // namespace fit
-
-#endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE
diff --git a/pkg/fit/scope.cc b/pkg/fit/scope.cc
new file mode 100644
index 0000000..8777f4a
--- /dev/null
+++ b/pkg/fit/scope.cc
@@ -0,0 +1,143 @@
+// 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.
+
+#include <lib/fit/scope.h>
+
+namespace fit {
+
+scope::scope() : state_(new state()) {}
+
+scope::~scope() { state_->exit(true /*scope_was_destroyed*/); }
+
+scope::state::state() = default;
+
+scope::state::~state() {
+  assert(acquired_promise_count_.load(std::memory_order_relaxed) == scope_exited);
+  assert(scope_was_destroyed_);
+  assert(promise_handle_count_ == 0);
+  assert(head_promise_holder_ == nullptr);
+}
+
+bool scope::state::exited() const {
+  return acquired_promise_count_.load(std::memory_order_relaxed) & scope_exited;
+}
+
+void scope::state::exit(bool scope_was_destroyed) {
+  promise_holder_base* release_head = nullptr;
+  bool delete_self = false;
+  {
+    std::lock_guard<std::mutex> lock(mutex_);
+    assert(!scope_was_destroyed_);
+    scope_was_destroyed_ = scope_was_destroyed;
+
+    // Atomically exit the scope.  We cannot do this safely if there are
+    // any running promises since they might still be accessing state which
+    // is guarded by the scope.  Worse, if a promise re-entrantly destroys
+    // the scope during its execution then as a side-effect the promise
+    // itself will be destroyed.  So assert!
+    uint64_t prior_count =
+        acquired_promise_count_.exchange(scope_exited, std::memory_order_relaxed);
+    if (!(prior_count & scope_exited)) {
+      // Cannot exit fit::scope while any of its promises are running!
+      assert(prior_count == 0);
+
+      // Take the promises so they can be deleted outside of the lock.
+      release_head = head_promise_holder_;
+      head_promise_holder_ = nullptr;
+    }
+
+    // If there are no more handles then we can delete the state now.
+    delete_self = should_delete_self();
+  }
+
+  // Delete aborted promises and self outside of the lock.
+  while (release_head) {
+    promise_holder_base* release_next = release_head->next;
+    delete release_head;
+    release_head = release_next;
+  }
+  if (delete_self) {
+    delete this;
+  }
+}
+
+scope::promise_handle scope::state::adopt_promise(promise_holder_base* promise_holder) {
+  {
+    std::lock_guard<std::mutex> lock(mutex_);
+    assert(!scope_was_destroyed_);  // otherwise how did we get here?
+
+    // If the scope hasn't been exited yet, link the promise and mint
+    // a new handle.  Otherwise we will abort the promise.
+    if (!exited()) {
+      if (head_promise_holder_) {
+        head_promise_holder_->prev = promise_holder;
+        promise_holder->next = head_promise_holder_;
+      }
+      head_promise_holder_ = promise_holder;
+      promise_handle_count_++;
+      return promise_handle(this, promise_holder);
+    }
+  }
+
+  // Delete aborted promise outside of the lock.
+  delete promise_holder;
+  return promise_handle{};
+}
+
+void scope::state::drop_promise(promise_handle promise_handle) {
+  if (!promise_handle.promise_holder_) {
+    return;  // invalid handle, nothing to do
+  }
+
+  {
+    std::lock_guard<std::mutex> lock(promise_handle.state_->mutex_);
+
+    // If the scope hasn't been exited yet, unlink the promise and
+    // prepare to destroy it.  Otherwise, it's already been unlinked
+    // and destroyed so release the handle but don't touch the pointer!
+    assert(promise_handle.state_->promise_handle_count_ > 0);
+    promise_handle.state_->promise_handle_count_--;
+    if (!promise_handle.state_->exited()) {
+      if (promise_handle.promise_holder_->next) {
+        promise_handle.promise_holder_->next->prev = promise_handle.promise_holder_->prev;
+      }
+      if (promise_handle.promise_holder_->prev) {
+        promise_handle.promise_holder_->prev->next = promise_handle.promise_holder_->next;
+      } else {
+        promise_handle.state_->head_promise_holder_ = promise_handle.promise_holder_->next;
+      }
+      // Fallthrough to delete the promise.
+    } else if (!promise_handle.state_->should_delete_self()) {
+      return;
+    } else {
+      // Fallthrough to delete self.
+      promise_handle.promise_holder_ = nullptr;
+    }
+  }
+
+  // Delete the promise or scope outside of the lock.
+  if (promise_handle.promise_holder_) {
+    delete promise_handle.promise_holder_;
+  } else {
+    delete promise_handle.state_;
+  }
+}
+
+scope::promise_holder_base* scope::state::try_acquire_promise(promise_handle promise_handle) {
+  if (promise_handle.promise_holder_) {
+    uint64_t prior_count =
+        promise_handle.state_->acquired_promise_count_.fetch_add(1u, std::memory_order_relaxed);
+    if (!(prior_count & scope_exited)) {
+      return promise_handle.promise_holder_;
+    }
+    promise_handle.state_->acquired_promise_count_.fetch_sub(1u, std::memory_order_relaxed);
+  }
+  return nullptr;
+}
+
+void scope::state::release_promise(promise_handle promise_handle) {
+  promise_handle.state_->acquired_promise_count_.fetch_sub(1u, std::memory_order_relaxed);
+}
+
+}  // namespace fit
diff --git a/pkg/fit/sequencer.cc b/pkg/fit/sequencer.cc
new file mode 100644
index 0000000..69d4da0
--- /dev/null
+++ b/pkg/fit/sequencer.cc
@@ -0,0 +1,26 @@
+// 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.
+
+#include <lib/fit/sequencer.h>
+
+namespace fit {
+
+sequencer::sequencer() {
+  // Capture a new consumer and intentionally abandon its associated
+  // completer so that a promise chained onto the consumer using
+  // |promise_or()| will become immediately runnable.
+  fit::bridge<> bridge;
+  prior_ = std::move(bridge.consumer);
+}
+
+sequencer::~sequencer() = default;
+
+fit::consumer<> sequencer::swap_prior(fit::consumer<> new_prior) {
+  std::lock_guard<std::mutex> lock(mutex_);
+  fit::consumer<> old_prior = std::move(prior_);
+  prior_ = std::move(new_prior);
+  return old_prior;
+}
+
+}  // namespace fit
diff --git a/pkg/fit/sequencer.cpp b/pkg/fit/sequencer.cpp
deleted file mode 100644
index 687db67..0000000
--- a/pkg/fit/sequencer.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.
-
-// Can't compile this for Zircon userspace yet since libstdc++ isn't available.
-#ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
-
-#include <lib/fit/sequencer.h>
-
-namespace fit {
-
-sequencer::sequencer() {
-    // Capture a new consumer and intentionally abandon its associated
-    // completer so that a promise chained onto the consumer using
-    // |promise_or()| will become immediately runnable.
-    fit::bridge<> bridge;
-    prior_ = std::move(bridge.consumer());
-}
-
-sequencer::~sequencer() = default;
-
-fit::consumer<> sequencer::swap_prior(fit::consumer<> new_prior) {
-    std::lock_guard<std::mutex> lock(mutex_);
-    fit::consumer<> old_prior = std::move(prior_);
-    prior_ = std::move(new_prior);
-    return old_prior;
-}
-
-} // namespace fit
-
-#endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE
diff --git a/pkg/fit/single_threaded_executor.cc b/pkg/fit/single_threaded_executor.cc
new file mode 100644
index 0000000..9b3909f
--- /dev/null
+++ b/pkg/fit/single_threaded_executor.cc
@@ -0,0 +1,224 @@
+// 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.
+
+#include <condition_variable>
+#include <mutex>
+
+#include <lib/fit/single_threaded_executor.h>
+#include <lib/fit/thread_safety.h>
+
+namespace fit {
+
+// The dispatcher runs tasks and provides the suspended task resolver.
+//
+// The lifetime of this object is somewhat complex since there are pointers
+// to it from multiple sources which are released in different ways.
+//
+// - |single_threaded_executor| holds a pointer in |dispatcher_| which it releases
+//   after calling |shutdown()| to inform the dispatcher of its own demise
+// - |suspended_task| holds a pointer to the dispatcher's resolver
+//   interface and the number of outstanding pointers corresponds to the
+//   number of outstanding suspended task tickets tracked by |scheduler_|.
+//
+// The dispatcher deletes itself once all pointers have been released.
+class single_threaded_executor::dispatcher_impl final : public suspended_task::resolver {
+ public:
+  dispatcher_impl();
+
+  void shutdown();
+  void schedule_task(pending_task task);
+  void run(context_impl& context);
+  suspended_task suspend_current_task();
+
+  suspended_task::ticket duplicate_ticket(suspended_task::ticket ticket) override;
+  void resolve_ticket(suspended_task::ticket ticket, bool resume_task) override;
+
+ private:
+  ~dispatcher_impl() override;
+
+  void wait_for_runnable_tasks(fit::subtle::scheduler::task_queue* out_tasks);
+  void run_task(pending_task* task, context& context);
+
+  suspended_task::ticket current_task_ticket_ = 0;
+  std::condition_variable wake_;
+
+  // A bunch of state that is guarded by a mutex.
+  struct {
+    std::mutex mutex_;
+    bool was_shutdown_ FIT_GUARDED(mutex_) = false;
+    bool need_wake_ FIT_GUARDED(mutex_) = false;
+    fit::subtle::scheduler scheduler_ FIT_GUARDED(mutex_);
+  } guarded_;
+};
+
+single_threaded_executor::single_threaded_executor()
+    : context_(this), dispatcher_(new dispatcher_impl()) {}
+
+single_threaded_executor::~single_threaded_executor() { dispatcher_->shutdown(); }
+
+void single_threaded_executor::schedule_task(pending_task task) {
+  assert(task);
+  dispatcher_->schedule_task(std::move(task));
+}
+
+void single_threaded_executor::run() { dispatcher_->run(context_); }
+
+single_threaded_executor::context_impl::context_impl(single_threaded_executor* executor)
+    : executor_(executor) {}
+
+single_threaded_executor::context_impl::~context_impl() = default;
+
+single_threaded_executor* single_threaded_executor::context_impl::executor() const {
+  return executor_;
+}
+
+suspended_task single_threaded_executor::context_impl::suspend_task() {
+  return executor_->dispatcher_->suspend_current_task();
+}
+
+single_threaded_executor::dispatcher_impl::dispatcher_impl() = default;
+
+single_threaded_executor::dispatcher_impl::~dispatcher_impl() {
+  std::lock_guard<std::mutex> lock(guarded_.mutex_);
+  assert(guarded_.was_shutdown_);
+  assert(!guarded_.scheduler_.has_runnable_tasks());
+  assert(!guarded_.scheduler_.has_suspended_tasks());
+  assert(!guarded_.scheduler_.has_outstanding_tickets());
+}
+
+void single_threaded_executor::dispatcher_impl::shutdown() {
+  fit::subtle::scheduler::task_queue tasks;  // drop outside of the lock
+  {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    assert(!guarded_.was_shutdown_);
+    guarded_.was_shutdown_ = true;
+    guarded_.scheduler_.take_all_tasks(&tasks);
+    if (guarded_.scheduler_.has_outstanding_tickets()) {
+      return;  // can't delete self yet
+    }
+  }
+
+  // Must destroy self outside of the lock.
+  delete this;
+}
+
+void single_threaded_executor::dispatcher_impl::schedule_task(pending_task task) {
+  {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    assert(!guarded_.was_shutdown_);
+    guarded_.scheduler_.schedule_task(std::move(task));
+    if (!guarded_.need_wake_) {
+      return;  // don't need to wake
+    }
+    guarded_.need_wake_ = false;
+  }
+
+  // It is more efficient to notify outside the lock.
+  wake_.notify_one();
+}
+
+void single_threaded_executor::dispatcher_impl::run(context_impl& context) {
+  fit::subtle::scheduler::task_queue tasks;
+  for (;;) {
+    wait_for_runnable_tasks(&tasks);
+    if (tasks.empty()) {
+      return;  // all done!
+    }
+
+    do {
+      run_task(&tasks.front(), context);
+      tasks.pop();  // the task may be destroyed here if it was not suspended
+    } while (!tasks.empty());
+  }
+}
+
+// Must only be called while |run_task()| is running a task.
+// This happens when the task's continuation calls |context::suspend_task()|
+// upon the context it received as an argument.
+suspended_task single_threaded_executor::dispatcher_impl::suspend_current_task() {
+  std::lock_guard<std::mutex> lock(guarded_.mutex_);
+  assert(!guarded_.was_shutdown_);
+  if (current_task_ticket_ == 0) {
+    current_task_ticket_ = guarded_.scheduler_.obtain_ticket(2 /*initial_refs*/);
+  } else {
+    guarded_.scheduler_.duplicate_ticket(current_task_ticket_);
+  }
+  return suspended_task(this, current_task_ticket_);
+}
+
+// Unfortunately std::unique_lock does not support thread-safety annotations
+void single_threaded_executor::dispatcher_impl::wait_for_runnable_tasks(
+    fit::subtle::scheduler::task_queue* out_tasks) FIT_NO_THREAD_SAFETY_ANALYSIS {
+  std::unique_lock<std::mutex> lock(guarded_.mutex_);
+  for (;;) {
+    assert(!guarded_.was_shutdown_);
+    guarded_.scheduler_.take_runnable_tasks(out_tasks);
+    if (!out_tasks->empty()) {
+      return;  // got some tasks
+    }
+    if (!guarded_.scheduler_.has_suspended_tasks()) {
+      return;  // all done!
+    }
+    guarded_.need_wake_ = true;
+    wake_.wait(lock);
+    guarded_.need_wake_ = false;
+  }
+}
+
+void single_threaded_executor::dispatcher_impl::run_task(pending_task* task, context& context) {
+  assert(current_task_ticket_ == 0);
+  const bool finished = (*task)(context);
+  assert(!*task == finished);
+  (void)finished;
+  if (current_task_ticket_ == 0) {
+    return;  // task was not suspended, no ticket was produced
+  }
+
+  std::lock_guard<std::mutex> lock(guarded_.mutex_);
+  assert(!guarded_.was_shutdown_);
+  guarded_.scheduler_.finalize_ticket(current_task_ticket_, task);
+  current_task_ticket_ = 0;
+}
+
+suspended_task::ticket single_threaded_executor::dispatcher_impl::duplicate_ticket(
+    suspended_task::ticket ticket) {
+  std::lock_guard<std::mutex> lock(guarded_.mutex_);
+  guarded_.scheduler_.duplicate_ticket(ticket);
+  return ticket;
+}
+
+void single_threaded_executor::dispatcher_impl::resolve_ticket(suspended_task::ticket ticket,
+                                                               bool resume_task) {
+  pending_task abandoned_task;  // drop outside of the lock
+  bool do_wake = false;
+  {
+    std::lock_guard<std::mutex> lock(guarded_.mutex_);
+    if (resume_task) {
+      guarded_.scheduler_.resume_task_with_ticket(ticket);
+    } else {
+      abandoned_task = guarded_.scheduler_.release_ticket(ticket);
+    }
+    if (guarded_.was_shutdown_) {
+      assert(!guarded_.need_wake_);
+      if (guarded_.scheduler_.has_outstanding_tickets()) {
+        return;  // can't shutdown yet
+      }
+    } else if (guarded_.need_wake_ && (guarded_.scheduler_.has_runnable_tasks() ||
+                                       !guarded_.scheduler_.has_suspended_tasks())) {
+      guarded_.need_wake_ = false;
+      do_wake = true;
+    } else {
+      return;  // nothing else to do
+    }
+  }
+
+  // Must do this outside of the lock.
+  if (do_wake) {
+    wake_.notify_one();
+  } else {
+    delete this;
+  }
+}
+
+}  // namespace fit
diff --git a/pkg/fit/single_threaded_executor.cpp b/pkg/fit/single_threaded_executor.cpp
deleted file mode 100644
index ba738d0..0000000
--- a/pkg/fit/single_threaded_executor.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-// 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.
-
-// Can't compile this for Zircon userspace yet since libstdc++ isn't available.
-#ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
-
-#include <condition_variable>
-#include <mutex>
-
-#include <lib/fit/single_threaded_executor.h>
-#include <lib/fit/thread_safety.h>
-
-namespace fit {
-
-// The dispatcher runs tasks and provides the suspended task resolver.
-//
-// The lifetime of this object is somewhat complex since there are pointers
-// to it from multiple sources which are released in different ways.
-//
-// - |single_threaded_executor| holds a pointer in |dispatcher_| which it releases
-//   after calling |shutdown()| to inform the dispatcher of its own demise
-// - |suspended_task| holds a pointer to the dispatcher's resolver
-//   interface and the number of outstanding pointers corresponds to the
-//   number of outstanding suspended task tickets tracked by |scheduler_|.
-//
-// The dispatcher deletes itself once all pointers have been released.
-class single_threaded_executor::dispatcher_impl final
-    : public suspended_task::resolver {
-public:
-    dispatcher_impl();
-
-    void shutdown();
-    void schedule_task(pending_task task);
-    void run(context_impl& context);
-    suspended_task suspend_current_task();
-
-    suspended_task::ticket duplicate_ticket(
-        suspended_task::ticket ticket) override;
-    void resolve_ticket(
-        suspended_task::ticket ticket, bool resume_task) override;
-
-private:
-    ~dispatcher_impl() override;
-
-    void wait_for_runnable_tasks(
-        fit::subtle::scheduler::task_queue* out_tasks);
-    void run_task(pending_task* task, context& context);
-
-    suspended_task::ticket current_task_ticket_ = 0;
-    std::condition_variable wake_;
-
-    // A bunch of state that is guarded by a mutex.
-    struct {
-        std::mutex mutex_;
-        bool was_shutdown_ FIT_GUARDED(mutex_) = false;
-        bool need_wake_ FIT_GUARDED(mutex_) = false;
-        fit::subtle::scheduler scheduler_ FIT_GUARDED(mutex_);
-    } guarded_;
-};
-
-single_threaded_executor::single_threaded_executor()
-    : context_(this), dispatcher_(new dispatcher_impl()) {}
-
-single_threaded_executor::~single_threaded_executor() {
-    dispatcher_->shutdown();
-}
-
-void single_threaded_executor::schedule_task(pending_task task) {
-    assert(task);
-    dispatcher_->schedule_task(std::move(task));
-}
-
-void single_threaded_executor::run() {
-    dispatcher_->run(context_);
-}
-
-single_threaded_executor::context_impl::context_impl(single_threaded_executor* executor)
-    : executor_(executor) {}
-
-single_threaded_executor::context_impl::~context_impl() = default;
-
-single_threaded_executor* single_threaded_executor::context_impl::executor() const {
-    return executor_;
-}
-
-suspended_task single_threaded_executor::context_impl::suspend_task() {
-    return executor_->dispatcher_->suspend_current_task();
-}
-
-single_threaded_executor::dispatcher_impl::dispatcher_impl() = default;
-
-single_threaded_executor::dispatcher_impl::~dispatcher_impl() {
-    std::lock_guard<std::mutex> lock(guarded_.mutex_);
-    assert(guarded_.was_shutdown_);
-    assert(!guarded_.scheduler_.has_runnable_tasks());
-    assert(!guarded_.scheduler_.has_suspended_tasks());
-    assert(!guarded_.scheduler_.has_outstanding_tickets());
-}
-
-void single_threaded_executor::dispatcher_impl::shutdown() {
-    fit::subtle::scheduler::task_queue tasks; // drop outside of the lock
-    {
-        std::lock_guard<std::mutex> lock(guarded_.mutex_);
-        assert(!guarded_.was_shutdown_);
-        guarded_.was_shutdown_ = true;
-        guarded_.scheduler_.take_all_tasks(&tasks);
-        if (guarded_.scheduler_.has_outstanding_tickets()) {
-            return; // can't delete self yet
-        }
-    }
-
-    // Must destroy self outside of the lock.
-    delete this;
-}
-
-void single_threaded_executor::dispatcher_impl::schedule_task(pending_task task) {
-    {
-        std::lock_guard<std::mutex> lock(guarded_.mutex_);
-        assert(!guarded_.was_shutdown_);
-        guarded_.scheduler_.schedule_task(std::move(task));
-        if (!guarded_.need_wake_) {
-            return; // don't need to wake
-        }
-        guarded_.need_wake_ = false;
-    }
-
-    // It is more efficient to notify outside the lock.
-    wake_.notify_one();
-}
-
-void single_threaded_executor::dispatcher_impl::run(context_impl& context) {
-    fit::subtle::scheduler::task_queue tasks;
-    for (;;) {
-        wait_for_runnable_tasks(&tasks);
-        if (tasks.empty()) {
-            return; // all done!
-        }
-
-        do {
-            run_task(&tasks.front(), context);
-            tasks.pop(); // the task may be destroyed here if it was not suspended
-        } while (!tasks.empty());
-    }
-}
-
-// Must only be called while |run_task()| is running a task.
-// This happens when the task's continuation calls |context::suspend_task()|
-// upon the context it received as an argument.
-suspended_task single_threaded_executor::dispatcher_impl::suspend_current_task() {
-    std::lock_guard<std::mutex> lock(guarded_.mutex_);
-    assert(!guarded_.was_shutdown_);
-    if (current_task_ticket_ == 0) {
-        current_task_ticket_ = guarded_.scheduler_.obtain_ticket(
-            2 /*initial_refs*/);
-    } else {
-        guarded_.scheduler_.duplicate_ticket(current_task_ticket_);
-    }
-    return suspended_task(this, current_task_ticket_);
-}
-
-// Unfortunately std::unique_lock does not support thread-safety annotations
-void single_threaded_executor::dispatcher_impl::wait_for_runnable_tasks(
-    fit::subtle::scheduler::task_queue* out_tasks) FIT_NO_THREAD_SAFETY_ANALYSIS {
-    std::unique_lock<std::mutex> lock(guarded_.mutex_);
-    for (;;) {
-        assert(!guarded_.was_shutdown_);
-        guarded_.scheduler_.take_runnable_tasks(out_tasks);
-        if (!out_tasks->empty()) {
-            return; // got some tasks
-        }
-        if (!guarded_.scheduler_.has_suspended_tasks()) {
-            return; // all done!
-        }
-        guarded_.need_wake_ = true;
-        wake_.wait(lock);
-        guarded_.need_wake_ = false;
-    }
-}
-
-void single_threaded_executor::dispatcher_impl::run_task(pending_task* task,
-                                                         context& context) {
-    assert(current_task_ticket_ == 0);
-    const bool finished = (*task)(context);
-    assert(!*task == finished);
-    (void)finished;
-    if (current_task_ticket_ == 0) {
-        return; // task was not suspended, no ticket was produced
-    }
-
-    std::lock_guard<std::mutex> lock(guarded_.mutex_);
-    assert(!guarded_.was_shutdown_);
-    guarded_.scheduler_.finalize_ticket(current_task_ticket_, task);
-    current_task_ticket_ = 0;
-}
-
-suspended_task::ticket single_threaded_executor::dispatcher_impl::duplicate_ticket(
-    suspended_task::ticket ticket) {
-    std::lock_guard<std::mutex> lock(guarded_.mutex_);
-    guarded_.scheduler_.duplicate_ticket(ticket);
-    return ticket;
-}
-
-void single_threaded_executor::dispatcher_impl::resolve_ticket(
-    suspended_task::ticket ticket, bool resume_task) {
-    pending_task abandoned_task; // drop outside of the lock
-    bool do_wake = false;
-    {
-        std::lock_guard<std::mutex> lock(guarded_.mutex_);
-        if (resume_task) {
-            guarded_.scheduler_.resume_task_with_ticket(ticket);
-        } else {
-            abandoned_task = guarded_.scheduler_.release_ticket(ticket);
-        }
-        if (guarded_.was_shutdown_) {
-            assert(!guarded_.need_wake_);
-            if (guarded_.scheduler_.has_outstanding_tickets()) {
-                return; // can't shutdown yet
-            }
-        } else if (guarded_.need_wake_ &&
-                   (guarded_.scheduler_.has_runnable_tasks() ||
-                    !guarded_.scheduler_.has_suspended_tasks())) {
-            guarded_.need_wake_ = false;
-            do_wake = true;
-        } else {
-            return; // nothing else to do
-        }
-    }
-
-    // Must do this outside of the lock.
-    if (do_wake) {
-        wake_.notify_one();
-    } else {
-        delete this;
-    }
-}
-
-} // namespace fit
-
-#endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE
diff --git a/pkg/images_cpp/images.cc b/pkg/images_cpp/images.cc
deleted file mode 100644
index 17803c6..0000000
--- a/pkg/images_cpp/images.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// 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.
-
-#include "lib/images/cpp/images.h"
-
-#include <zircon/assert.h>
-
-namespace images {
-
-// Overall bits per pixel, across all pixel data in the whole image.
-size_t BitsPerPixel(const fuchsia::images::PixelFormat& pixel_format) {
-  switch (pixel_format) {
-    case fuchsia::images::PixelFormat::BGRA_8:
-      return 4u * 8u;
-    case fuchsia::images::PixelFormat::YUY2:
-      return 2u * 8u;
-    case fuchsia::images::PixelFormat::NV12:
-      return 12;
-    case fuchsia::images::PixelFormat::YV12:
-      return 12;
-  }
-  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
-  return 0;
-}
-
-size_t StrideBytesPerWidthPixel(
-    const fuchsia::images::PixelFormat& pixel_format) {
-  switch (pixel_format) {
-    case fuchsia::images::PixelFormat::BGRA_8:
-      return 4u;
-    case fuchsia::images::PixelFormat::YUY2:
-      return 2u;
-    case fuchsia::images::PixelFormat::NV12:
-      return 1u;
-    case fuchsia::images::PixelFormat::YV12:
-      return 1u;
-  }
-  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
-  return 0;
-}
-
-size_t MaxSampleAlignment(const fuchsia::images::PixelFormat& pixel_format) {
-  switch (pixel_format) {
-    case fuchsia::images::PixelFormat::BGRA_8:
-      return 4u;
-    case fuchsia::images::PixelFormat::YUY2:
-      return 2u;
-    case fuchsia::images::PixelFormat::NV12:
-      // In the sense that line stride "must preserve pixel alignment", which is
-      // what MaxSampleAlignment() is used for, NV12 ~~has (very roughly
-      // speaking) a pixel alignment of 2, ~~because the width of the Y plane in
-      // this implementation must be even, and ~because the interleaved UV data
-      // after the planar Y data is 2 bytes per sample, so we may as well
-      // require UV samples to remain aligned UV line to UV line.
-      return 2u;
-    case fuchsia::images::PixelFormat::YV12:
-      // In the sense that line stride "must preserve pixel alignment", which is
-      // what MaxSampleAlignment() is used for, YV12 ~~has (very roughly
-      // speaking) a pixel alignment of 2, ~~because the width of the Y plane in
-      // this implementation must be even.
-      return 2u;
-  }
-  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
-  return 0;
-}
-
-size_t ImageSize(const fuchsia::images::ImageInfo& image_info) {
-  ZX_DEBUG_ASSERT(image_info.tiling == fuchsia::images::Tiling::LINEAR);
-  switch (image_info.pixel_format) {
-    case fuchsia::images::PixelFormat::BGRA_8:
-    case fuchsia::images::PixelFormat::YUY2:
-      return image_info.height * image_info.stride;
-    case fuchsia::images::PixelFormat::NV12:
-      return image_info.height * image_info.stride * 3 / 2;
-    case fuchsia::images::PixelFormat::YV12:
-      return image_info.height * image_info.stride * 3 / 2;
-  }
-  ZX_PANIC("Unknown Pixel Format: %d",
-           static_cast<int>(image_info.pixel_format));
-  return 0;
-}
-
-}  // namespace images
diff --git a/pkg/images_cpp/include/lib/images/cpp/images.h b/pkg/images_cpp/include/lib/images/cpp/images.h
deleted file mode 100644
index 48d75e6..0000000
--- a/pkg/images_cpp/include/lib/images/cpp/images.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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.
-
-#ifndef LIB_IMAGES_CPP_IMAGES_H_
-#define LIB_IMAGES_CPP_IMAGES_H_
-
-#include <fuchsia/images/cpp/fidl.h>
-
-#include <stdint.h>
-
-namespace images {
-
-// Returns the number of bits per pixel for the given format.  This is the bits
-// per pixel in the overall image across all bytes that contain pixel data.  For
-// example, NV12 is 12 bits per pixel.
-size_t BitsPerPixel(const fuchsia::images::PixelFormat& pixel_format);
-
-// This is the number of stride bytes per pixel of width.  For formats such as
-// NV12 that separate Y and UV data, this is the number of stride bytes of the Y
-// plane.  NV12 has the same stride for the UV data.  formats with a different
-// stride for UV data vs Y data are not handled yet.
-size_t StrideBytesPerWidthPixel(
-    const fuchsia::images::PixelFormat& pixel_format);
-
-// Returns the pixel alignment for the given format.
-//
-// This is technically something closer to "max sample alignment" for the given
-// format.  For example, NV12 returns 2 here because its UV interleaved data has
-// 2 bytes per sample, despite its Y plane having 1 byte per sample.
-//
-// The stride is required to be divisible by this alignment.
-size_t MaxSampleAlignment(const fuchsia::images::PixelFormat& pixel_format);
-
-// This would be height * stride, if it weren't for formats like NV12, where it
-// isn't.  The output is bytes.
-size_t ImageSize(const fuchsia::images::ImageInfo& image_info);
-
-}  // namespace images
-
-#endif  // LIB_IMAGES_CPP_IMAGES_H_
diff --git a/pkg/images_cpp/meta.json b/pkg/images_cpp/meta.json
deleted file mode 100644
index 61fdef4..0000000
--- a/pkg/images_cpp/meta.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "deps": [], 
-  "fidl_deps": [
-    "fuchsia.images"
-  ], 
-  "headers": [
-    "pkg/images_cpp/include/lib/images/cpp/images.h"
-  ], 
-  "include_dir": "pkg/images_cpp/include", 
-  "name": "images_cpp", 
-  "root": "pkg/images_cpp", 
-  "sources": [
-    "pkg/images_cpp/images.cc"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/memfs/include/lib/memfs/memfs.h b/pkg/memfs/include/lib/memfs/memfs.h
deleted file mode 100644
index 7f49a96..0000000
--- a/pkg/memfs/include/lib/memfs/memfs.h
+++ /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.
-
-#ifndef LIB_MEMFS_INCLUDE_LIB_MEMFS_MEMFS_H_
-#define LIB_MEMFS_INCLUDE_LIB_MEMFS_MEMFS_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/sync/completion.h>
-#include <zircon/compiler.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS
-
-typedef struct memfs_filesystem memfs_filesystem_t;
-
-// Given an async dispatcher, create an in-memory filesystem.
-//
-// Returns the MemFS filesystem object in |out_fs|. This object
-// must be freed by memfs_free_filesystem.
-//
-// Returns a handle to the root directory in |out_root|.
-__EXPORT zx_status_t memfs_create_filesystem(async_dispatcher_t* dispatcher,
-                                             memfs_filesystem_t** out_fs,
-                                             zx_handle_t* out_root);
-
-// Same as memfs_create_filesystem, but with an extra |max_num_pages| option.
-//
-// Specify the maximum number of pages available to the fs via |max_num_pages|.
-// This puts a bound on memory consumption.
-__EXPORT zx_status_t memfs_create_filesystem_with_page_limit(async_dispatcher_t* dispatcher,
-                                                             size_t max_num_pages,
-                                                             memfs_filesystem_t** out_fs,
-                                                             zx_handle_t* out_root);
-
-// Frees a MemFS filesystem, unmounting any sub-filesystems that
-// may exist.
-//
-// Requires that the async handler dispatcher provided to
-// |memfs_create_filesystem| still be running.
-//
-// Signals the optional argument |unmounted| when memfs has torn down.
-__EXPORT void memfs_free_filesystem(memfs_filesystem_t* fs, sync_completion_t* unmounted);
-
-// Creates an in-memory filesystem and installs it into the local namespace at
-// the given path.
-//
-// Operations on the filesystem are serviced by the given async dispatcher.
-//
-// Returns |ZX_ERR_ALREADY_EXISTS| if |path| already exists in the namespace for
-// this process.
-__EXPORT zx_status_t memfs_install_at(async_dispatcher_t* dispatcher, const char* path);
-
-// Same as memfs_install_at, but with an extra |max_num_pages| option.
-//
-// Specify the maximum number of pages available to the fs via |max_num_pages|.
-// This puts a bound on memory consumption.
-__EXPORT zx_status_t memfs_install_at_with_page_limit(async_dispatcher_t* dispatcher,
-                                                      size_t max_num_pages,
-                                                      const char* path);
-
-__END_CDECLS
-
-#endif // LIB_MEMFS_INCLUDE_LIB_MEMFS_MEMFS_H_
diff --git a/pkg/memfs/meta.json b/pkg/memfs/meta.json
deleted file mode 100644
index 1492c3e..0000000
--- a/pkg/memfs/meta.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/bf/c0f8386f84cd2c91ccae603bc6910bdbaf7f29.debug", 
-      "dist": "arch/arm64/dist/libmemfs.so", 
-      "link": "arch/arm64/lib/libmemfs.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/7b/1c4f16beffe8102284ef4860a2a92696ed5045.debug", 
-      "dist": "arch/x64/dist/libmemfs.so", 
-      "link": "arch/x64/lib/libmemfs.so"
-    }
-  }, 
-  "deps": [
-    "fdio", 
-    "trace-engine"
-  ], 
-  "format": "shared", 
-  "headers": [
-    "pkg/memfs/include/lib/memfs/memfs.h"
-  ], 
-  "include_dir": "pkg/memfs/include", 
-  "name": "memfs", 
-  "root": "pkg/memfs", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/scenic_cpp/commands.cc b/pkg/scenic_cpp/commands.cc
deleted file mode 100644
index 4991905..0000000
--- a/pkg/scenic_cpp/commands.cc
+++ /dev/null
@@ -1,1300 +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.
-
-#include "lib/ui/scenic/cpp/commands.h"
-
-#include <array>
-
-#include <zircon/assert.h>
-
-namespace scenic {
-
-fuchsia::ui::scenic::Command NewCommand(fuchsia::ui::gfx::Command command) {
-  fuchsia::ui::scenic::Command scenic_command;
-  scenic_command.set_gfx(std::move(command));
-  return scenic_command;
-}
-
-fuchsia::ui::scenic::Command NewCommand(fuchsia::ui::input::Command command) {
-  fuchsia::ui::scenic::Command scenic_command;
-  scenic_command.set_input(std::move(command));
-  return scenic_command;
-}
-
-// Helper function for all resource creation functions.
-fuchsia::ui::gfx::Command NewCreateResourceCmd(
-    uint32_t id, fuchsia::ui::gfx::ResourceArgs resource) {
-  fuchsia::ui::gfx::CreateResourceCmd create_resource;
-  create_resource.id = id;
-  create_resource.resource = std::move(resource);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_create_resource(std::move(create_resource));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewCreateMemoryCmd(
-    uint32_t id, zx::vmo vmo, uint64_t allocation_size,
-    fuchsia::images::MemoryType memory_type) {
-  fuchsia::ui::gfx::MemoryArgs memory;
-  memory.vmo = std::move(vmo);
-  memory.allocation_size = allocation_size;
-  memory.memory_type = memory_type;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_memory(std::move(memory));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateImageCmd(uint32_t id, uint32_t memory_id,
-                                            uint32_t memory_offset,
-                                            fuchsia::images::ImageInfo info) {
-  fuchsia::ui::gfx::ImageArgs image;
-  image.memory_id = memory_id;
-  image.memory_offset = memory_offset;
-  image.info = std::move(info);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_image(std::move(image));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateImagePipeCmd(
-    uint32_t id, ::fidl::InterfaceRequest<fuchsia::images::ImagePipe> request) {
-  fuchsia::ui::gfx::ImagePipeArgs image_pipe;
-  image_pipe.image_pipe_request = std::move(request);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_image_pipe(std::move(image_pipe));
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateImageCmd(
-    uint32_t id, uint32_t memory_id, uint32_t memory_offset,
-    fuchsia::images::PixelFormat format,
-    fuchsia::images::ColorSpace color_space, fuchsia::images::Tiling tiling,
-    uint32_t width, uint32_t height, uint32_t stride) {
-  fuchsia::images::ImageInfo info;
-  info.pixel_format = format;
-  info.color_space = color_space;
-  info.tiling = tiling;
-  info.width = width;
-  info.height = height;
-  info.stride = stride;
-  return NewCreateImageCmd(id, memory_id, memory_offset, std::move(info));
-}
-
-fuchsia::ui::gfx::Command NewCreateBufferCmd(uint32_t id, uint32_t memory_id,
-                                             uint32_t memory_offset,
-                                             uint32_t num_bytes) {
-  fuchsia::ui::gfx::BufferArgs buffer;
-  buffer.memory_id = memory_id;
-  buffer.memory_offset = memory_offset;
-  buffer.num_bytes = num_bytes;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_buffer(std::move(buffer));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateCompositorCmd(uint32_t id) {
-  fuchsia::ui::gfx::CompositorArgs compositor;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_compositor(std::move(compositor));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateDisplayCompositorCmd(uint32_t id) {
-  fuchsia::ui::gfx::DisplayCompositorArgs display_compositor;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_display_compositor(std::move(display_compositor));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateLayerStackCmd(uint32_t id) {
-  fuchsia::ui::gfx::LayerStackArgs layer_stack;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_layer_stack(std::move(layer_stack));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateLayerCmd(uint32_t id) {
-  fuchsia::ui::gfx::LayerArgs layer;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_layer(std::move(layer));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateSceneCmd(uint32_t id) {
-  fuchsia::ui::gfx::SceneArgs scene;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_scene(std::move(scene));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateCameraCmd(uint32_t id, uint32_t scene_id) {
-  fuchsia::ui::gfx::CameraArgs camera;
-  camera.scene_id = scene_id;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_camera(std::move(camera));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateStereoCameraCmd(uint32_t id,
-                                                   uint32_t scene_id) {
-  fuchsia::ui::gfx::StereoCameraArgs stereo_camera;
-  stereo_camera.scene_id = scene_id;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_stereo_camera(std::move(stereo_camera));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateRendererCmd(uint32_t id) {
-  fuchsia::ui::gfx::RendererArgs renderer;
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_renderer(std::move(renderer));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateAmbientLightCmd(uint32_t id) {
-  fuchsia::ui::gfx::AmbientLightArgs ambient_light;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_ambient_light(std::move(ambient_light));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateDirectionalLightCmd(uint32_t id) {
-  fuchsia::ui::gfx::DirectionalLightArgs directional_light;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_directional_light(std::move(directional_light));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateCircleCmd(uint32_t id, float radius) {
-  fuchsia::ui::gfx::Value radius_value;
-  radius_value.set_vector1(radius);
-
-  fuchsia::ui::gfx::CircleArgs circle;
-  circle.radius = std::move(radius_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_circle(std::move(circle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateRectangleCmd(uint32_t id, float width,
-                                                float height) {
-  fuchsia::ui::gfx::Value width_value;
-  width_value.set_vector1(width);
-
-  fuchsia::ui::gfx::Value height_value;
-  height_value.set_vector1(height);
-
-  fuchsia::ui::gfx::RectangleArgs rectangle;
-  rectangle.width = std::move(width_value);
-  rectangle.height = std::move(height_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_rectangle(std::move(rectangle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateRoundedRectangleCmd(
-    uint32_t id, float width, float height, float top_left_radius,
-    float top_right_radius, float bottom_right_radius,
-    float bottom_left_radius) {
-  fuchsia::ui::gfx::Value width_value;
-  width_value.set_vector1(width);
-
-  fuchsia::ui::gfx::Value height_value;
-  height_value.set_vector1(height);
-
-  fuchsia::ui::gfx::Value top_left_radius_value;
-  top_left_radius_value.set_vector1(top_left_radius);
-
-  fuchsia::ui::gfx::Value top_right_radius_value;
-  top_right_radius_value.set_vector1(top_right_radius);
-
-  fuchsia::ui::gfx::Value bottom_right_radius_value;
-  bottom_right_radius_value.set_vector1(bottom_right_radius);
-
-  fuchsia::ui::gfx::Value bottom_left_radius_value;
-  bottom_left_radius_value.set_vector1(bottom_left_radius);
-
-  fuchsia::ui::gfx::RoundedRectangleArgs rectangle;
-  rectangle.width = std::move(width_value);
-  rectangle.height = std::move(height_value);
-  rectangle.top_left_radius = std::move(top_left_radius_value);
-  rectangle.top_right_radius = std::move(top_right_radius_value);
-  rectangle.bottom_right_radius = std::move(bottom_right_radius_value);
-  rectangle.bottom_left_radius = std::move(bottom_left_radius_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_rounded_rectangle(std::move(rectangle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateVarCircleCmd(uint32_t id,
-                                                uint32_t radius_var_id,
-                                                uint32_t height_var_id) {
-  fuchsia::ui::gfx::Value radius_value;
-  radius_value.set_variable_id(radius_var_id);
-
-  fuchsia::ui::gfx::CircleArgs circle;
-  circle.radius = std::move(radius_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_circle(std::move(circle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateVarRectangleCmd(uint32_t id,
-                                                   uint32_t width_var_id,
-                                                   uint32_t height_var_id) {
-  fuchsia::ui::gfx::Value width_value;
-  width_value.set_variable_id(width_var_id);
-
-  fuchsia::ui::gfx::Value height_value;
-  height_value.set_variable_id(height_var_id);
-
-  fuchsia::ui::gfx::RectangleArgs rectangle;
-  rectangle.width = std::move(width_value);
-  rectangle.height = std::move(height_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_rectangle(std::move(rectangle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateVarRoundedRectangleCmd(
-    uint32_t id, uint32_t width_var_id, uint32_t height_var_id,
-    uint32_t top_left_radius_var_id, uint32_t top_right_radius_var_id,
-    uint32_t bottom_left_radius_var_id, uint32_t bottom_right_radius_var_id) {
-  fuchsia::ui::gfx::Value width_value;
-  width_value.set_variable_id(width_var_id);
-
-  fuchsia::ui::gfx::Value height_value;
-  height_value.set_variable_id(height_var_id);
-
-  fuchsia::ui::gfx::Value top_left_radius_value;
-  top_left_radius_value.set_variable_id(top_left_radius_var_id);
-
-  fuchsia::ui::gfx::Value top_right_radius_value;
-  top_right_radius_value.set_variable_id(top_right_radius_var_id);
-
-  fuchsia::ui::gfx::Value bottom_left_radius_value;
-  bottom_left_radius_value.set_variable_id(bottom_left_radius_var_id);
-
-  fuchsia::ui::gfx::Value bottom_right_radius_value;
-  bottom_right_radius_value.set_variable_id(bottom_right_radius_var_id);
-
-  fuchsia::ui::gfx::RoundedRectangleArgs rectangle;
-  rectangle.width = std::move(width_value);
-  rectangle.height = std::move(height_value);
-  rectangle.top_left_radius = std::move(top_left_radius_value);
-  rectangle.top_right_radius = std::move(top_right_radius_value);
-  rectangle.bottom_left_radius = std::move(bottom_left_radius_value);
-  rectangle.bottom_right_radius = std::move(bottom_right_radius_value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_rounded_rectangle(std::move(rectangle));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateMeshCmd(uint32_t id) {
-  fuchsia::ui::gfx::MeshArgs mesh;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_mesh(std::move(mesh));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateMaterialCmd(uint32_t id) {
-  fuchsia::ui::gfx::MaterialArgs material;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_material(std::move(material));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateClipNodeCmd(uint32_t id) {
-  fuchsia::ui::gfx::ClipNodeArgs node;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_clip_node(std::move(node));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateEntityNodeCmd(uint32_t id) {
-  fuchsia::ui::gfx::EntityNodeArgs node;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_entity_node(std::move(node));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateOpacityNodeCmd(uint32_t id) {
-  fuchsia::ui::gfx::OpacityNodeArgs node;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_opacity_node(std::move(node));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateShapeNodeCmd(uint32_t id) {
-  fuchsia::ui::gfx::ShapeNodeArgs node;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_shape_node(std::move(node));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateViewCmd(uint32_t id, zx::eventpair token,
-                                           const std::string& debug_name) {
-  ZX_DEBUG_ASSERT(token);
-  fuchsia::ui::gfx::ViewArgs view;
-  view.token = std::move(token);
-  view.debug_name = debug_name;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_view(std::move(view));
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateViewHolderCmd(
-    uint32_t id, zx::eventpair token, const std::string& debug_name) {
-  ZX_DEBUG_ASSERT(token);
-  fuchsia::ui::gfx::ViewHolderArgs view_holder;
-  view_holder.token = std::move(token);
-  view_holder.debug_name = debug_name;
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_view_holder(std::move(view_holder));
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewCreateVariableCmd(uint32_t id,
-                                               fuchsia::ui::gfx::Value value) {
-  fuchsia::ui::gfx::VariableArgs variable;
-  switch (value.Which()) {
-    case ::fuchsia::ui::gfx::Value::Tag::kVector1:
-      variable.type = fuchsia::ui::gfx::ValueType::kVector1;
-      break;
-    case ::fuchsia::ui::gfx::Value::Tag::kVector2:
-      variable.type = fuchsia::ui::gfx::ValueType::kVector2;
-      break;
-    case ::fuchsia::ui::gfx::Value::Tag::kVector3:
-      variable.type = fuchsia::ui::gfx::ValueType::kVector3;
-      break;
-    case ::fuchsia::ui::gfx::Value::Tag::kVector4:
-      variable.type = fuchsia::ui::gfx::ValueType::kVector4;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kMatrix4x4:
-      variable.type = fuchsia::ui::gfx::ValueType::kMatrix4;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kColorRgba:
-      variable.type = fuchsia::ui::gfx::ValueType::kColorRgba;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kColorRgb:
-      variable.type = fuchsia::ui::gfx::ValueType::kColorRgb;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kDegrees:
-      variable.type = fuchsia::ui::gfx::ValueType::kVector1;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kTransform:
-      variable.type = fuchsia::ui::gfx::ValueType::kFactoredTransform;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kQuaternion:
-      variable.type = fuchsia::ui::gfx::ValueType::kQuaternion;
-      break;
-    case fuchsia::ui::gfx::Value::Tag::kVariableId:
-      // A variable's initial value cannot be another variable.
-      return fuchsia::ui::gfx::Command();
-    case fuchsia::ui::gfx::Value::Tag::Invalid:
-      return fuchsia::ui::gfx::Command();
-  }
-  variable.initial_value = std::move(value);
-
-  fuchsia::ui::gfx::ResourceArgs resource;
-  resource.set_variable(std::move(variable));
-
-  return NewCreateResourceCmd(id, std::move(resource));
-}
-
-fuchsia::ui::gfx::Command NewReleaseResourceCmd(uint32_t id) {
-  fuchsia::ui::gfx::ReleaseResourceCmd release_resource;
-  release_resource.id = id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_release_resource(std::move(release_resource));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewExportResourceCmd(uint32_t resource_id,
-                                               zx::eventpair export_token) {
-  ZX_DEBUG_ASSERT(export_token);
-
-  fuchsia::ui::gfx::ExportResourceCmd export_resource;
-  export_resource.id = resource_id;
-  export_resource.token = std::move(export_token);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_export_resource(std::move(export_resource));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewImportResourceCmd(
-    uint32_t resource_id, fuchsia::ui::gfx::ImportSpec spec,
-    zx::eventpair import_token) {
-  ZX_DEBUG_ASSERT(import_token);
-
-  fuchsia::ui::gfx::ImportResourceCmd import_resource;
-  import_resource.id = resource_id;
-  import_resource.token = std::move(import_token);
-  import_resource.spec = spec;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_import_resource(std::move(import_resource));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewExportResourceCmdAsRequest(
-    uint32_t resource_id, zx::eventpair* out_import_token) {
-  ZX_DEBUG_ASSERT(out_import_token);
-  ZX_DEBUG_ASSERT(!*out_import_token);
-
-  zx::eventpair export_token;
-  zx_status_t status =
-      zx::eventpair::create(0u, &export_token, out_import_token);
-  ZX_DEBUG_ASSERT_MSG(status == ZX_OK, "event pair create failed: status=%d",
-                      status);
-  return NewExportResourceCmd(resource_id, std::move(export_token));
-}
-
-fuchsia::ui::gfx::Command NewImportResourceCmdAsRequest(
-    uint32_t resource_id, fuchsia::ui::gfx::ImportSpec import_spec,
-    zx::eventpair* out_export_token) {
-  ZX_DEBUG_ASSERT(out_export_token);
-  ZX_DEBUG_ASSERT(!*out_export_token);
-
-  zx::eventpair import_token;
-  zx_status_t status =
-      zx::eventpair::create(0u, &import_token, out_export_token);
-  ZX_DEBUG_ASSERT_MSG(status == ZX_OK, "event pair create failed: status=%d",
-                      status);
-  return NewImportResourceCmd(resource_id, import_spec,
-                              std::move(import_token));
-}
-
-fuchsia::ui::gfx::Command NewSetViewPropertiesCmd(
-    uint32_t view_holder_id, const float bounding_box_min[3],
-    const float bounding_box_max[3], const float inset_from_min[3],
-    const float inset_from_max[3]) {
-  fuchsia::ui::gfx::SetViewPropertiesCmd set_view_properties;
-  set_view_properties.view_holder_id = view_holder_id;
-  auto& props = set_view_properties.properties;
-  props.bounding_box.min = NewVector3(bounding_box_min);
-  props.bounding_box.max = NewVector3(bounding_box_max);
-  props.inset_from_min = NewVector3(inset_from_min);
-  props.inset_from_max = NewVector3(inset_from_max);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_view_properties(std::move(set_view_properties));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetViewPropertiesCmd(
-    uint32_t view_holder_id, const fuchsia::ui::gfx::ViewProperties& props) {
-  fuchsia::ui::gfx::SetViewPropertiesCmd set_view_properties;
-  set_view_properties.view_holder_id = view_holder_id;
-  set_view_properties.properties = props;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_view_properties(std::move(set_view_properties));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewAddChildCmd(uint32_t node_id, uint32_t child_id) {
-  fuchsia::ui::gfx::AddChildCmd add_child;
-  add_child.node_id = node_id;
-  add_child.child_id = child_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_add_child(std::move(add_child));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewAddPartCmd(uint32_t node_id, uint32_t part_id) {
-  fuchsia::ui::gfx::AddPartCmd add_part;
-  add_part.node_id = node_id;
-  add_part.part_id = part_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_add_part(std::move(add_part));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewDetachCmd(uint32_t id) {
-  fuchsia::ui::gfx::DetachCmd detach;
-  detach.id = id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_detach(std::move(detach));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewDetachChildrenCmd(uint32_t node_id) {
-  fuchsia::ui::gfx::DetachChildrenCmd detach_children;
-  detach_children.node_id = node_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_detach_children(std::move(detach_children));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetTranslationCmd(uint32_t node_id,
-                                               const float translation[3]) {
-  fuchsia::ui::gfx::SetTranslationCmd set_translation;
-  set_translation.id = node_id;
-  set_translation.value = NewVector3Value(translation);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_translation(std::move(set_translation));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetTranslationCmd(uint32_t node_id,
-                                               uint32_t variable_id) {
-  fuchsia::ui::gfx::SetTranslationCmd set_translation;
-  set_translation.id = node_id;
-  set_translation.value = NewVector3Value(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_translation(std::move(set_translation));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetScaleCmd(uint32_t node_id,
-                                         const float scale[3]) {
-  fuchsia::ui::gfx::SetScaleCmd set_scale;
-  set_scale.id = node_id;
-  set_scale.value = NewVector3Value(scale);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_scale(std::move(set_scale));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetScaleCmd(uint32_t node_id,
-                                         uint32_t variable_id) {
-  fuchsia::ui::gfx::SetScaleCmd set_scale;
-  set_scale.id = node_id;
-  set_scale.value = NewVector3Value(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_scale(std::move(set_scale));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetRotationCmd(uint32_t node_id,
-                                            const float quaternion[4]) {
-  fuchsia::ui::gfx::SetRotationCmd set_rotation;
-  set_rotation.id = node_id;
-  set_rotation.value = NewQuaternionValue(quaternion);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_rotation(std::move(set_rotation));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetRotationCmd(uint32_t node_id,
-                                            uint32_t variable_id) {
-  fuchsia::ui::gfx::SetRotationCmd set_rotation;
-  set_rotation.id = node_id;
-  set_rotation.value = NewQuaternionValue(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_rotation(std::move(set_rotation));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetAnchorCmd(uint32_t node_id,
-                                          const float anchor[3]) {
-  fuchsia::ui::gfx::SetAnchorCmd set_anchor;
-  set_anchor.id = node_id;
-  set_anchor.value = NewVector3Value(anchor);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_anchor(std::move(set_anchor));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetAnchorCmd(uint32_t node_id,
-                                          uint32_t variable_id) {
-  fuchsia::ui::gfx::SetAnchorCmd set_anchor;
-  set_anchor.id = node_id;
-  set_anchor.value = NewVector3Value(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_anchor(std::move(set_anchor));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetOpacityCmd(uint32_t node_id, float opacity) {
-  fuchsia::ui::gfx::SetOpacityCmd set_opacity;
-  set_opacity.node_id = node_id;
-  set_opacity.opacity = opacity;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_opacity(std::move(set_opacity));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSendSizeChangeHintCmdHACK(
-    uint32_t node_id, float width_change_factor, float height_change_factor) {
-  fuchsia::ui::gfx::SendSizeChangeHintCmdHACK send_size_change_hint;
-  send_size_change_hint.node_id = node_id;
-  send_size_change_hint.width_change_factor = width_change_factor;
-  send_size_change_hint.height_change_factor = height_change_factor;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_send_size_change_hint_hack(std::move(send_size_change_hint));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetShapeCmd(uint32_t node_id, uint32_t shape_id) {
-  fuchsia::ui::gfx::SetShapeCmd set_shape;
-  set_shape.node_id = node_id;
-  set_shape.shape_id = shape_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_shape(std::move(set_shape));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetMaterialCmd(uint32_t node_id,
-                                            uint32_t material_id) {
-  fuchsia::ui::gfx::SetMaterialCmd set_material;
-  set_material.node_id = node_id;
-  set_material.material_id = material_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_material(std::move(set_material));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetClipCmd(uint32_t node_id, uint32_t clip_id,
-                                        bool clip_to_self) {
-  fuchsia::ui::gfx::SetClipCmd set_clip;
-  set_clip.node_id = node_id;
-  set_clip.clip_id = clip_id;
-  set_clip.clip_to_self = clip_to_self;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_clip(std::move(set_clip));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetTagCmd(uint32_t node_id, uint32_t tag_value) {
-  fuchsia::ui::gfx::SetTagCmd set_tag;
-  set_tag.node_id = node_id;
-  set_tag.tag_value = tag_value;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_tag(std::move(set_tag));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewTakeSnapshotCmdHACK(
-    uint32_t node_id, fuchsia::ui::gfx::SnapshotCallbackHACKPtr callback) {
-  fuchsia::ui::gfx::TakeSnapshotCmdHACK snapshot_cmd;
-  snapshot_cmd.node_id = node_id;
-  snapshot_cmd.callback = std::move(callback);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_take_snapshot_cmd(std::move(snapshot_cmd));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetHitTestBehaviorCmd(
-    uint32_t node_id, fuchsia::ui::gfx::HitTestBehavior hit_test_behavior) {
-  fuchsia::ui::gfx::SetHitTestBehaviorCmd set_hit_test_behavior;
-  set_hit_test_behavior.node_id = node_id;
-  set_hit_test_behavior.hit_test_behavior = hit_test_behavior;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_hit_test_behavior(std::move(set_hit_test_behavior));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetCameraCmd(uint32_t renderer_id,
-                                          uint32_t camera_id) {
-  fuchsia::ui::gfx::SetCameraCmd set_camera;
-  set_camera.renderer_id = renderer_id;
-  set_camera.camera_id = camera_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_camera(std::move(set_camera));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetTextureCmd(uint32_t material_id,
-                                           uint32_t texture_id) {
-  fuchsia::ui::gfx::SetTextureCmd set_texture;
-  set_texture.material_id = material_id;
-  set_texture.texture_id = texture_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_texture(std::move(set_texture));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetColorCmd(uint32_t material_id, uint8_t red,
-                                         uint8_t green, uint8_t blue,
-                                         uint8_t alpha) {
-  fuchsia::ui::gfx::ColorRgbaValue color;
-  color.value.red = red;
-  color.value.green = green;
-  color.value.blue = blue;
-  color.value.alpha = alpha;
-  color.variable_id = 0;
-  fuchsia::ui::gfx::SetColorCmd set_color;
-  set_color.material_id = material_id;
-  set_color.color = std::move(color);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_color(std::move(set_color));
-
-  return command;
-}
-
-fuchsia::ui::gfx::MeshVertexFormat NewMeshVertexFormat(
-    fuchsia::ui::gfx::ValueType position_type,
-    fuchsia::ui::gfx::ValueType normal_type,
-    fuchsia::ui::gfx::ValueType tex_coord_type) {
-  fuchsia::ui::gfx::MeshVertexFormat vertex_format;
-  vertex_format.position_type = position_type;
-  vertex_format.normal_type = normal_type;
-  vertex_format.tex_coord_type = tex_coord_type;
-  return vertex_format;
-}
-
-fuchsia::ui::gfx::Command NewBindMeshBuffersCmd(
-    uint32_t mesh_id, uint32_t index_buffer_id,
-    fuchsia::ui::gfx::MeshIndexFormat index_format, uint64_t index_offset,
-    uint32_t index_count, uint32_t vertex_buffer_id,
-    fuchsia::ui::gfx::MeshVertexFormat vertex_format, uint64_t vertex_offset,
-    uint32_t vertex_count, const float bounding_box_min[3],
-    const float bounding_box_max[3]) {
-  fuchsia::ui::gfx::BindMeshBuffersCmd bind_mesh_buffers;
-  bind_mesh_buffers.mesh_id = mesh_id;
-  bind_mesh_buffers.index_buffer_id = index_buffer_id;
-  bind_mesh_buffers.index_format = index_format;
-  bind_mesh_buffers.index_offset = index_offset;
-  bind_mesh_buffers.index_count = index_count;
-  bind_mesh_buffers.vertex_buffer_id = vertex_buffer_id;
-  bind_mesh_buffers.vertex_format = std::move(vertex_format);
-  bind_mesh_buffers.vertex_offset = vertex_offset;
-  bind_mesh_buffers.vertex_count = vertex_count;
-  auto& bbox = bind_mesh_buffers.bounding_box;
-  bbox.min.x = bounding_box_min[0];
-  bbox.min.y = bounding_box_min[1];
-  bbox.min.z = bounding_box_min[2];
-  bbox.max.x = bounding_box_max[0];
-  bbox.max.y = bounding_box_max[1];
-  bbox.max.z = bounding_box_max[2];
-
-  fuchsia::ui::gfx::Command command;
-  command.set_bind_mesh_buffers(std::move(bind_mesh_buffers));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewAddLayerCmd(uint32_t layer_stack_id,
-                                         uint32_t layer_id) {
-  fuchsia::ui::gfx::AddLayerCmd add_layer;
-  add_layer.layer_stack_id = layer_stack_id;
-  add_layer.layer_id = layer_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_add_layer(std::move(add_layer));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewRemoveLayerCmd(uint32_t layer_stack_id,
-                                            uint32_t layer_id) {
-  fuchsia::ui::gfx::RemoveLayerCmd remove_layer;
-  remove_layer.layer_stack_id = layer_stack_id;
-  remove_layer.layer_id = layer_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_remove_layer(std::move(remove_layer));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewRemoveAllLayersCmd(uint32_t layer_stack_id) {
-  fuchsia::ui::gfx::RemoveAllLayersCmd remove_all_layers;
-  remove_all_layers.layer_stack_id = layer_stack_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_remove_all_layers(std::move(remove_all_layers));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLayerStackCmd(uint32_t compositor_id,
-                                              uint32_t layer_stack_id) {
-  fuchsia::ui::gfx::SetLayerStackCmd set_layer_stack;
-  set_layer_stack.compositor_id = compositor_id;
-  set_layer_stack.layer_stack_id = layer_stack_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_layer_stack(std::move(set_layer_stack));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetRendererCmd(uint32_t layer_id,
-                                            uint32_t renderer_id) {
-  fuchsia::ui::gfx::SetRendererCmd set_renderer;
-  set_renderer.layer_id = layer_id;
-  set_renderer.renderer_id = renderer_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_renderer(std::move(set_renderer));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetRendererParamCmd(
-    uint32_t renderer_id, fuchsia::ui::gfx::RendererParam param) {
-  fuchsia::ui::gfx::SetRendererParamCmd param_command;
-  param_command.renderer_id = renderer_id;
-  param_command.param = std::move(param);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_renderer_param(std::move(param_command));
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetSizeCmd(uint32_t node_id, const float size[2]) {
-  fuchsia::ui::gfx::SetSizeCmd set_size;
-  set_size.id = node_id;
-  auto& value = set_size.value.value;
-  value.x = size[0];
-  value.y = size[1];
-  set_size.value.variable_id = 0;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_size(std::move(set_size));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetCameraTransformCmd(uint32_t camera_id,
-                                                   const float eye_position[3],
-                                                   const float eye_look_at[3],
-                                                   const float eye_up[3]) {
-  fuchsia::ui::gfx::SetCameraTransformCmd set_command;
-  set_command.camera_id = camera_id;
-  set_command.eye_position = NewVector3Value(eye_position);
-  set_command.eye_look_at = NewVector3Value(eye_look_at);
-  set_command.eye_up = NewVector3Value(eye_up);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_camera_transform(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetCameraProjectionCmd(uint32_t camera_id,
-                                                    const float fovy) {
-  fuchsia::ui::gfx::SetCameraProjectionCmd set_command;
-  set_command.camera_id = camera_id;
-  set_command.fovy = NewFloatValue(fovy);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_camera_projection(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetStereoCameraProjectionCmd(
-    uint32_t camera_id, const float left_projection[16],
-    const float right_projection[16]) {
-  fuchsia::ui::gfx::SetStereoCameraProjectionCmd set_command;
-  set_command.camera_id = camera_id;
-  set_command.left_projection = NewMatrix4Value(left_projection);
-  set_command.right_projection = NewMatrix4Value(right_projection);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_stereo_camera_projection(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetCameraPoseBufferCmd(uint32_t camera_id,
-                                                    uint32_t buffer_id,
-                                                    uint32_t num_entries,
-                                                    int64_t base_time,
-                                                    uint64_t time_interval) {
-  fuchsia::ui::gfx::SetCameraPoseBufferCmd set_command;
-  set_command.camera_id = camera_id;
-  set_command.buffer_id = buffer_id;
-  set_command.num_entries = num_entries;
-  set_command.base_time = base_time;
-  set_command.time_interval = time_interval;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_camera_pose_buffer(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLightColorCmd(uint32_t light_id,
-                                              const float rgb[3]) {
-  fuchsia::ui::gfx::SetLightColorCmd set_command;
-  set_command.light_id = light_id;
-  set_command.color = NewColorRgbValue(rgb[0], rgb[1], rgb[2]);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_light_color(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLightColorCmd(uint32_t light_id,
-                                              uint32_t variable_id) {
-  fuchsia::ui::gfx::SetLightColorCmd set_command;
-  set_command.light_id = light_id;
-  set_command.color = NewColorRgbValue(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_light_color(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLightDirectionCmd(uint32_t light_id,
-                                                  const float dir[3]) {
-  fuchsia::ui::gfx::SetLightDirectionCmd set_command;
-  set_command.light_id = light_id;
-  set_command.direction = NewVector3Value(dir);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_light_direction(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLightDirectionCmd(uint32_t light_id,
-                                                  uint32_t variable_id) {
-  fuchsia::ui::gfx::SetLightDirectionCmd set_command;
-  set_command.light_id = light_id;
-  set_command.direction = NewVector3Value(variable_id);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_light_direction(std::move(set_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewAddLightCmd(uint32_t scene_id, uint32_t light_id) {
-  fuchsia::ui::gfx::AddLightCmd add_light_command;
-  add_light_command.scene_id = scene_id;
-  add_light_command.light_id = light_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_add_light(std::move(add_light_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewDetachLightCmd(uint32_t light_id) {
-  fuchsia::ui::gfx::DetachLightCmd detach_light_command;
-  detach_light_command.light_id = light_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_detach_light(std::move(detach_light_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewDetachLightsCmd(uint32_t scene_id) {
-  fuchsia::ui::gfx::DetachLightsCmd detach_lights_command;
-  detach_lights_command.scene_id = scene_id;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_detach_lights(std::move(detach_lights_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetEventMaskCmd(uint32_t resource_id,
-                                             uint32_t event_mask) {
-  fuchsia::ui::gfx::SetEventMaskCmd set_event_mask_command;
-  set_event_mask_command.id = resource_id;
-  set_event_mask_command.event_mask = event_mask;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_event_mask(std::move(set_event_mask_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetLabelCmd(uint32_t resource_id,
-                                         const std::string& label) {
-  fuchsia::ui::gfx::SetLabelCmd set_label_command;
-  set_label_command.id = resource_id;
-  set_label_command.label = label.substr(0, fuchsia::ui::gfx::kLabelMaxLength);
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_label(std::move(set_label_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::Command NewSetDisableClippingCmd(uint32_t renderer_id,
-                                                   bool disable_clipping) {
-  fuchsia::ui::gfx::SetDisableClippingCmd set_disable_clipping_command;
-  set_disable_clipping_command.renderer_id = renderer_id;
-  set_disable_clipping_command.disable_clipping = disable_clipping;
-
-  fuchsia::ui::gfx::Command command;
-  command.set_set_disable_clipping(std::move(set_disable_clipping_command));
-
-  return command;
-}
-
-fuchsia::ui::gfx::FloatValue NewFloatValue(float value) {
-  fuchsia::ui::gfx::FloatValue val;
-  val.variable_id = 0;
-  val.value = value;
-  return val;
-}
-
-fuchsia::ui::gfx::vec2 NewVector2(const float value[2]) {
-  fuchsia::ui::gfx::vec2 val;
-  val.x = value[0];
-  val.y = value[1];
-  return val;
-}
-
-fuchsia::ui::gfx::Vector2Value NewVector2Value(const float value[2]) {
-  fuchsia::ui::gfx::Vector2Value val;
-  val.variable_id = 0;
-  val.value = NewVector2(value);
-  return val;
-}
-
-fuchsia::ui::gfx::Vector2Value NewVector2Value(uint32_t variable_id) {
-  fuchsia::ui::gfx::Vector2Value val;
-  val.variable_id = variable_id;
-  return val;
-}
-
-fuchsia::ui::gfx::vec3 NewVector3(const float value[3]) {
-  fuchsia::ui::gfx::vec3 val;
-  val.x = value[0];
-  val.y = value[1];
-  val.z = value[2];
-  return val;
-}
-
-fuchsia::ui::gfx::Vector3Value NewVector3Value(const float value[3]) {
-  fuchsia::ui::gfx::Vector3Value val;
-  val.variable_id = 0;
-  val.value = NewVector3(value);
-  return val;
-}
-
-fuchsia::ui::gfx::Vector3Value NewVector3Value(uint32_t variable_id) {
-  fuchsia::ui::gfx::Vector3Value val;
-  val.variable_id = variable_id;
-  return val;
-}
-
-fuchsia::ui::gfx::vec4 NewVector4(const float value[4]) {
-  fuchsia::ui::gfx::vec4 val;
-  val.x = value[0];
-  val.y = value[1];
-  val.z = value[2];
-  val.w = value[3];
-  return val;
-}
-
-fuchsia::ui::gfx::Vector4Value NewVector4Value(const float value[4]) {
-  fuchsia::ui::gfx::Vector4Value val;
-  val.variable_id = 0;
-  val.value = NewVector4(value);
-  return val;
-}
-
-fuchsia::ui::gfx::Vector4Value NewVector4Value(uint32_t variable_id) {
-  fuchsia::ui::gfx::Vector4Value val;
-  val.variable_id = variable_id;
-  return val;
-}
-
-fuchsia::ui::gfx::Quaternion NewQuaternion(const float value[4]) {
-  fuchsia::ui::gfx::Quaternion val;
-  val.x = value[0];
-  val.y = value[1];
-  val.z = value[2];
-  val.w = value[3];
-  return val;
-}
-
-fuchsia::ui::gfx::QuaternionValue NewQuaternionValue(const float value[4]) {
-  fuchsia::ui::gfx::QuaternionValue val;
-  val.variable_id = 0;
-  val.value = NewQuaternion(value);
-  return val;
-}
-
-fuchsia::ui::gfx::QuaternionValue NewQuaternionValue(uint32_t variable_id) {
-  fuchsia::ui::gfx::QuaternionValue val;
-  val.variable_id = variable_id;
-  return val;
-}
-
-fuchsia::ui::gfx::mat4 NewMatrix4(const float matrix[16]) {
-  fuchsia::ui::gfx::mat4 val;
-  val.matrix[0] = matrix[0];
-  val.matrix[1] = matrix[1];
-  val.matrix[2] = matrix[2];
-  val.matrix[3] = matrix[3];
-  val.matrix[4] = matrix[4];
-  val.matrix[5] = matrix[5];
-  val.matrix[6] = matrix[6];
-  val.matrix[7] = matrix[7];
-  val.matrix[8] = matrix[8];
-  val.matrix[9] = matrix[9];
-  val.matrix[10] = matrix[10];
-  val.matrix[11] = matrix[11];
-  val.matrix[12] = matrix[12];
-  val.matrix[13] = matrix[13];
-  val.matrix[14] = matrix[14];
-  val.matrix[15] = matrix[15];
-  return val;
-}
-
-fuchsia::ui::gfx::Matrix4Value NewMatrix4Value(const float matrix[16]) {
-  fuchsia::ui::gfx::Matrix4Value val;
-  val.variable_id = 0;
-  val.value = NewMatrix4(matrix);
-  return val;
-}
-
-fuchsia::ui::gfx::Matrix4Value NewMatrix4Value(uint32_t variable_id) {
-  fuchsia::ui::gfx::Matrix4Value val;
-  val.variable_id = variable_id;
-  return val;
-}
-
-fuchsia::ui::gfx::ColorRgbValue NewColorRgbValue(float red, float green,
-                                                 float blue) {
-  fuchsia::ui::gfx::ColorRgbValue val;
-  val.variable_id = 0;
-  auto& color = val.value;
-  color.red = red;
-  color.green = green;
-  color.blue = blue;
-
-  return val;
-}
-
-fuchsia::ui::gfx::ColorRgbValue NewColorRgbValue(uint32_t variable_id) {
-  fuchsia::ui::gfx::ColorRgbValue val;
-  val.variable_id = variable_id;
-
-  return val;
-}
-
-fuchsia::ui::gfx::ColorRgbaValue NewColorRgbaValue(const uint8_t value[4]) {
-  fuchsia::ui::gfx::ColorRgbaValue val;
-  val.variable_id = 0;
-  auto& color = val.value;
-  color.red = value[0];
-  color.green = value[1];
-  color.blue = value[2];
-  color.alpha = value[3];
-
-  return val;
-}
-
-fuchsia::ui::gfx::ColorRgbaValue NewColorRgbaValue(uint32_t variable_id) {
-  fuchsia::ui::gfx::ColorRgbaValue val;
-  val.variable_id = variable_id;
-
-  return val;
-}
-
-// TODO(mikejurka): this should be in an images util file
-bool ImageInfoEquals(const fuchsia::images::ImageInfo& a,
-                     const fuchsia::images::ImageInfo& b) {
-  return a.transform == b.transform && a.width == b.width &&
-         a.height == b.height && a.stride == b.stride &&
-         a.pixel_format == b.pixel_format && a.color_space == b.color_space &&
-         a.tiling == b.tiling && a.alpha_format == b.alpha_format;
-}
-
-}  // namespace scenic
diff --git a/pkg/scenic_cpp/host_image_cycler.cc b/pkg/scenic_cpp/host_image_cycler.cc
deleted file mode 100644
index 70b45d6..0000000
--- a/pkg/scenic_cpp/host_image_cycler.cc
+++ /dev/null
@@ -1,65 +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.
-
-#include "lib/ui/scenic/cpp/host_image_cycler.h"
-
-#include <zircon/assert.h>
-
-namespace scenic {
-
-HostImageCycler::HostImageCycler(Session* session)
-    : EntityNode(session),
-      content_node_(session),
-      content_material_(session),
-      image_pool_(session, kNumBuffers) {
-  content_node_.SetMaterial(content_material_);
-  AddChild(content_node_);
-}
-
-HostImageCycler::~HostImageCycler() = default;
-
-const HostImage* HostImageCycler::AcquireImage(
-    uint32_t width, uint32_t height, uint32_t stride,
-    fuchsia::images::PixelFormat pixel_format,
-    fuchsia::images::ColorSpace color_space) {
-  ZX_DEBUG_ASSERT(!acquired_image_);
-
-  // Update the image pool and content shape.
-  fuchsia::images::ImageInfo image_info;
-  image_info.width = width;
-  image_info.height = height;
-  image_info.stride = stride;
-  image_info.pixel_format = pixel_format;
-  image_info.color_space = color_space;
-  image_info.tiling = fuchsia::images::Tiling::LINEAR;
-  reconfigured_ = image_pool_.Configure(&image_info);
-
-  const HostImage* image = image_pool_.GetImage(image_index_);
-  ZX_DEBUG_ASSERT(image);
-  acquired_image_ = true;
-  return image;
-}
-
-void HostImageCycler::ReleaseAndSwapImage() {
-  ZX_DEBUG_ASSERT(acquired_image_);
-  acquired_image_ = false;
-
-  const HostImage* image = image_pool_.GetImage(image_index_);
-  ZX_DEBUG_ASSERT(image);
-  content_material_.SetTexture(*image);
-
-  if (reconfigured_) {
-    Rectangle content_rect(content_node_.session(),
-                           image_pool_.image_info()->width,
-                           image_pool_.image_info()->height);
-    content_node_.SetShape(content_rect);
-    reconfigured_ = false;
-  }
-
-  // TODO(MZ-145): Define an |InvalidateCmd| on |Image| instead.
-  image_pool_.DiscardImage(image_index_);
-  image_index_ = (image_index_ + 1) % kNumBuffers;
-}
-
-}  // namespace scenic
diff --git a/pkg/scenic_cpp/host_memory.cc b/pkg/scenic_cpp/host_memory.cc
deleted file mode 100644
index d01e665..0000000
--- a/pkg/scenic_cpp/host_memory.cc
+++ /dev/null
@@ -1,151 +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.
-
-#include "lib/ui/scenic/cpp/host_memory.h"
-
-#include <lib/zx/vmar.h>
-#include <lib/zx/vmo.h>
-#include <zircon/assert.h>
-#include <memory>
-
-#include "lib/ui/scenic/cpp/commands.h"
-
-namespace scenic {
-namespace {
-
-// Returns true if a memory object is of an appropriate size to recycle.
-bool CanReuseMemory(const HostMemory& memory, size_t desired_size) {
-  return memory.data_size() >= desired_size &&
-         memory.data_size() <= desired_size * 2;
-}
-
-std::pair<zx::vmo, std::shared_ptr<HostData>> AllocateMemory(size_t size) {
-  // Create the vmo and map it into this process.
-  zx::vmo local_vmo;
-  zx_status_t status = zx::vmo::create(size, 0u, &local_vmo);
-  ZX_ASSERT_MSG(status == ZX_OK, "vmo create failed: status=%d", status);
-  auto data = std::make_shared<HostData>(local_vmo, 0u, size);
-
-  // Drop rights before we transfer the VMO to the session manager.
-  // TODO(MA-492): Now that host-local memory may be concurrently used as
-  // device-local memory on UMA platforms, we need to keep all permissions on
-  // the duplicated vmo handle, until Vulkan can import read-only memory.
-  zx::vmo remote_vmo;
-  status = local_vmo.replace(ZX_RIGHT_SAME_RIGHTS, &remote_vmo);
-  ZX_ASSERT_MSG(status == ZX_OK, "replace rights failed: status=%d", status);
-  return std::make_pair(std::move(remote_vmo), std::move(data));
-}
-
-}  // namespace
-
-HostData::HostData(const zx::vmo& vmo, off_t offset, size_t size)
-    : size_(size) {
-  static const uint32_t flags =
-      ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE | ZX_VM_FLAG_MAP_RANGE;
-  uintptr_t ptr;
-  zx_status_t status =
-      zx::vmar::root_self()->map(0, vmo, offset, size, flags, &ptr);
-  ZX_ASSERT_MSG(status == ZX_OK, "map failed: status=%d", status);
-  ptr_ = reinterpret_cast<void*>(ptr);
-}
-
-HostData::~HostData() {
-  zx_status_t status =
-      zx::vmar::root_self()->unmap(reinterpret_cast<uintptr_t>(ptr_), size_);
-  ZX_ASSERT_MSG(status == ZX_OK, "unmap failed: status=%d", status);
-}
-
-HostMemory::HostMemory(Session* session, size_t size)
-    : HostMemory(session, AllocateMemory(size)) {}
-
-HostMemory::HostMemory(Session* session,
-                       std::pair<zx::vmo, std::shared_ptr<HostData>> init)
-    : Memory(session, std::move(init.first), init.second->size(),
-             fuchsia::images::MemoryType::HOST_MEMORY),
-      data_(std::move(init.second)) {}
-
-HostMemory::HostMemory(HostMemory&& moved)
-    : Memory(std::move(moved)), data_(std::move(moved.data_)) {}
-
-HostMemory::~HostMemory() = default;
-
-HostImage::HostImage(const HostMemory& memory, off_t memory_offset,
-                     fuchsia::images::ImageInfo info)
-    : HostImage(memory.session(), memory.id(), memory_offset, memory.data(),
-                std::move(info)) {}
-
-HostImage::HostImage(Session* session, uint32_t memory_id, off_t memory_offset,
-                     std::shared_ptr<HostData> data,
-                     fuchsia::images::ImageInfo info)
-    : Image(session, memory_id, memory_offset, std::move(info)),
-      data_(std::move(data)) {}
-
-HostImage::HostImage(HostImage&& moved)
-    : Image(std::move(moved)), data_(std::move(moved.data_)) {}
-
-HostImage::~HostImage() = default;
-
-HostImagePool::HostImagePool(Session* session, uint32_t num_images)
-    : session_(session), image_ptrs_(num_images), memory_ptrs_(num_images) {}
-
-HostImagePool::~HostImagePool() = default;
-
-// TODO(mikejurka): Double-check these changes
-bool HostImagePool::Configure(const fuchsia::images::ImageInfo* image_info) {
-  if (image_info) {
-    if (configured_ && ImageInfoEquals(*image_info, image_info_)) {
-      return false;  // no change
-    }
-    configured_ = true;
-    image_info_ = *image_info;
-  } else {
-    if (!configured_) {
-      return false;  // no change
-    }
-    configured_ = false;
-  }
-
-  for (uint32_t i = 0; i < num_images(); i++)
-    image_ptrs_[i].reset();
-
-  if (configured_) {
-    ZX_DEBUG_ASSERT(image_info_.width > 0);
-    ZX_DEBUG_ASSERT(image_info_.height > 0);
-    ZX_DEBUG_ASSERT(image_info_.stride > 0);
-
-    size_t desired_size = Image::ComputeSize(image_info_);
-    for (uint32_t i = 0; i < num_images(); i++) {
-      if (memory_ptrs_[i] && !CanReuseMemory(*memory_ptrs_[i], desired_size))
-        memory_ptrs_[i].reset();
-    }
-  }
-  return true;
-}
-
-const HostImage* HostImagePool::GetImage(uint32_t index) {
-  ZX_DEBUG_ASSERT(index < num_images());
-
-  if (image_ptrs_[index])
-    return image_ptrs_[index].get();
-
-  if (!configured_)
-    return nullptr;
-
-  if (!memory_ptrs_[index]) {
-    memory_ptrs_[index] =
-        std::make_unique<HostMemory>(session_, Image::ComputeSize(image_info_));
-  }
-
-  image_ptrs_[index] =
-      std::make_unique<HostImage>(*memory_ptrs_[index], 0u, image_info_);
-  return image_ptrs_[index].get();
-}
-
-void HostImagePool::DiscardImage(uint32_t index) {
-  ZX_DEBUG_ASSERT(index < num_images());
-
-  image_ptrs_[index].reset();
-}
-
-}  // namespace scenic
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/commands.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/commands.h
deleted file mode 100644
index 2c44a2f..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/commands.h
+++ /dev/null
@@ -1,268 +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.
-
-#ifndef LIB_UI_SCENIC_CPP_COMMANDS_H_
-#define LIB_UI_SCENIC_CPP_COMMANDS_H_
-
-#include <string>
-
-#include <fuchsia/images/cpp/fidl.h>
-#include <fuchsia/ui/gfx/cpp/fidl.h>
-#include <fuchsia/ui/scenic/cpp/fidl.h>
-
-namespace scenic {
-
-constexpr float kZeroesFloat3[3] = {0.f, 0.f, 0.f};
-constexpr float kOnesFloat3[3] = {1.f, 1.f, 1.f};
-// A quaterion that has no rotation.
-constexpr float kQuaternionDefault[4] = {0.f, 0.f, 0.f, 1.f};
-
-// Helper function for wrapping a GFX command as a Scenic command.
-fuchsia::ui::scenic::Command NewCommand(fuchsia::ui::gfx::Command command);
-
-// Helper function for wrapping an input command as a Scenic command.
-fuchsia::ui::scenic::Command NewCommand(fuchsia::ui::input::Command command);
-
-// Resource creation.
-fuchsia::ui::gfx::Command NewCreateMemoryCmd(
-    uint32_t id, zx::vmo vmo, uint64_t allocation_size,
-    fuchsia::images::MemoryType memory_type);
-fuchsia::ui::gfx::Command NewCreateImageCmd(uint32_t id, uint32_t memory_id,
-                                            uint32_t memory_offset,
-                                            fuchsia::images::ImageInfo info);
-fuchsia::ui::gfx::Command NewCreateImageCmd(
-    uint32_t id, uint32_t memory_id, uint32_t memory_offset,
-    fuchsia::images::PixelFormat format,
-    fuchsia::images::ColorSpace color_space, fuchsia::images::Tiling tiling,
-    uint32_t width, uint32_t height, uint32_t stride);
-fuchsia::ui::gfx::Command NewCreateImagePipeCmd(
-    uint32_t id, ::fidl::InterfaceRequest<fuchsia::images::ImagePipe> request);
-fuchsia::ui::gfx::Command NewCreateBufferCmd(uint32_t id, uint32_t memory_id,
-                                             uint32_t memory_offset,
-                                             uint32_t num_bytes);
-
-fuchsia::ui::gfx::Command NewCreateCompositorCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateDisplayCompositorCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateLayerStackCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateLayerCmd(uint32_t id);
-
-fuchsia::ui::gfx::Command NewCreateSceneCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateCameraCmd(uint32_t id, uint32_t scene_id);
-fuchsia::ui::gfx::Command NewCreateStereoCameraCmd(uint32_t id,
-                                                   uint32_t scene_id);
-fuchsia::ui::gfx::Command NewCreateRendererCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateAmbientLightCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateDirectionalLightCmd(uint32_t id);
-
-fuchsia::ui::gfx::Command NewCreateCircleCmd(uint32_t id, float radius);
-fuchsia::ui::gfx::Command NewCreateRectangleCmd(uint32_t id, float width,
-                                                float height);
-fuchsia::ui::gfx::Command NewCreateRoundedRectangleCmd(
-    uint32_t id, float width, float height, float top_left_radius,
-    float top_right_radius, float bottom_right_radius,
-    float bottom_left_radius);
-
-// Variant of NewCreateCircleCmd that uses a variable radius instead of a
-// constant one set at construction time.
-fuchsia::ui::gfx::Command NewCreateVarCircleCmd(uint32_t id,
-                                                uint32_t radius_var_id);
-// Variant of NewCreateRectangleCmd that uses a variable width/height
-// instead of constant ones set at construction time.
-fuchsia::ui::gfx::Command NewCreateVarRectangleCmd(uint32_t id,
-                                                   uint32_t width_var_id,
-                                                   uint32_t height_var_id);
-// Variant of NewCreateRoundedRectangleCmd that uses a variable
-// width/height/etc. instead of constant ones set at construction time.
-fuchsia::ui::gfx::Command NewCreateVarRoundedRectangleCmd(
-    uint32_t id, uint32_t width_var_id, uint32_t height_var_id,
-    uint32_t top_left_radius_var_id, uint32_t top_right_radius_var_id,
-    uint32_t bottom_left_radius_var_id, uint32_t bottom_right_radius_var_id);
-
-fuchsia::ui::gfx::Command NewCreateMeshCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateMaterialCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateClipNodeCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateEntityNodeCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateOpacityNodeCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateShapeNodeCmd(uint32_t id);
-fuchsia::ui::gfx::Command NewCreateViewCmd(uint32_t id, zx::eventpair token,
-                                           const std::string& debug_name);
-fuchsia::ui::gfx::Command NewCreateViewHolderCmd(uint32_t id,
-                                                 zx::eventpair token,
-                                                 const std::string& debug_name);
-fuchsia::ui::gfx::Command NewCreateVariableCmd(uint32_t id,
-                                               fuchsia::ui::gfx::Value value);
-
-fuchsia::ui::gfx::Command NewReleaseResourceCmd(uint32_t id);
-
-// Export & Import operations.
-fuchsia::ui::gfx::Command NewExportResourceCmd(uint32_t resource_id,
-                                               zx::eventpair export_token);
-fuchsia::ui::gfx::Command NewImportResourceCmd(
-    uint32_t resource_id, fuchsia::ui::gfx::ImportSpec spec,
-    zx::eventpair import_token);
-
-// Exports the resource and returns an import token in |out_import_token|
-// which allows it to be imported into other sessions.
-fuchsia::ui::gfx::Command NewExportResourceCmdAsRequest(
-    uint32_t resource_id, zx::eventpair* out_import_token);
-
-// Imports the resource and returns an export token in |out_export_token|
-// by which another session can export a resource to associate with this import.
-fuchsia::ui::gfx::Command NewImportResourceCmdAsRequest(
-    uint32_t resource_id, fuchsia::ui::gfx::ImportSpec import_spec,
-    zx::eventpair* out_export_token);
-
-// View/ViewHolder commands.
-fuchsia::ui::gfx::Command NewSetViewPropertiesCmd(
-    uint32_t view_holder_id, const float bounding_box_min[3],
-    const float bounding_box_max[3], const float inset_from_min[3],
-    const float inset_from_max[3]);
-fuchsia::ui::gfx::Command NewSetViewPropertiesCmd(
-    uint32_t view_holder_id, const fuchsia::ui::gfx::ViewProperties& props);
-
-// Node operations.
-fuchsia::ui::gfx::Command NewAddChildCmd(uint32_t node_id, uint32_t child_id);
-fuchsia::ui::gfx::Command NewAddPartCmd(uint32_t node_id, uint32_t part_id);
-fuchsia::ui::gfx::Command NewDetachCmd(uint32_t node_id);
-fuchsia::ui::gfx::Command NewDetachChildrenCmd(uint32_t node_id);
-fuchsia::ui::gfx::Command NewSetTranslationCmd(uint32_t node_id,
-                                               const float translation[3]);
-fuchsia::ui::gfx::Command NewSetTranslationCmd(uint32_t node_id,
-                                               uint32_t variable_id);
-fuchsia::ui::gfx::Command NewSetScaleCmd(uint32_t node_id,
-                                         const float scale[3]);
-fuchsia::ui::gfx::Command NewSetScaleCmd(uint32_t node_id,
-                                         uint32_t variable_id);
-fuchsia::ui::gfx::Command NewSetRotationCmd(uint32_t node_id,
-                                            const float quaternion[4]);
-fuchsia::ui::gfx::Command NewSetRotationCmd(uint32_t node_id,
-                                            uint32_t variable_id);
-fuchsia::ui::gfx::Command NewSetAnchorCmd(uint32_t node_id,
-                                          const float anchor[3]);
-fuchsia::ui::gfx::Command NewSetAnchorCmd(uint32_t node_id,
-                                          uint32_t variable_id);
-
-fuchsia::ui::gfx::Command NewSetOpacityCmd(uint32_t node_id, float opacity);
-fuchsia::ui::gfx::Command NewSendSizeChangeHintCmdHACK(
-    uint32_t node_id, float width_change_factor, float height_change_factor);
-fuchsia::ui::gfx::Command NewSetShapeCmd(uint32_t node_id, uint32_t shape_id);
-fuchsia::ui::gfx::Command NewSetMaterialCmd(uint32_t node_id,
-                                            uint32_t material_id);
-fuchsia::ui::gfx::Command NewSetClipCmd(uint32_t node_id, uint32_t clip_id,
-                                        bool clip_to_self);
-fuchsia::ui::gfx::Command NewSetTagCmd(uint32_t node_id, uint32_t tag_value);
-fuchsia::ui::gfx::Command NewSetHitTestBehaviorCmd(
-    uint32_t node_id, fuchsia::ui::gfx::HitTestBehavior hit_test_behavior);
-fuchsia::ui::gfx::Command NewTakeSnapshotCmdHACK(
-    uint32_t id, fuchsia::ui::gfx::SnapshotCallbackHACKPtr callback);
-
-// Camera and lighting operations.
-
-fuchsia::ui::gfx::Command NewSetCameraCmd(uint32_t renderer_id,
-                                          uint32_t camera_id);
-fuchsia::ui::gfx::Command NewSetCameraTransformCmd(uint32_t camera_id,
-                                                   const float eye_position[3],
-                                                   const float eye_look_at[3],
-                                                   const float eye_up[3]);
-fuchsia::ui::gfx::Command NewSetCameraProjectionCmd(uint32_t camera_id,
-                                                    const float fovy);
-
-fuchsia::ui::gfx::Command NewSetCameraPoseBufferCmd(uint32_t camera_id,
-                                                    uint32_t buffer_id,
-                                                    uint32_t num_entries,
-                                                    int64_t base_time,
-                                                    uint64_t time_interval);
-
-fuchsia::ui::gfx::Command NewSetStereoCameraProjectionCmd(
-    uint32_t camera_id, const float left_projection[16],
-    const float right_projection[16]);
-
-fuchsia::ui::gfx::Command NewSetLightColorCmd(uint32_t light_id,
-                                              const float rgb[3]);
-fuchsia::ui::gfx::Command NewSetLightColorCmd(uint32_t light_id,
-                                              uint32_t variable_id);
-fuchsia::ui::gfx::Command NewSetLightDirectionCmd(uint32_t light_id,
-                                                  const float direction[3]);
-fuchsia::ui::gfx::Command NewSetLightDirectionCmd(uint32_t light_id,
-                                                  uint32_t variable_id);
-fuchsia::ui::gfx::Command NewAddLightCmd(uint32_t scene_id, uint32_t light_id);
-fuchsia::ui::gfx::Command NewDetachLightCmd(uint32_t light_id);
-fuchsia::ui::gfx::Command NewDetachLightsCmd(uint32_t scene_id);
-
-// Material operations.
-fuchsia::ui::gfx::Command NewSetTextureCmd(uint32_t node_id, uint32_t image_id);
-fuchsia::ui::gfx::Command NewSetColorCmd(uint32_t node_id, uint8_t red,
-                                         uint8_t green, uint8_t blue,
-                                         uint8_t alpha);
-
-// Mesh operations.
-fuchsia::ui::gfx::MeshVertexFormat NewMeshVertexFormat(
-    fuchsia::ui::gfx::ValueType position_type,
-    fuchsia::ui::gfx::ValueType normal_type,
-    fuchsia::ui::gfx::ValueType tex_coord_type);
-// These arguments are documented in commands.fidl; see BindMeshBuffersCmd.
-fuchsia::ui::gfx::Command NewBindMeshBuffersCmd(
-    uint32_t mesh_id, uint32_t index_buffer_id,
-    fuchsia::ui::gfx::MeshIndexFormat index_format, uint64_t index_offset,
-    uint32_t index_count, uint32_t vertex_buffer_id,
-    fuchsia::ui::gfx::MeshVertexFormat vertex_format, uint64_t vertex_offset,
-    uint32_t vertex_count, const float bounding_box_min[3],
-    const float bounding_box_max[3]);
-
-// Layer / LayerStack / Compositor operations.
-fuchsia::ui::gfx::Command NewAddLayerCmd(uint32_t layer_stack_id,
-                                         uint32_t layer_id);
-fuchsia::ui::gfx::Command NewRemoveLayerCmd(uint32_t layer_stack_id,
-                                            uint32_t layer_id);
-fuchsia::ui::gfx::Command NewRemoveAllLayersCmd(uint32_t layer_stack_id);
-fuchsia::ui::gfx::Command NewSetLayerStackCmd(uint32_t compositor_id,
-                                              uint32_t layer_stack_id);
-fuchsia::ui::gfx::Command NewSetRendererCmd(uint32_t layer_id,
-                                            uint32_t renderer_id);
-fuchsia::ui::gfx::Command NewSetRendererParamCmd(
-    uint32_t renderer_id, fuchsia::ui::gfx::RendererParam param);
-fuchsia::ui::gfx::Command NewSetSizeCmd(uint32_t node_id, const float size[2]);
-
-// Event operations.
-fuchsia::ui::gfx::Command NewSetEventMaskCmd(uint32_t resource_id,
-                                             uint32_t event_mask);
-
-// Diagnostic operations.
-fuchsia::ui::gfx::Command NewSetLabelCmd(uint32_t resource_id,
-                                         const std::string& label);
-
-// Debugging operations.
-fuchsia::ui::gfx::Command NewSetDisableClippingCmd(uint32_t resource_id,
-                                                   bool disable_clipping);
-
-// Basic types.
-fuchsia::ui::gfx::FloatValue NewFloatValue(float value);
-fuchsia::ui::gfx::Vector2Value NewVector2Value(const float value[2]);
-fuchsia::ui::gfx::Vector2Value NewVector2Value(uint32_t variable_id);
-fuchsia::ui::gfx::Vector3Value NewVector3Value(const float value[3]);
-fuchsia::ui::gfx::Vector3Value NewVector3Value(uint32_t variable_id);
-fuchsia::ui::gfx::Vector4Value NewVector4Value(const float value[4]);
-fuchsia::ui::gfx::Vector4Value NewVector4Value(uint32_t variable_id);
-fuchsia::ui::gfx::QuaternionValue NewQuaternionValue(const float value[4]);
-fuchsia::ui::gfx::QuaternionValue NewQuaternionValue(uint32_t variable_id);
-fuchsia::ui::gfx::Matrix4Value NewMatrix4Value(const float value[16]);
-fuchsia::ui::gfx::Matrix4Value NewMatrix4Value(uint32_t variable_id);
-fuchsia::ui::gfx::ColorRgbValue NewColorRgbValue(float red, float green,
-                                                 float blue);
-fuchsia::ui::gfx::ColorRgbValue NewColorRgbValue(uint32_t variable_id);
-fuchsia::ui::gfx::ColorRgbaValue NewColorRgbaValue(const uint8_t value[4]);
-fuchsia::ui::gfx::ColorRgbaValue NewColorRgbaValue(uint32_t variable_id);
-fuchsia::ui::gfx::QuaternionValue NewQuaternionValue(const float value[4]);
-fuchsia::ui::gfx::vec2 NewVector2(const float value[2]);
-fuchsia::ui::gfx::vec3 NewVector3(const float value[3]);
-fuchsia::ui::gfx::vec4 NewVector4(const float value[4]);
-
-// Utilities.
-
-bool ImageInfoEquals(const fuchsia::images::ImageInfo& a,
-                     const fuchsia::images::ImageInfo& b);
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_COMMANDS_H_
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_image_cycler.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_image_cycler.h
deleted file mode 100644
index 0e89ce4..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_image_cycler.h
+++ /dev/null
@@ -1,50 +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.
-
-#ifndef LIB_UI_SCENIC_CPP_HOST_IMAGE_CYCLER_H_
-#define LIB_UI_SCENIC_CPP_HOST_IMAGE_CYCLER_H_
-
-#include "lib/ui/scenic/cpp/host_memory.h"
-
-namespace scenic {
-
-// Creates a node which presents double-buffered content drawn to an image
-// in host memory.
-class HostImageCycler : public scenic::EntityNode {
- public:
-  explicit HostImageCycler(scenic::Session* session);
-  ~HostImageCycler();
-
-  HostImageCycler(const HostImageCycler&) = delete;
-  HostImageCycler& operator=(const HostImageCycler&) = delete;
-
-  // Acquires an image for rendering.
-  // At most one image can be acquired at a time.
-  // The client is responsible for clearing the image.
-  const HostImage* AcquireImage(uint32_t width, uint32_t height,
-                                uint32_t stride,
-                                fuchsia::images::PixelFormat pixel_format =
-                                    fuchsia::images::PixelFormat::BGRA_8,
-                                fuchsia::images::ColorSpace color_space =
-                                    fuchsia::images::ColorSpace::SRGB);
-
-  // Releases the image most recently acquired using |AcquireImage()|.
-  // Sets the content node's texture to be backed by the image.
-  void ReleaseAndSwapImage();
-
- private:
-  static constexpr uint32_t kNumBuffers = 2u;
-
-  scenic::ShapeNode content_node_;
-  scenic::Material content_material_;
-  scenic::HostImagePool image_pool_;
-
-  bool acquired_image_ = false;
-  bool reconfigured_ = false;
-  uint32_t image_index_ = 0u;
-};
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_HOST_IMAGE_CYCLER_H_
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_memory.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_memory.h
deleted file mode 100644
index 6209422..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_memory.h
+++ /dev/null
@@ -1,149 +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.
-
-#ifndef LIB_UI_SCENIC_CPP_HOST_MEMORY_H_
-#define LIB_UI_SCENIC_CPP_HOST_MEMORY_H_
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <lib/zx/vmo.h>
-
-#include "lib/ui/scenic/cpp/resources.h"
-
-namespace scenic {
-
-// Provides access to data stored in a host-accessible shared memory region.
-// The memory is unmapped once all references to this object have been released.
-class HostData : public std::enable_shared_from_this<HostData> {
- public:
-  // Maps a range of an existing VMO into memory.
-  HostData(const zx::vmo& vmo, off_t offset, size_t size);
-  ~HostData();
-
-  HostData(const HostData&) = delete;
-  HostData& operator=(const HostData&) = delete;
-
-  // Gets the size of the data in bytes.
-  size_t size() const { return size_; }
-
-  // Gets a pointer to the data.
-  void* ptr() const { return ptr_; }
-
- private:
-  size_t const size_;
-  void* ptr_;
-};
-
-// Represents a host-accessible shared memory backed memory resource in a
-// session.  The memory is mapped read/write into this process and transferred
-// read-only to the scene manager.  The shared memory region is retained until
-// this object is destroyed.
-// TODO(MZ-268): Don't inherit from Memory, so that Memory can have a public
-// move constructor.
-// TODO(MA-492): The memory is currently not transferred read-only, as we may
-// choose to map it as device-local memory on UMA platforms, and Vulkan requires
-// a read/write vmo in order to successfully import the memory.
-class HostMemory final : public Memory {
- public:
-  HostMemory(Session* session, size_t size);
-  HostMemory(HostMemory&& moved);
-  ~HostMemory();
-
-  HostMemory(const HostMemory&) = delete;
-  HostMemory& operator=(const HostMemory&) = delete;
-
-  // Gets a reference to the underlying shared memory region.
-  const std::shared_ptr<HostData>& data() const { return data_; }
-
-  // Gets the size of the data in bytes.
-  size_t data_size() const { return data_->size(); }
-
-  // Gets a pointer to the data.
-  void* data_ptr() const { return data_->ptr(); }
-
- private:
-  explicit HostMemory(Session* session,
-                      std::pair<zx::vmo, std::shared_ptr<HostData>> init);
-
-  std::shared_ptr<HostData> data_;
-};
-
-// Represents an image resource backed by host-accessible shared memory bound to
-// a session.  The shared memory region is retained until this object is
-// destroyed.
-// TODO(MZ-268): Don't inherit from Image, so that Image can have a public move
-// constructor.
-class HostImage final : public Image {
- public:
-  HostImage(const HostMemory& memory, off_t memory_offset,
-            fuchsia::images::ImageInfo info);
-  HostImage(Session* session, uint32_t memory_id, off_t memory_offset,
-            std::shared_ptr<HostData> data, fuchsia::images::ImageInfo info);
-  HostImage(HostImage&& moved);
-  ~HostImage();
-
-  HostImage(const HostImage&) = delete;
-  HostImage& operator=(const HostImage&) = delete;
-
-  // Gets a reference to the underlying shared memory region.
-  const std::shared_ptr<HostData>& data() const { return data_; }
-
-  // Gets a pointer to the image data.
-  void* image_ptr() const {
-    return static_cast<uint8_t*>(data_->ptr()) + memory_offset();
-  }
-
- private:
-  std::shared_ptr<HostData> data_;
-};
-
-// Represents a pool of image resources backed by host-accessible shared memory
-// bound to a session.  All images in the pool must have the same layout.
-class HostImagePool {
- public:
-  // Creates a pool which can supply up to |num_images| images on demand.
-  explicit HostImagePool(Session* session, uint32_t num_images);
-  ~HostImagePool();
-
-  HostImagePool(const HostImagePool&) = delete;
-  HostImagePool& operator=(const HostImagePool&) = delete;
-
-  // The number of images which this pool can manage.
-  uint32_t num_images() const { return image_ptrs_.size(); }
-
-  // Gets information about the images in the pool, or nullptr if the
-  // pool is not configured.
-  const fuchsia::images::ImageInfo* image_info() const { return &image_info_; }
-
-  // Sets the image information for images in the pool.
-  // Previously created images are released but their memory may be reused.
-  // If |image_info| is nullptr, the pool reverts to an non-configured state;
-  // all images are released but the memory is retained for recycling.
-  // Returns true if the configuration changed.
-  bool Configure(const fuchsia::images::ImageInfo* image_info);
-
-  // Gets the image with the specified index.
-  // The |index| must be between 0 and |num_images() - 1|.
-  // The returned pointer is valid until the image is discarded or the
-  // pool is reconfigured.  Returns nullptr if the pool is not configured.
-  const HostImage* GetImage(uint32_t index);
-
-  // Discards the image with the specified index but recycles its memory.
-  // The |index| must be between 0 and |num_images() - 1|.
-  void DiscardImage(uint32_t index);
-
- private:
-  Session* const session_;
-
-  bool configured_ = false;
-  fuchsia::images::ImageInfo image_info_;
-  std::vector<std::unique_ptr<HostImage>> image_ptrs_;
-  std::vector<std::unique_ptr<HostMemory>> memory_ptrs_;
-};
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_HOST_MEMORY_H_
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/id.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/id.h
deleted file mode 100644
index a500046..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/id.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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.
-
-#ifndef LIB_UI_SCENIC_CPP_ID_H_
-#define LIB_UI_SCENIC_CPP_ID_H_
-
-#include <cstdint>
-
-namespace scenic {
-
-using SessionId = uint64_t;
-using ResourceId = uint32_t;
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_ID_H_
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/resources.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/resources.h
deleted file mode 100644
index 40d6b0c..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/resources.h
+++ /dev/null
@@ -1,593 +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.
-
-#ifndef LIB_UI_SCENIC_CPP_RESOURCES_H_
-#define LIB_UI_SCENIC_CPP_RESOURCES_H_
-
-#include "lib/ui/scenic/cpp/session.h"
-
-#include <zircon/assert.h>
-
-namespace scenic {
-
-// Represents a resource in a session with a dynamically allocated id.
-// The resource is released from the session when this object is destroyed
-// but it may still be in use within the session if other resources reference
-// it.
-// This type cannot be instantiated, please see subclasses.
-class Resource {
- public:
-  // Gets the session which owns this resource.
-  Session* session() const {
-    ZX_DEBUG_ASSERT(session_);
-    return session_;
-  }
-
-  // Gets the resource's id.
-  uint32_t id() const { return id_; }
-
-  // Exports the resource and associates it with |export_token|.
-  void Export(zx::eventpair export_token);
-
-  // Exports the resource and returns an import token in |out_import_token|
-  // which allows it to be imported into other sessions.
-  void ExportAsRequest(zx::eventpair* out_import_token);
-
-  // Sets which events a resource should deliver to the session listener.
-  void SetEventMask(uint32_t event_mask);
-
-  // Sets a label to help developers identify the purpose of the resource
-  // when using diagnostic tools.
-  void SetLabel(const std::string& label);
-
- protected:
-  explicit Resource(Session* session);
-  Resource(Resource&& moved);
-
-  Resource(const Resource&) = delete;
-  Resource& operator=(const Resource&) = delete;
-
-  virtual ~Resource();
-
- private:
-  Session* const session_;
-  uint32_t const id_;
-};
-
-// Represents a memory resource in a session.
-// TODO(MZ-268): Make this class final, and add public move constructor.
-class Memory : public Resource {
- public:
-  Memory(Session* session, zx::vmo vmo, uint64_t allocation_size,
-         fuchsia::images::MemoryType memory_type);
-  ~Memory();
-
-  // Gets the underlying VMO's memory type, indicating whether it represents
-  // host or GPU memory.
-  fuchsia::images::MemoryType memory_type() const { return memory_type_; }
-
- protected:
-  Memory(Memory&& moved);
-
- private:
-  fuchsia::images::MemoryType const memory_type_;
-};
-
-// Represents an abstract shape resource in a session.
-// This type cannot be instantiated, please see subclasses.
-class Shape : public Resource {
- protected:
-  explicit Shape(Session* session);
-  Shape(Shape&& moved);
-  ~Shape();
-};
-
-// Represents a circle shape resource in a session.
-class Circle final : public Shape {
- public:
-  Circle(Session* session, float radius);
-  Circle(Circle&& moved);
-  ~Circle();
-};
-
-// Represents a rectangle shape resource in a session.
-class Rectangle final : public Shape {
- public:
-  Rectangle(Session* session, float width, float height);
-  Rectangle(Rectangle&& moved);
-  ~Rectangle();
-};
-
-// Represents a rounded rectangle shape resource in a session.
-class RoundedRectangle final : public Shape {
- public:
-  RoundedRectangle(Session* session, float width, float height,
-                   float top_left_radius, float top_right_radius,
-                   float bottom_right_radius, float bottom_left_radius);
-  RoundedRectangle(RoundedRectangle&& moved);
-  ~RoundedRectangle();
-};
-
-// Represents an image resource in a session.
-// TODO(MZ-268): Make this class final, and add public move constructor.
-class Image : public Resource {
- public:
-  // Creates an image resource bound to a session.
-  Image(const Memory& memory, off_t memory_offset,
-        fuchsia::images::ImageInfo info);
-  Image(Session* session, uint32_t memory_id, off_t memory_offset,
-        fuchsia::images::ImageInfo info);
-  ~Image();
-
-  // Returns the number of bytes needed to represent an image.
-  static size_t ComputeSize(const fuchsia::images::ImageInfo& image_info);
-
-  // Gets the byte offset of the image within its memory resource.
-  off_t memory_offset() const { return memory_offset_; }
-
-  // Gets information about the image's layout.
-  const fuchsia::images::ImageInfo& info() const { return info_; }
-
- protected:
-  Image(Image&& moved);
-
- private:
-  off_t const memory_offset_;
-  fuchsia::images::ImageInfo const info_;
-};
-
-// Represents a buffer that is immutably bound to a range of a memory resource.
-class Buffer final : public Resource {
- public:
-  Buffer(const Memory& memory, off_t memory_offset, size_t buffer_size);
-  Buffer(Session* session, uint32_t memory_id, off_t memory_offset,
-         size_t buffer_size);
-  Buffer(Buffer&& moved);
-  ~Buffer();
-};
-
-// Represents a mesh resource in a session.  Before it can be rendered, it
-// must be bound to index and vertex arrays by calling the BindBuffers() method.
-class Mesh final : public Shape {
- public:
-  Mesh(Session* session);
-  Mesh(Mesh&& moved);
-  ~Mesh();
-
-  // These arguments are documented in commands.fidl; see
-  // BindMeshBuffersCmd.
-  void BindBuffers(const Buffer& index_buffer,
-                   fuchsia::ui::gfx::MeshIndexFormat index_format,
-                   uint64_t index_offset, uint32_t index_count,
-                   const Buffer& vertex_buffer,
-                   fuchsia::ui::gfx::MeshVertexFormat vertex_format,
-                   uint64_t vertex_offset, uint32_t vertex_count,
-                   const float bounding_box_min[3],
-                   const float bounding_box_max[3]);
-};
-
-// Represents a material resource in a session.
-class Material final : public Resource {
- public:
-  explicit Material(Session* session);
-  Material(Material&& moved);
-  ~Material();
-
-  // Sets the material's texture.
-  void SetTexture(const Image& image) {
-    ZX_DEBUG_ASSERT(session() == image.session());
-    SetTexture(image.id());
-  }
-  void SetTexture(uint32_t image_id);
-
-  // Sets the material's color.
-  void SetColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha);
-};
-
-// Represents an abstract node resource in a session.
-// This type cannot be instantiated, please see subclasses.
-class Node : public Resource {
- public:
-  // Sets the node's transform properties.
-  void SetTranslation(float tx, float ty, float tz) {
-    SetTranslation((float[3]){tx, ty, tz});
-  }
-  void SetTranslation(const float translation[3]);
-  void SetTranslation(uint32_t variable_id);
-  void SetScale(float sx, float sy, float sz) {
-    SetScale((float[3]){sx, sy, sz});
-  }
-  void SetScale(const float scale[3]);
-  void SetScale(uint32_t variable_id);
-  void SetRotation(float qi, float qj, float qk, float qw) {
-    SetRotation((float[4]){qi, qj, qk, qw});
-  }
-  void SetRotation(const float quaternion[4]);
-  void SetRotation(uint32_t variable_id);
-  void SetAnchor(float ax, float ay, float az) {
-    SetAnchor((float[3]){ax, ay, az});
-  }
-  void SetAnchor(const float anchor[3]);
-  void SetAnchor(uint32_t variable_id);
-
-  void SendSizeChangeHint(float width_change_factor,
-                          float height_change_factor);
-
-  // Sets the node's tag value.
-  void SetTag(uint32_t tag_value);
-
-  // Sets the node's hit test behavior.
-  void SetHitTestBehavior(fuchsia::ui::gfx::HitTestBehavior hit_test_behavior);
-
-  // Detaches the node from its parent.
-  void Detach();
-
- protected:
-  explicit Node(Session* session);
-  Node(Node&& moved);
-  ~Node();
-};
-
-// Represents an shape node resource in a session.
-class ShapeNode final : public Node {
- public:
-  explicit ShapeNode(Session* session);
-  ShapeNode(ShapeNode&& moved);
-  ~ShapeNode();
-
-  // Sets the shape that the shape node should draw.
-  void SetShape(const Shape& shape) {
-    ZX_DEBUG_ASSERT(session() == shape.session());
-    SetShape(shape.id());
-  }
-  void SetShape(uint32_t shape_id);
-
-  // Sets the material with which to draw the shape.
-  void SetMaterial(const Material& material) {
-    ZX_DEBUG_ASSERT(session() == material.session());
-    SetMaterial(material.id());
-  }
-  void SetMaterial(uint32_t material_id);
-};
-
-// Abstract base class for nodes which can have child nodes.
-// This type cannot be instantiated, please see subclasses.
-class ContainerNode : public Node {
- public:
-  // Adds a child to the node.
-  void AddChild(const Node& child) {
-    ZX_DEBUG_ASSERT(session() == child.session());
-    AddChild(child.id());
-  }
-  void AddChild(uint32_t child_node_id);
-
-  void AddPart(const Node& part) {
-    ZX_DEBUG_ASSERT(session() == part.session());
-    AddPart(part.id());
-  }
-  void AddPart(uint32_t part_node_id);
-
-  // Detaches all children from the node.
-  void DetachChildren();
-
- protected:
-  explicit ContainerNode(Session* session);
-  ContainerNode(ContainerNode&& moved);
-  ~ContainerNode();
-};
-
-// Required by EntityNode::Attach().
-class ViewHolder;
-
-// Represents an entity node resource in a session.
-// TODO(MZ-268): Make this class final, and add public move constructor.
-class EntityNode : public ContainerNode {
- public:
-  explicit EntityNode(Session* session);
-  ~EntityNode();
-
-  void SetClip(uint32_t clip_id, bool clip_to_self);
-
-  void Attach(const ViewHolder& view_holder);
-
-  void Snapshot(fuchsia::ui::gfx::SnapshotCallbackHACKPtr callback);
-};
-
-// Represents an imported node resource in a session.
-// The imported node is initially created in an unbound state and must
-// be bound immediately after creation, prior to use.
-class ImportNode final : public ContainerNode {
- public:
-  explicit ImportNode(Session* session);
-  ImportNode(ImportNode&& moved);
-  ~ImportNode();
-
-  // Imports the node associated with |import_token|.
-  void Bind(zx::eventpair import_token);
-
-  // Imports the node and returns an export token in |out_export_token|
-  // by which another session can export a node to associate with this import.
-  void BindAsRequest(zx::eventpair* out_export_token);
-
-  // Returns true if the import has been bound.
-  bool is_bound() const { return is_bound_; }
-
- private:
-  bool is_bound_ = false;
-};
-
-// Represents a proxy for a View which can be added to a scene graph in order
-// to embed the View within it.
-//
-// Each ViewHolder is linked to a paired View via a shared token.
-//
-// Usually the ViewHolder and its associated View exist in separate processes,
-// allowing a distributed scene graph to be constructed.
-class ViewHolder final : public Resource {
- public:
-  ViewHolder(Session* session, zx::eventpair token,
-             const std::string& debug_name);
-  ~ViewHolder();
-
-  // Set properties of the attached view.
-
-  void SetViewProperties(float min_x, float min_y, float min_z, float max_x,
-                         float max_y, float max_z, float in_min_x,
-                         float in_min_y, float in_min_z, float in_max_x,
-                         float in_max_y, float in_max_z) {
-    SetViewProperties((float[3]){min_x, min_y, min_z},
-                      (float[3]){max_x, max_y, max_z},
-                      (float[3]){in_min_x, in_min_y, in_min_z},
-                      (float[3]){in_max_x, in_max_y, in_max_z});
-  }
-  void SetViewProperties(const float bounding_box_min[3],
-                         const float bounding_box_max[3],
-                         const float inset_from_min[3],
-                         const float inset_from_max[3]);
-  void SetViewProperties(const fuchsia::ui::gfx::ViewProperties& props);
-};
-
-// Represents a transform space which serves as a container for Nodes.  The
-// Nodes will have the Views' coordinate transform applied to their own, in
-// addition to being clipped to the Views' bounding box.
-class View final : public Resource {
- public:
-  View(Session* session, zx::eventpair token, const std::string& debug_name);
-  ~View();
-
-  void AddChild(const Node& child) const;
-  void DetachChild(const Node& child) const;
-};
-
-// Creates a node that clips the contents of its hierarchy to the specified clip
-// shape.
-class ClipNode final : public ContainerNode {
- public:
-  explicit ClipNode(Session* session);
-  ClipNode(ClipNode&& moved);
-  ~ClipNode();
-};
-
-// Creates a node that renders its hierarchy with the specified opacity.
-class OpacityNode final : public ContainerNode {
- public:
-  explicit OpacityNode(Session* session);
-  OpacityNode(OpacityNode&& moved);
-  ~OpacityNode();
-
-  // The opacity with which to render the contents of the hierarchy rooted at
-  // this node. The opacity values are clamped 0.0 to 1.0.
-  void SetOpacity(float opacity);
-};
-
-// A value that can be used in place of a constant value.
-class Variable final : public Resource {
- public:
-  explicit Variable(Session* session, fuchsia::ui::gfx::Value initial_value);
-  Variable(Variable&& moved);
-  ~Variable();
-};
-
-// Represents an abstract light resource in a session.
-// This type cannot be instantiated, please see subclasses.
-class Light : public Resource {
- public:
-  // Sets the light's color.
-  void SetColor(float red, float green, float blue) {
-    SetColor((float[3]){red, green, blue});
-  }
-  void SetColor(const float rgb[3]);
-  void SetColor(uint32_t variable_id);
-
-  // Detach light from the scene it is attached to, if any.
-  void Detach();
-
- protected:
-  explicit Light(Session* session);
-  Light(Light&& moved);
-  ~Light();
-};
-
-// Represents a directional light resource in a session.
-class AmbientLight final : public Light {
- public:
-  explicit AmbientLight(Session* session);
-  AmbientLight(AmbientLight&& moved);
-  ~AmbientLight();
-};
-
-// Represents a directional light resource in a session.
-class DirectionalLight final : public Light {
- public:
-  explicit DirectionalLight(Session* session);
-  DirectionalLight(DirectionalLight&& moved);
-  ~DirectionalLight();
-
-  // Sets the light's direction.
-  void SetDirection(float dx, float dy, float dz) {
-    SetDirection((float[3]){dx, dy, dz});
-  }
-  void SetDirection(const float direction[3]);
-  void SetDirection(uint32_t variable_id);
-};
-
-// Represents a scene resource in a session.
-class Scene final : public ContainerNode {
- public:
-  explicit Scene(Session* session);
-  Scene(Scene&& moved);
-  ~Scene();
-
-  void AddLight(const Light& light) {
-    ZX_DEBUG_ASSERT(session() == light.session());
-    AddLight(light.id());
-  }
-  void AddLight(uint32_t light_id);
-  void DetachLights();
-
- private:
-  void Detach() = delete;
-};
-
-class CameraBase : public Resource {
- public:
-  CameraBase(Session* session) : Resource(session) {}
-  CameraBase(CameraBase&& moved) : Resource(std::move(moved)) {}
-  ~CameraBase() {}
-  // Sets the camera's view parameters.
-  void SetTransform(const float eye_position[3], const float eye_look_at[3],
-                    const float eye_up[3]);
-  // Sets the camera pose buffer
-  void SetPoseBuffer(const Buffer& buffer, uint32_t num_entries,
-                     int64_t base_time, uint64_t time_interval);
-};
-
-// Represents a camera resource in a session.
-class Camera : public CameraBase {
- public:
-  explicit Camera(const Scene& scene);
-  Camera(Session* session, uint32_t scene_id);
-  Camera(Camera&& moved);
-  ~Camera();
-
-  // Sets the camera's projection parameters.
-  void SetProjection(const float fovy);
-};
-
-// Represents a StereoCamera resource in a session.
-class StereoCamera final : public CameraBase {
- public:
-  explicit StereoCamera(const Scene& scene);
-  StereoCamera(Session* session, uint32_t scene_id);
-  StereoCamera(StereoCamera&& moved);
-  ~StereoCamera();
-
-  // Sets the camera's projection parameters.
-  void SetStereoProjection(const float left_projection[16],
-                           const float right_projection[16]);
-};
-
-// Represents a renderer resource in a session.
-class Renderer final : public Resource {
- public:
-  explicit Renderer(Session* session);
-  Renderer(Renderer&& moved);
-  ~Renderer();
-
-  // Sets the camera whose view will be rendered.
-  void SetCamera(const Camera& camera) {
-    ZX_DEBUG_ASSERT(session() == camera.session());
-    SetCamera(camera.id());
-  }
-  void SetCamera(uint32_t camera_id);
-
-  void SetParam(fuchsia::ui::gfx::RendererParam param);
-
-  // Convenient wrapper for SetParam().
-  void SetShadowTechnique(fuchsia::ui::gfx::ShadowTechnique technique);
-
-  // Set whether clipping is disabled for this renderer.
-  // NOTE: disabling clipping only has a visual effect; hit-testing is not
-  // affected.
-  void SetDisableClipping(bool disable_clipping);
-};
-
-// Represents a layer resource in a session.
-class Layer final : public Resource {
- public:
-  explicit Layer(Session* session);
-  Layer(Layer&& moved);
-  ~Layer();
-
-  // Sets the layer's XY translation and Z-order.
-  void SetTranslation(float tx, float ty, float tz) {
-    SetTranslation((float[3]){tx, ty, tz});
-  }
-  void SetTranslation(const float translation[3]);
-
-  void SetSize(float width, float height) {
-    SetSize((float[2]){width, height});
-  }
-  void SetSize(const float size[2]);
-
-  void SetRenderer(const Renderer& renderer) {
-    ZX_DEBUG_ASSERT(session() == renderer.session());
-    SetRenderer(renderer.id());
-  }
-  void SetRenderer(uint32_t renderer_id);
-};
-
-// Represents a layer-stack resource in a session.
-class LayerStack final : public Resource {
- public:
-  explicit LayerStack(Session* session);
-  LayerStack(LayerStack&& moved);
-  ~LayerStack();
-
-  void AddLayer(const Layer& layer) {
-    ZX_DEBUG_ASSERT(session() == layer.session());
-    AddLayer(layer.id());
-  }
-  void AddLayer(uint32_t layer_id);
-  void RemoveLayer(const Layer& layer) {
-    ZX_DEBUG_ASSERT(session() == layer.session());
-    RemoveLayer(layer.id());
-  }
-  void RemoveLayer(uint32_t layer_id);
-  void RemoveAllLayers();
-};
-
-// Represents a display-compositor resource in a session.
-class DisplayCompositor final : public Resource {
- public:
-  explicit DisplayCompositor(Session* session);
-  DisplayCompositor(DisplayCompositor&& moved);
-  ~DisplayCompositor();
-
-  // Sets the layer-stack that is to be composited.
-  void SetLayerStack(const LayerStack& layer_stack) {
-    ZX_DEBUG_ASSERT(session() == layer_stack.session());
-    SetLayerStack(layer_stack.id());
-  }
-  void SetLayerStack(uint32_t layer_stack_id);
-};
-
-// Represents a display-less compositor resource in a session.
-class Compositor final : public Resource {
- public:
-  explicit Compositor(Session* session);
-  Compositor(Compositor&& moved);
-  ~Compositor();
-
-  // Sets the layer-stack that is to be composited.
-  void SetLayerStack(const LayerStack& layer_stack) {
-    ZX_DEBUG_ASSERT(session() == layer_stack.session());
-    SetLayerStack(layer_stack.id());
-  }
-  void SetLayerStack(uint32_t layer_stack_id);
-};
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_RESOURCES_H_
diff --git a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/session.h b/pkg/scenic_cpp/include/lib/ui/scenic/cpp/session.h
deleted file mode 100644
index 3455d15..0000000
--- a/pkg/scenic_cpp/include/lib/ui/scenic/cpp/session.h
+++ /dev/null
@@ -1,148 +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.
-
-#ifndef LIB_UI_SCENIC_CPP_SESSION_H_
-#define LIB_UI_SCENIC_CPP_SESSION_H_
-
-#include <fuchsia/images/cpp/fidl.h>
-#include <fuchsia/ui/gfx/cpp/fidl.h>
-#include <fuchsia/ui/input/cpp/fidl.h>
-#include <fuchsia/ui/scenic/cpp/fidl.h>
-#include <lib/fit/function.h>
-#include <lib/zx/event.h>
-
-#include <utility>
-
-#include "lib/fidl/cpp/binding.h"
-
-namespace scenic {
-
-// Connect to Scenic and establish a new Session, as well as an InterfaceRequest
-// for a SessionListener that can be hooked up as desired.
-using SessionPtrAndListenerRequest =
-    std::pair<fuchsia::ui::scenic::SessionPtr,
-              fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>>;
-SessionPtrAndListenerRequest CreateScenicSessionPtrAndListenerRequest(
-    fuchsia::ui::scenic::Scenic* scenic);
-
-// Wraps a Scenic session.
-// Maintains a queue of pending operations and assists with allocation of
-// resource ids.
-class Session : private fuchsia::ui::scenic::SessionListener {
- public:
-  // Provides timing information about a presentation request which has
-  // been applied by the scene manager.
-  using PresentCallback =
-      fit::function<void(fuchsia::images::PresentationInfo info)>;
-
-  // Provide information about hits.
-  using HitTestCallback =
-      fit::function<void(fidl::VectorPtr<fuchsia::ui::gfx::Hit> hits)>;
-
-  // Called when session events are received.
-  using EventHandler =
-      fit::function<void(fidl::VectorPtr<fuchsia::ui::scenic::Event>)>;
-
-  // Wraps the provided session and session listener.
-  // The listener is optional.
-  explicit Session(fuchsia::ui::scenic::SessionPtr session,
-                   fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>
-                       session_listener = nullptr);
-
-  // Creates a new session using the provided Scenic and binds the listener to
-  // this object. The Scenic itself is not retained after construction.
-  explicit Session(fuchsia::ui::scenic::Scenic* scenic);
-
-  explicit Session(SessionPtrAndListenerRequest session_and_listener);
-
-  Session(const Session&) = delete;
-  Session& operator=(const Session&) = delete;
-
-  // Destroys the session.
-  // All resources must be released prior to destruction.
-  ~Session();
-
-  void set_error_handler(fit::function<void(zx_status_t)> closure) {
-    session_.set_error_handler(std::move(closure));
-  }
-
-  // Sets a callback which is invoked when events are received.
-  void set_event_handler(EventHandler event_handler) {
-    event_handler_ = std::move(event_handler);
-  }
-
-  // Gets a pointer to the underlying session interface.
-  fuchsia::ui::scenic::Session* session() { return session_.get(); }
-
-  // Allocates a new unique resource id.
-  uint32_t AllocResourceId();
-
-  // Enqueues an operation to release a resource.
-  void ReleaseResource(uint32_t resource_id);
-
-  // Enqueues an operation.
-  // The session will queue operations locally to batch submission of operations
-  // until |Flush()| or |Present()| is called.
-  void Enqueue(fuchsia::ui::scenic::Command command);
-  void Enqueue(fuchsia::ui::gfx::Command command);
-  void Enqueue(fuchsia::ui::input::Command command);
-
-  // Registers an acquire fence to be submitted during the subsequent call to
-  // |Present()|.
-  void EnqueueAcquireFence(zx::event fence);
-
-  // Registers a release fence to be submitted during the subsequent call to
-  // |Present()|.
-  void EnqueueReleaseFence(zx::event fence);
-
-  // Flushes queued operations to the session.
-  void Flush();
-
-  // Presents all previously enqueued operations.
-  // Implicitly flushes all queued operations to the session.
-  // Invokes the callback when the scene manager applies the presentation.
-  void Present(uint64_t presentation_time, PresentCallback callback);
-
-  // Performs a hit test along the specified ray.
-  void HitTest(uint32_t node_id, const float ray_origin[3],
-               const float ray_direction[3], HitTestCallback callback);
-
-  // Performs a hit test along the specified ray into the engine's first
-  // compositor.
-  void HitTestDeviceRay(
-      const float ray_origin[3], const float ray_direction[3],
-      fuchsia::ui::scenic::Session::HitTestDeviceRayCallback callback);
-
-  // Unbinds the internal SessionPtr; this allows moving this across threads.
-  void Unbind();
-
-  // Rebinds the Session interface internally; this must be called after a call
-  // to Unbind().
-  void Rebind();
-
-  void SetDebugName(const std::string& debug_name);
-
- private:
-  // |fuchsia::ui::scenic::SessionListener|
-  void OnScenicError(fidl::StringPtr error) override;
-  void OnScenicEvent(
-      fidl::VectorPtr<fuchsia::ui::scenic::Event> events) override;
-
-  fuchsia::ui::scenic::SessionPtr session_;
-  // |session_handle_| is stored only when |session_| is unbound/invalid.
-  fidl::InterfaceHandle<fuchsia::ui::scenic::Session> session_handle_;
-  uint32_t next_resource_id_ = 1u;
-  uint32_t resource_count_ = 0u;
-
-  fidl::VectorPtr<fuchsia::ui::scenic::Command> commands_;
-  fidl::VectorPtr<zx::event> acquire_fences_;
-  fidl::VectorPtr<zx::event> release_fences_;
-
-  EventHandler event_handler_;
-  fidl::Binding<fuchsia::ui::scenic::SessionListener> session_listener_binding_;
-};
-
-}  // namespace scenic
-
-#endif  // LIB_UI_SCENIC_CPP_SESSION_H_
diff --git a/pkg/scenic_cpp/meta.json b/pkg/scenic_cpp/meta.json
deleted file mode 100644
index 3c966c8..0000000
--- a/pkg/scenic_cpp/meta.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "deps": [
-    "fidl_cpp", 
-    "images_cpp", 
-    "fit", 
-    "zx"
-  ], 
-  "fidl_deps": [
-    "fuchsia.ui.gfx", 
-    "fuchsia.ui.scenic"
-  ], 
-  "headers": [
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/commands.h", 
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_image_cycler.h", 
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/host_memory.h", 
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/id.h", 
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/resources.h", 
-    "pkg/scenic_cpp/include/lib/ui/scenic/cpp/session.h"
-  ], 
-  "include_dir": "pkg/scenic_cpp/include", 
-  "name": "scenic_cpp", 
-  "root": "pkg/scenic_cpp", 
-  "sources": [
-    "pkg/scenic_cpp/commands.cc", 
-    "pkg/scenic_cpp/host_image_cycler.cc", 
-    "pkg/scenic_cpp/host_memory.cc", 
-    "pkg/scenic_cpp/resources.cc", 
-    "pkg/scenic_cpp/session.cc"
-  ], 
-  "type": "cc_source_library"
-}
\ No newline at end of file
diff --git a/pkg/scenic_cpp/resources.cc b/pkg/scenic_cpp/resources.cc
deleted file mode 100644
index 58ab0d5..0000000
--- a/pkg/scenic_cpp/resources.cc
+++ /dev/null
@@ -1,570 +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.
-
-#include "lib/ui/scenic/cpp/resources.h"
-
-#include <algorithm>
-
-#include "lib/images/cpp/images.h"
-#include "lib/ui/scenic/cpp/commands.h"
-
-namespace scenic {
-namespace {
-
-template <class T>
-constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
-  return (v < lo) ? lo : (hi < v) ? hi : v;
-}
-
-}  // namespace
-
-Resource::Resource(Session* session)
-    : session_(session), id_(session->AllocResourceId()) {}
-
-Resource::Resource(Resource&& moved)
-    : session_(moved.session_), id_(moved.id_) {
-  auto& moved_session = *const_cast<Session**>(&moved.session_);
-  auto& moved_id = *const_cast<uint32_t*>(&moved.id_);
-  moved_session = nullptr;
-  moved_id = 0;
-}
-
-Resource::~Resource() {
-  // If this resource was moved, it is not responsible for releasing the ID.
-  if (session_)
-    session_->ReleaseResource(id_);
-}
-
-void Resource::Export(zx::eventpair export_token) {
-  session_->Enqueue(NewExportResourceCmd(id(), std::move(export_token)));
-}
-
-void Resource::ExportAsRequest(zx::eventpair* out_import_token) {
-  session_->Enqueue(NewExportResourceCmdAsRequest(id(), out_import_token));
-}
-
-void Resource::SetEventMask(uint32_t event_mask) {
-  session_->Enqueue(NewSetEventMaskCmd(id(), event_mask));
-}
-
-void Resource::SetLabel(const std::string& label) {
-  session_->Enqueue(NewSetLabelCmd(id(), label));
-}
-
-Shape::Shape(Session* session) : Resource(session) {}
-
-Shape::Shape(Shape&& moved) : Resource(std::move(moved)) {}
-
-Shape::~Shape() = default;
-
-Circle::Circle(Session* session, float radius) : Shape(session) {
-  session->Enqueue(NewCreateCircleCmd(id(), radius));
-}
-
-Circle::Circle(Circle&& moved) : Shape(std::move(moved)) {}
-
-Circle::~Circle() = default;
-
-Rectangle::Rectangle(Session* session, float width, float height)
-    : Shape(session) {
-  session->Enqueue(NewCreateRectangleCmd(id(), width, height));
-}
-
-Rectangle::Rectangle(Rectangle&& moved) : Shape(std::move(moved)) {}
-
-Rectangle::~Rectangle() = default;
-
-RoundedRectangle::RoundedRectangle(Session* session, float width, float height,
-                                   float top_left_radius,
-                                   float top_right_radius,
-                                   float bottom_right_radius,
-                                   float bottom_left_radius)
-    : Shape(session) {
-  session->Enqueue(NewCreateRoundedRectangleCmd(
-      id(), width, height, top_left_radius, top_right_radius,
-      bottom_right_radius, bottom_left_radius));
-}
-
-RoundedRectangle::RoundedRectangle(RoundedRectangle&& moved)
-    : Shape(std::move(moved)) {}
-
-RoundedRectangle::~RoundedRectangle() = default;
-
-Image::Image(const Memory& memory, off_t memory_offset,
-             fuchsia::images::ImageInfo info)
-    : Image(memory.session(), memory.id(), memory_offset, std::move(info)) {}
-
-Image::Image(Session* session, uint32_t memory_id, off_t memory_offset,
-             fuchsia::images::ImageInfo info)
-    : Resource(session), memory_offset_(memory_offset), info_(info) {
-  session->Enqueue(
-      NewCreateImageCmd(id(), memory_id, memory_offset_, std::move(info)));
-}
-
-Image::Image(Image&& moved)
-    : Resource(std::move(moved)),
-      memory_offset_(moved.memory_offset_),
-      info_(moved.info_) {}
-
-Image::~Image() = default;
-
-size_t Image::ComputeSize(const fuchsia::images::ImageInfo& image_info) {
-  return images::ImageSize(image_info);
-}
-
-Buffer::Buffer(const Memory& memory, off_t memory_offset, size_t num_bytes)
-    : Buffer(memory.session(), memory.id(), memory_offset, num_bytes) {}
-
-Buffer::Buffer(Session* session, uint32_t memory_id, off_t memory_offset,
-               size_t num_bytes)
-    : Resource(session) {
-  session->Enqueue(
-      NewCreateBufferCmd(id(), memory_id, memory_offset, num_bytes));
-}
-
-Buffer::Buffer(Buffer&& moved) : Resource(std::move(moved)) {}
-
-Buffer::~Buffer() = default;
-
-Memory::Memory(Session* session, zx::vmo vmo, uint64_t allocation_size,
-               fuchsia::images::MemoryType memory_type)
-    : Resource(session), memory_type_(memory_type) {
-  session->Enqueue(
-      NewCreateMemoryCmd(id(), std::move(vmo), allocation_size, memory_type));
-}
-
-Memory::Memory(Memory&& moved)
-    : Resource(std::move(moved)), memory_type_(moved.memory_type_) {}
-
-Memory::~Memory() = default;
-
-Mesh::Mesh(Session* session) : Shape(session) {
-  session->Enqueue(NewCreateMeshCmd(id()));
-}
-
-Mesh::Mesh(Mesh&& moved) : Shape(std::move(moved)) {}
-
-Mesh::~Mesh() = default;
-
-void Mesh::BindBuffers(const Buffer& index_buffer,
-                       fuchsia::ui::gfx::MeshIndexFormat index_format,
-                       uint64_t index_offset, uint32_t index_count,
-                       const Buffer& vertex_buffer,
-                       fuchsia::ui::gfx::MeshVertexFormat vertex_format,
-                       uint64_t vertex_offset, uint32_t vertex_count,
-                       const float bounding_box_min[3],
-                       const float bounding_box_max[3]) {
-  ZX_DEBUG_ASSERT(session() == index_buffer.session() &&
-                  session() == vertex_buffer.session());
-  session()->Enqueue(NewBindMeshBuffersCmd(
-      id(), index_buffer.id(), index_format, index_offset, index_count,
-      vertex_buffer.id(), std::move(vertex_format), vertex_offset, vertex_count,
-      bounding_box_min, bounding_box_max));
-}
-
-Material::Material(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateMaterialCmd(id()));
-}
-
-Material::Material(Material&& moved) : Resource(std::move(moved)) {}
-
-Material::~Material() = default;
-
-void Material::SetTexture(uint32_t image_id) {
-  session()->Enqueue(NewSetTextureCmd(id(), image_id));
-}
-
-void Material::SetColor(uint8_t red, uint8_t green, uint8_t blue,
-                        uint8_t alpha) {
-  session()->Enqueue(NewSetColorCmd(id(), red, green, blue, alpha));
-}
-
-Node::Node(Session* session) : Resource(session) {}
-
-Node::Node(Node&& moved) : Resource(std::move(moved)) {}
-
-Node::~Node() = default;
-
-void Node::SetTranslation(const float translation[3]) {
-  session()->Enqueue(NewSetTranslationCmd(id(), translation));
-}
-
-void Node::SetTranslation(uint32_t variable_id) {
-  session()->Enqueue(NewSetTranslationCmd(id(), variable_id));
-}
-
-void Node::SetScale(const float scale[3]) {
-  session()->Enqueue(NewSetScaleCmd(id(), scale));
-}
-
-void Node::SetScale(uint32_t variable_id) {
-  session()->Enqueue(NewSetScaleCmd(id(), variable_id));
-}
-
-void Node::SetRotation(const float quaternion[4]) {
-  session()->Enqueue(NewSetRotationCmd(id(), quaternion));
-}
-
-void Node::SetRotation(uint32_t variable_id) {
-  session()->Enqueue(NewSetRotationCmd(id(), variable_id));
-}
-
-void Node::SetAnchor(const float anchor[3]) {
-  session()->Enqueue(NewSetAnchorCmd(id(), anchor));
-}
-
-void Node::SetAnchor(uint32_t variable_id) {
-  session()->Enqueue(NewSetAnchorCmd(id(), variable_id));
-}
-
-void Node::SendSizeChangeHint(float width_change_factor,
-                              float height_change_factor) {
-  session()->Enqueue(NewSendSizeChangeHintCmdHACK(id(), width_change_factor,
-                                                  height_change_factor));
-}
-
-void Node::SetTag(uint32_t tag_value) {
-  session()->Enqueue(NewSetTagCmd(id(), tag_value));
-}
-
-void Node::SetHitTestBehavior(
-    fuchsia::ui::gfx::HitTestBehavior hit_test_behavior) {
-  session()->Enqueue(NewSetHitTestBehaviorCmd(id(), hit_test_behavior));
-}
-
-void Node::Detach() { session()->Enqueue(NewDetachCmd(id())); }
-
-ShapeNode::ShapeNode(Session* session) : Node(session) {
-  session->Enqueue(NewCreateShapeNodeCmd(id()));
-}
-
-ShapeNode::ShapeNode(ShapeNode&& moved) : Node(std::move(moved)) {}
-
-ShapeNode::~ShapeNode() = default;
-
-void ShapeNode::SetShape(uint32_t shape_id) {
-  session()->Enqueue(NewSetShapeCmd(id(), shape_id));
-}
-
-void ShapeNode::SetMaterial(uint32_t material_id) {
-  session()->Enqueue(NewSetMaterialCmd(id(), material_id));
-}
-
-ContainerNode::ContainerNode(Session* session) : Node(session) {}
-
-ContainerNode::ContainerNode(ContainerNode&& moved) : Node(std::move(moved)) {}
-
-ContainerNode::~ContainerNode() = default;
-
-void ContainerNode::AddChild(uint32_t child_node_id) {
-  session()->Enqueue(NewAddChildCmd(id(), child_node_id));
-}
-
-void ContainerNode::AddPart(uint32_t part_node_id) {
-  session()->Enqueue(NewAddPartCmd(id(), part_node_id));
-}
-
-void ContainerNode::DetachChildren() {
-  session()->Enqueue(NewDetachChildrenCmd(id()));
-}
-
-EntityNode::EntityNode(Session* session) : ContainerNode(session) {
-  session->Enqueue(NewCreateEntityNodeCmd(id()));
-}
-
-void EntityNode::Attach(const ViewHolder& view_holder) {
-  session()->Enqueue(NewAddChildCmd(id(), view_holder.id()));
-}
-
-void EntityNode::Snapshot(fuchsia::ui::gfx::SnapshotCallbackHACKPtr callback) {
-  session()->Enqueue(NewTakeSnapshotCmdHACK(id(), std::move(callback)));
-}
-
-EntityNode::~EntityNode() = default;
-
-void EntityNode::SetClip(uint32_t clip_id, bool clip_to_self) {
-  session()->Enqueue(NewSetClipCmd(id(), clip_id, clip_to_self));
-}
-
-ImportNode::ImportNode(Session* session) : ContainerNode(session) {}
-
-ImportNode::ImportNode(ImportNode&& moved) : ContainerNode(std::move(moved)) {}
-
-ImportNode::~ImportNode() {
-  ZX_DEBUG_ASSERT_MSG(is_bound_, "Import was never bound.");
-}
-
-void ImportNode::Bind(zx::eventpair import_token) {
-  ZX_DEBUG_ASSERT(!is_bound_);
-  session()->Enqueue(NewImportResourceCmd(
-      id(), fuchsia::ui::gfx::ImportSpec::NODE, std::move(import_token)));
-  is_bound_ = true;
-}
-
-void ImportNode::BindAsRequest(zx::eventpair* out_export_token) {
-  ZX_DEBUG_ASSERT(!is_bound_);
-  session()->Enqueue(NewImportResourceCmdAsRequest(
-      id(), fuchsia::ui::gfx::ImportSpec::NODE, out_export_token));
-  is_bound_ = true;
-}
-
-ViewHolder::ViewHolder(Session* session, zx::eventpair token,
-                       const std::string& debug_name)
-    : Resource(session) {
-  session->Enqueue(NewCreateViewHolderCmd(id(), std::move(token), debug_name));
-}
-
-ViewHolder::~ViewHolder() = default;
-
-void ViewHolder::SetViewProperties(const float bounding_box_min[3],
-                                   const float bounding_box_max[3],
-                                   const float inset_from_min[3],
-                                   const float inset_from_max[3]) {
-  session()->Enqueue(NewSetViewPropertiesCmd(id(), bounding_box_min,
-                                             bounding_box_max, inset_from_min,
-                                             inset_from_max));
-}
-
-void ViewHolder::SetViewProperties(
-    const fuchsia::ui::gfx::ViewProperties& props) {
-  session()->Enqueue(NewSetViewPropertiesCmd(id(), props));
-}
-
-View::View(Session* session, zx::eventpair token, const std::string& debug_name)
-    : Resource(session) {
-  session->Enqueue(NewCreateViewCmd(id(), std::move(token), debug_name));
-}
-
-View::~View() = default;
-
-void View::AddChild(const Node& child) const {
-  ZX_DEBUG_ASSERT(session() == child.session());
-  session()->Enqueue(NewAddChildCmd(id(), child.id()));
-}
-
-void View::DetachChild(const Node& child) const {
-  ZX_DEBUG_ASSERT(session() == child.session());
-  session()->Enqueue(NewDetachCmd(child.id()));
-}
-
-ClipNode::ClipNode(Session* session) : ContainerNode(session) {
-  session->Enqueue(NewCreateClipNodeCmd(id()));
-}
-
-ClipNode::ClipNode(ClipNode&& moved) : ContainerNode(std::move(moved)) {}
-
-ClipNode::~ClipNode() = default;
-
-OpacityNode::OpacityNode(Session* session) : ContainerNode(session) {
-  session->Enqueue(NewCreateOpacityNodeCmd(id()));
-}
-
-OpacityNode::OpacityNode(OpacityNode&& moved)
-    : ContainerNode(std::move(moved)) {}
-
-OpacityNode::~OpacityNode() = default;
-
-void OpacityNode::SetOpacity(float opacity) {
-  opacity = clamp(opacity, 0.f, 1.f);
-  session()->Enqueue(NewSetOpacityCmd(id(), opacity));
-}
-
-Variable::Variable(Session* session, fuchsia::ui::gfx::Value initial_value)
-    : Resource(session) {
-  session->Enqueue(NewCreateVariableCmd(id(), std::move(initial_value)));
-}
-
-Variable::Variable(Variable&& moved) : Resource(std::move(moved)) {}
-
-Variable::~Variable() = default;
-
-Scene::Scene(Session* session) : ContainerNode(session) {
-  session->Enqueue(NewCreateSceneCmd(id()));
-}
-
-Scene::Scene(Scene&& moved) : ContainerNode(std::move(moved)) {}
-
-Scene::~Scene() = default;
-
-void Scene::AddLight(uint32_t light_id) {
-  session()->Enqueue(NewAddLightCmd(id(), light_id));
-}
-
-void Scene::DetachLights() { session()->Enqueue(NewDetachLightsCmd(id())); }
-
-void CameraBase::SetTransform(const float eye_position[3],
-                              const float eye_look_at[3],
-                              const float eye_up[3]) {
-  session()->Enqueue(
-      NewSetCameraTransformCmd(id(), eye_position, eye_look_at, eye_up));
-}
-
-void CameraBase::SetPoseBuffer(const Buffer& buffer, uint32_t num_entries,
-                               int64_t base_time, uint64_t time_interval) {
-  session()->Enqueue(NewSetCameraPoseBufferCmd(id(), buffer.id(), num_entries,
-                                               base_time, time_interval));
-}
-
-Camera::Camera(const Scene& scene) : Camera(scene.session(), scene.id()) {}
-
-Camera::Camera(Session* session, uint32_t scene_id) : CameraBase(session) {
-  session->Enqueue(NewCreateCameraCmd(id(), scene_id));
-}
-
-Camera::Camera(Camera&& moved) : CameraBase(std::move(moved)) {}
-
-Camera::~Camera() = default;
-
-void Camera::SetProjection(const float fovy) {
-  session()->Enqueue(NewSetCameraProjectionCmd(id(), fovy));
-}
-
-StereoCamera::StereoCamera(const Scene& scene)
-    : StereoCamera(scene.session(), scene.id()) {}
-
-StereoCamera::StereoCamera(Session* session, uint32_t scene_id)
-    : CameraBase(session) {
-  session->Enqueue(NewCreateStereoCameraCmd(id(), scene_id));
-}
-
-StereoCamera::StereoCamera(StereoCamera&& moved)
-    : CameraBase(std::move(moved)) {}
-
-StereoCamera::~StereoCamera() = default;
-
-void StereoCamera::SetStereoProjection(const float left_projection[16],
-                                       const float right_projection[16]) {
-  session()->Enqueue(
-      NewSetStereoCameraProjectionCmd(id(), left_projection, right_projection));
-}
-
-Renderer::Renderer(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateRendererCmd(id()));
-}
-
-Renderer::Renderer(Renderer&& moved) : Resource(std::move(moved)) {}
-
-Renderer::~Renderer() = default;
-
-void Renderer::SetCamera(uint32_t camera_id) {
-  session()->Enqueue(NewSetCameraCmd(id(), camera_id));
-}
-
-void Renderer::SetParam(fuchsia::ui::gfx::RendererParam param) {
-  session()->Enqueue(NewSetRendererParamCmd(id(), std::move(param)));
-}
-
-void Renderer::SetShadowTechnique(fuchsia::ui::gfx::ShadowTechnique technique) {
-  auto param = fuchsia::ui::gfx::RendererParam();
-  param.set_shadow_technique(technique);
-  SetParam(std::move(param));
-}
-
-void Renderer::SetDisableClipping(bool disable_clipping) {
-  session()->Enqueue(NewSetDisableClippingCmd(id(), disable_clipping));
-}
-
-Layer::Layer(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateLayerCmd(id()));
-}
-
-Layer::Layer(Layer&& moved) : Resource(std::move(moved)) {}
-
-Layer::~Layer() = default;
-
-void Layer::SetRenderer(uint32_t renderer_id) {
-  session()->Enqueue(NewSetRendererCmd(id(), renderer_id));
-}
-
-void Layer::SetSize(const float size[2]) {
-  session()->Enqueue(NewSetSizeCmd(id(), size));
-}
-
-LayerStack::LayerStack(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateLayerStackCmd(id()));
-}
-
-LayerStack::LayerStack(LayerStack&& moved) : Resource(std::move(moved)) {}
-
-LayerStack::~LayerStack() = default;
-
-void LayerStack::AddLayer(uint32_t layer_id) {
-  session()->Enqueue(NewAddLayerCmd(id(), layer_id));
-}
-
-void LayerStack::RemoveLayer(uint32_t layer_id) {
-  session()->Enqueue(NewRemoveLayerCmd(id(), layer_id));
-}
-
-void LayerStack::RemoveAllLayers() {
-  session()->Enqueue(NewRemoveAllLayersCmd(id()));
-}
-
-DisplayCompositor::DisplayCompositor(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateDisplayCompositorCmd(id()));
-}
-
-DisplayCompositor::DisplayCompositor(DisplayCompositor&& moved)
-    : Resource(std::move(moved)) {}
-
-DisplayCompositor::~DisplayCompositor() = default;
-
-void DisplayCompositor::SetLayerStack(uint32_t layer_stack_id) {
-  session()->Enqueue(NewSetLayerStackCmd(id(), layer_stack_id));
-}
-
-Compositor::Compositor(Session* session) : Resource(session) {
-  session->Enqueue(NewCreateCompositorCmd(id()));
-}
-
-Compositor::Compositor(Compositor&& moved) : Resource(std::move(moved)) {}
-
-Compositor::~Compositor() = default;
-
-void Compositor::SetLayerStack(uint32_t layer_stack_id) {
-  session()->Enqueue(NewSetLayerStackCmd(id(), layer_stack_id));
-}
-
-Light::Light(Session* session) : Resource(session) {}
-
-Light::Light(Light&& moved) : Resource(std::move(moved)) {}
-
-Light::~Light() = default;
-
-void Light::SetColor(const float rgb[3]) {
-  session()->Enqueue(NewSetLightColorCmd(id(), rgb));
-}
-
-void Light::SetColor(uint32_t variable_id) {
-  session()->Enqueue(NewSetLightColorCmd(id(), variable_id));
-}
-
-void Light::Detach() { session()->Enqueue(NewDetachLightCmd(id())); }
-
-AmbientLight::AmbientLight(Session* session) : Light(session) {
-  session->Enqueue(NewCreateAmbientLightCmd(id()));
-}
-
-AmbientLight::AmbientLight(AmbientLight&& moved) : Light(std::move(moved)) {}
-
-AmbientLight::~AmbientLight() = default;
-
-DirectionalLight::DirectionalLight(Session* session) : Light(session) {
-  session->Enqueue(NewCreateDirectionalLightCmd(id()));
-}
-
-DirectionalLight::DirectionalLight(DirectionalLight&& moved)
-    : Light(std::move(moved)) {}
-
-DirectionalLight::~DirectionalLight() = default;
-
-void DirectionalLight::SetDirection(const float direction[3]) {
-  session()->Enqueue(NewSetLightDirectionCmd(id(), direction));
-}
-
-void DirectionalLight::SetDirection(uint32_t variable_id) {
-  session()->Enqueue(NewSetLightDirectionCmd(id(), variable_id));
-}
-
-}  // namespace scenic
diff --git a/pkg/scenic_cpp/session.cc b/pkg/scenic_cpp/session.cc
deleted file mode 100644
index 7f48da9..0000000
--- a/pkg/scenic_cpp/session.cc
+++ /dev/null
@@ -1,184 +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.
-
-#include "lib/ui/scenic/cpp/session.h"
-
-#include <stdio.h>
-#include <zircon/assert.h>
-
-#include "lib/ui/scenic/cpp/commands.h"
-
-namespace scenic {
-
-constexpr size_t kCommandsPerMessage =
-    (ZX_CHANNEL_MAX_MSG_BYTES - sizeof(fidl_message_header_t) -
-     sizeof(fidl_vector_t)) /
-    sizeof(fuchsia::ui::scenic::Command);
-
-SessionPtrAndListenerRequest CreateScenicSessionPtrAndListenerRequest(
-    fuchsia::ui::scenic::Scenic* scenic) {
-  fuchsia::ui::scenic::SessionPtr session;
-  fidl::InterfaceHandle<fuchsia::ui::scenic::SessionListener> listener_handle;
-  auto listener_request = listener_handle.NewRequest();
-
-  scenic->CreateSession(session.NewRequest(), listener_handle.Bind());
-
-  return {std::move(session), std::move(listener_request)};
-}
-
-Session::Session(fuchsia::ui::scenic::SessionPtr session,
-                 fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>
-                     session_listener)
-    : session_(std::move(session)), session_listener_binding_(this) {
-  ZX_DEBUG_ASSERT(session_);
-  if (session_listener.is_valid())
-    session_listener_binding_.Bind(std::move(session_listener));
-}
-
-Session::Session(fuchsia::ui::scenic::Scenic* scenic)
-    : session_listener_binding_(this) {
-  ZX_DEBUG_ASSERT(scenic);
-  scenic->CreateSession(session_.NewRequest(),
-                        session_listener_binding_.NewBinding());
-}
-
-Session::Session(SessionPtrAndListenerRequest session_and_listener)
-    : Session(std::move(session_and_listener.first),
-              std::move(session_and_listener.second)) {}
-
-Session::~Session() {
-  ZX_DEBUG_ASSERT_MSG(resource_count_ == 0,
-                      "Some resources outlived the session: %u",
-                      resource_count_);
-}
-
-uint32_t Session::AllocResourceId() {
-  uint32_t resource_id = next_resource_id_++;
-  ZX_DEBUG_ASSERT(resource_id);
-  resource_count_++;
-  return resource_id;
-}
-
-void Session::ReleaseResource(uint32_t resource_id) {
-  resource_count_--;
-  Enqueue(NewReleaseResourceCmd(resource_id));
-}
-
-void Session::Enqueue(fuchsia::ui::gfx::Command command) {
-  Enqueue(NewCommand(std::move(command)));
-}
-
-void Session::Enqueue(fuchsia::ui::input::Command command) {
-  Enqueue(NewCommand(std::move(command)));
-}
-
-void Session::Enqueue(fuchsia::ui::scenic::Command command) {
-  commands_.push_back(std::move(command));
-  if (commands_->size() >= kCommandsPerMessage ||
-      command.Which() == fuchsia::ui::scenic::Command::Tag::kInput) {
-    Flush();
-  }
-}
-
-void Session::EnqueueAcquireFence(zx::event fence) {
-  ZX_DEBUG_ASSERT(fence);
-  acquire_fences_.push_back(std::move(fence));
-}
-
-void Session::EnqueueReleaseFence(zx::event fence) {
-  ZX_DEBUG_ASSERT(fence);
-  release_fences_.push_back(std::move(fence));
-}
-
-void Session::Flush() {
-  ZX_DEBUG_ASSERT(session_);
-  if (!commands_->empty()) {
-    ZX_DEBUG_ASSERT(static_cast<bool>(commands_));
-    session_->Enqueue(std::move(commands_));
-
-    // After being moved, |commands_| is in a "valid but unspecified state";
-    // see http://en.cppreference.com/w/cpp/utility/move.  Calling reset() makes
-    // it safe to continue using.
-    commands_.reset();
-  }
-}
-
-void Session::Present(uint64_t presentation_time, PresentCallback callback) {
-  ZX_DEBUG_ASSERT(session_);
-  Flush();
-
-  if (acquire_fences_.is_null())
-    acquire_fences_.resize(0u);
-  if (release_fences_.is_null())
-    release_fences_.resize(0u);
-  session_->Present(presentation_time, std::move(acquire_fences_),
-                    std::move(release_fences_), std::move(callback));
-}
-
-void Session::HitTest(uint32_t node_id, const float ray_origin[3],
-                      const float ray_direction[3], HitTestCallback callback) {
-  ZX_DEBUG_ASSERT(session_);
-  fuchsia::ui::gfx::vec3 ray_origin_vec;
-  ray_origin_vec.x = ray_origin[0];
-  ray_origin_vec.y = ray_origin[1];
-  ray_origin_vec.z = ray_origin[2];
-
-  fuchsia::ui::gfx::vec3 ray_direction_vec;
-  ray_direction_vec.x = ray_direction[0];
-  ray_direction_vec.y = ray_direction[1];
-  ray_direction_vec.z = ray_direction[2];
-
-  session_->HitTest(node_id, std::move(ray_origin_vec),
-                    std::move(ray_direction_vec), std::move(callback));
-}
-
-void Session::HitTestDeviceRay(
-    const float ray_origin[3], const float ray_direction[3],
-    fuchsia::ui::scenic::Session::HitTestDeviceRayCallback callback) {
-  ZX_DEBUG_ASSERT(session_);
-  fuchsia::ui::gfx::vec3 ray_origin_vec;
-  ray_origin_vec.x = ray_origin[0];
-  ray_origin_vec.y = ray_origin[1];
-  ray_origin_vec.z = ray_origin[2];
-
-  fuchsia::ui::gfx::vec3 ray_direction_vec;
-  ray_direction_vec.x = ray_direction[0];
-  ray_direction_vec.y = ray_direction[1];
-  ray_direction_vec.z = ray_direction[2];
-
-  session_->HitTestDeviceRay(std::move(ray_origin_vec),
-                             std::move(ray_direction_vec), std::move(callback));
-}
-
-void Session::Unbind() {
-  ZX_DEBUG_ASSERT(session_);
-  ZX_DEBUG_ASSERT(!session_handle_);
-  session_handle_ = session_.Unbind();
-  session_ = nullptr;
-}
-
-void Session::Rebind() {
-  ZX_DEBUG_ASSERT(!session_);
-  ZX_DEBUG_ASSERT(session_handle_);
-  session_ = fuchsia::ui::scenic::SessionPtr(session_handle_.Bind());
-  session_handle_ = nullptr;
-}
-
-void Session::OnScenicError(fidl::StringPtr error) {
-  // TODO(SCN-903): replace fprintf with SDK-approved logging mechanism.  Also
-  // remove "#include <stdio.h>".
-  fprintf(stderr, "Session error: %s", error->c_str());
-}
-
-void Session::OnScenicEvent(
-    fidl::VectorPtr<fuchsia::ui::scenic::Event> events) {
-  if (event_handler_)
-    event_handler_(std::move(events));
-}
-
-void Session::SetDebugName(const std::string& debug_name) {
-  session_->SetDebugName(debug_name);
-}
-
-}  // namespace scenic
diff --git a/pkg/svc/include/lib/svc/dir.h b/pkg/svc/include/lib/svc/dir.h
deleted file mode 100644
index 8e16c97..0000000
--- a/pkg/svc/include/lib/svc/dir.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-#ifndef LIB_SVC_SVC_H_
-#define LIB_SVC_SVC_H_
-
-#include <lib/async/dispatcher.h>
-#include <zircon/compiler.h>
-#include <zircon/types.h>
-
-__BEGIN_CDECLS
-
-typedef void(svc_connector_t)(void* context, const char* service_name,
-                              zx_handle_t service_request);
-
-typedef struct svc_dir svc_dir_t;
-
-__EXPORT zx_status_t svc_dir_create(async_dispatcher_t* dispatcher,
-                                    zx_handle_t directory_request,
-                                    svc_dir_t** out_result);
-
-// Adds a service named |service_name| to the given |dir|.
-//
-// If |type| is non-NULL, the service will be published in a directory whose
-// name matches the |type|. If |type| is NULL, the service will be published in
-// the root directory.
-//
-// The most commonly used values for |type| are "public", "debug", and "ctrl".
-// Services published under "public" are made available to clients via
-// |fuchsia.sys.Lancher#CreateComponent|. The "debug" serivices are exposed via
-// the hub. The "ctrl" services are used by the core platform to communicate
-// with your program.
-//
-// When a client requests the service, |handler| will be called on the async_t
-// passed to |svc_dir_create|. The |context| will be passed to |handler| as its
-// first argument.
-//
-// This may fail in two ways. If an entry with the given
-// |service_name| already exists, this returns
-// ZX_ERR_ALREADY_EXISTS. If the provided |service_name| is invalid,
-// ZX_ERR_INVALID_ARGS is returned. Otherwise, this returns ZX_OK.
-__EXPORT zx_status_t svc_dir_add_service(svc_dir_t* dir, const char* type,
-                                         const char* service_name,
-                                         void* context,
-                                         svc_connector_t* handler);
-
-// Removes the service named |service_name| of type |type| from the
-// given |dir|. This reports a failure if the entry does not exist, by
-// returning ZX_ERR_NOT_FOUND. Otherwise, the service entry is
-// removed, and ZX_OK is returned.
-__EXPORT zx_status_t svc_dir_remove_service(svc_dir_t* dir, const char* type,
-                                            const char* service_name);
-
-// Destroy the provided directory. This currently cannot fail, and
-// returns ZX_OK.
-__EXPORT zx_status_t svc_dir_destroy(svc_dir_t* dir);
-
-__END_CDECLS
-
-#endif  // LIB_SVC_SVC_H_
diff --git a/pkg/svc/meta.json b/pkg/svc/meta.json
deleted file mode 100644
index 2a183d5..0000000
--- a/pkg/svc/meta.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/28/16547647b2a89d.debug", 
-      "dist": "arch/arm64/dist/libsvc.so", 
-      "link": "arch/arm64/lib/libsvc.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/31/f3907157249ab0.debug", 
-      "dist": "arch/x64/dist/libsvc.so", 
-      "link": "arch/x64/lib/libsvc.so"
-    }
-  }, 
-  "deps": [
-    "async", 
-    "fdio", 
-    "trace-engine"
-  ], 
-  "format": "shared", 
-  "headers": [
-    "pkg/svc/include/lib/svc/dir.h"
-  ], 
-  "include_dir": "pkg/svc/include", 
-  "name": "svc", 
-  "root": "pkg/svc", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/sync/include/lib/sync/completion.h b/pkg/sync/include/lib/sync/completion.h
index 515a563..51af5c0 100644
--- a/pkg/sync/include/lib/sync/completion.h
+++ b/pkg/sync/include/lib/sync/completion.h
@@ -8,14 +8,224 @@
 #include <zircon/compiler.h>
 #include <zircon/types.h>
 
+////////////////////////////////////////////////////////////////////////////////
+//
+// sync_completion_t
+//
+// :: Overview ::
+//
+// sync_completion_t objects (henceforth, simply "completions") are lightweight
+// in-process events. Conceptually, a completion has an internal state of either
+// UNSIGNALED or SIGNALED. Threads in a process may alter this state, check the
+// state without blocking, or wait on the completion with an optional
+// timeout/deadline until it achieves the SIGNALED state. Completions are
+// currently implemented using Zircon futexes.
+//
+// :: Initialization ::
+//
+// Completions always start in the UNSIGNALED state. When used in C code, users
+// *must* explicitly initialize their completion's state using the
+// SYNC_COMPLETION_INIT preprocessor symbol. For example:
+//
+// ```
+// struct my_structure {
+//   int32_t a_variable;
+//   sync_completion_t a_completion;
+// };
+//
+// void init_my_structure(struct my_structure* s) {
+//   s->a_variable = 0;
+//   s->a_completion = SYNC_COMPLETION_INIT;
+// }
+// ```
+//
+// When used in C++ code, no explicit initialization steps are required. The
+// completion's structure will contain a default constructor which properly
+// initializes the completion's UNSIGNALED state.
+//
+// :: Operations ::
+//
+// The permitted operations on a completion are as follows.
+//
+// ++ sync_completion_wait ++
+// Block a thread with an optional relative timeout until the completion
+// achieves the signaled state. If the completion is already in the SIGNALED
+// state, the waiting thread will not block.
+//
+// ++ sync_completion_wait_deadline ++
+// Block a thread with an optional absolute deadline timeout until the
+// completion achieves the signaled state. If the completion is already in the
+// SIGNALED state, the waiting thread will not block.
+//
+// ++ sync_completion_signal ++
+// Change the internal state of a completion to SIGNALED, releasing any threads
+// which are currently waiting on it.
+//
+// ++ sync_completion_reset ++
+// Change the internal state of a completion to UNSIGNALED. See also `Avoid
+// "Strobing" Signals` (below) for some hazards related to the use of the reset
+// operation.
+//
+// ++ sync_completion_signaled ++
+// Observe the internal state of a completion, and return true if it is
+// SIGNALED, and false otherwise.
+//
+// :: No Spurious Wakeups ::
+//
+// sync_completion_wait() will *only* return:
+// ++ if the completion is signaled at some point by a call to
+//    sync_completion_signal() (either before or after the call to
+//    sync_completion_wait())
+// ++ or if the timeout occurs (if using timeouts)
+//
+// Implementation details:
+//
+// In general, futex-based concurrency algorithms can cause futex wakeups on
+// memory locations that have been deallocated (for example, the standard
+// algorithm for a mutex_unlock can do that). This means that futex-based
+// concurrency algorithms must be robust against spurious wakeups, because a
+// futex memory location may have been previously used, deallocated, and then
+// recycled.
+//
+// Completions guarantee that waiters will not suffer any spurious wakeups,
+// provided that the lifetime of the sync_completion_t instance is properly
+// respected. For example, pretend we have the following situation.
+//
+// ```
+// void thread_a() {
+//   sync_completion_t C = SYNC_COMPLETION_INIT;
+//   share_completion_with_thread_b(&C);
+//   sync_completion_wait(&C, ZX_TIME_INFINITE);
+// }
+//
+// void thread_b() {
+//   sync_completion_t* C = obtain_completion_from_thread_a();
+//   sync_completion_signal(C);
+// }
+// ```
+//
+// The call to sync_completion_wait is guaranteed to not wake up spuriously,
+// even if an unrelated zx_futex_wake operation targeting the same memory
+// location happens to occur during the interactions between thread_a and
+// thread_b. This behavior **depends** on making sure that the life-cycle of C
+// is properly obeyed. After thread_b does sync_completion_signal(C), it must
+// not perform any further operations on C. Having signaled C, thread_b has
+// caused thread_a to unblock and begin the process of deallocating C. Any
+// operations performed on C after this point are racing with the deallocation
+// of C and might result in a use-after-free situation. While it is possible
+// that thread_b may still be in the call to sync_completion_signal when
+// thread_a unwinds and deallocates the completion, no reads or writes from or to
+// the completion's state will be made after this point, and the code is safe
+// provided that this is the final completion operation.
+//
+// :: Avoid "Strobing" Signals ::
+//
+// Users should avoid the pattern of "strobing" a signal operation.
+// Specifically, calling sync_completion_signal(C) immediately followed by
+// sync_completion_reset(C) is not guaranteed to wake up a waiter, even if the
+// user could prove that the waiter is waiting in the completion.
+//
+// Implementation details:
+//
+// The following is an example of a sequence which makes use of the strobe
+// pattern which can lead a missed event.  It is based on specific details of
+// how sync_completion_t is implemented today, and should not be considered to
+// be the only way that a signal might end up getting missed, either now or in
+// the future.  Again, user should always avoid this "strobing" pattern, it is
+// not guaranteed to wake a waiter.
+//
+// ```
+// global sync_completion_t C;
+//
+// Thread A:
+// 1) Wait on C with no timeout.
+// 2) Declare victory
+//
+// Thread B:
+// 1) Wait until thread A is blocked on completion C by polling Thread A's state
+//    via zx_object_get_info.
+// 2) sync_completion_signal(C)
+// 3) sync_completion_reset(C)
+// 4) sync_completion_wait(C, timeout)
+// ```
+//
+// Step B.1 establishes the fact that (from thread B's perspective) thread A
+// managed to observe C in the UNSIGNALED state and join the internal futex wait
+// queue used to implement the completion_t. In the process, thread A sets the
+// completion_t's internal state to UNSIGNALED_WITH_WAITERS.  The subsequent
+// signal/reset/wait operations (steps B.2-B.4), will release thread A from the
+// wait queue, but cycle the internal state of the completion_t through the
+// SIGNALED and UNSIGNALED states, and back again to the UNSIGNALED_WITH_WAITERS
+// state.  If thread B manages to cycle the state all of the way back around to
+// UNSIGNALED_WITH_WAITERS before thread A manages to wake up, thread A will see
+// the state as UNSIGNALED_WITH_WAITERS and rejoin the wait queue thinking that
+// it had been woken by a spurious futex_wake.
+//
+// Once again, as a general rule the signal/reset pattern shown here should not
+// be used with sync_completion_t objects. It is considered to be racy and can
+// result in undesired behavior, no matter what steps are taken establish that A
+// is waiting before the signal/reset operations take place.
+//
+// :: Memory Ordering Semantics ::
+//
+// When a thread transitions the state of a completion from UNSIGNALED to
+// SIGNALED by calling sync_completion_signal, the operation provides the same
+// guarantees as an atomic modification of the completion state with Release
+// semantics. These guarantees do _not_ hold if the completion is already in
+// the SIGNALED state when the thread calls sync_completion_signal.
+//
+// When a thread returns from a sync_completion_wait operation with a status of
+// ZX_OK, the operation provides the same guarantees as having atomically
+// observed the completion state as being SIGNALED with Acquire semantics.
+// These guarantees do _not_ hold if the wait operation times out, or returns
+// any other error.
+//
+// The effects of these guarantees are that write operations to shared memory
+// performed by a thread may not be reordered beyond a signal operation which
+// successfully transitions a completion from UNSIGNALED to SIGNALED performed
+// by the same thread. Likewise, successful wait operations performed by a
+// thread against a completion guarantee that subsequent read operations
+// performed by that thread may not be reordered before the wait operation.
+//
+// Taken together, these guarantees make the following common pattern safe.
+//
+// ```
+// typedef struct {
+//   uint32_t val;
+//   sync_completion_t C;
+// } read_operation_t;
+//
+// void thread_a() {
+//   read_operation_t Op;
+//   Op.C = SYNC_COMPLETION_INIT;
+//
+//   send_op_to_thread_b(&Op);
+//   sync_completion_wait(&Op.C);
+//   do_great_things_with_val(Op.val);
+// }
+//
+// void thread_b() {
+//   while (true) {
+//     read_operation_t* Op = obtain_read_op();
+//     Op->val = compute_a_value_only_thread_b_can_compute();
+//     sync_completion_signal(&Op->C);
+//   }
+// }
+// ```
+//
+// Thread A is guaranteed to see the results written by thread B into the shared
+// Op.val member. The modifications performed by thread B may not be reordered
+// past the signal operation, and read operations performed by thread A may not
+// be moved before the wait operation.
+//
+
 __BEGIN_CDECLS
 
 typedef struct sync_completion {
-    zx_futex_t futex;
+  zx_futex_t futex;
 
 #ifdef __cplusplus
-    sync_completion()
-        : futex(0) {}
+  sync_completion() : futex(0) {}
 #endif
 } sync_completion_t;
 
@@ -38,18 +248,25 @@
 // completion will also see the signal and immediately return.
 void sync_completion_signal(sync_completion_t* completion);
 
-// Marks the completion as signaled, but doesn't awaken all waiters
-// right away. Instead, all waiters are requeued to the |futex|.
-// Waits after this call but before a reset of the
-// completion will also see the signal and immediately return.
+// Marks the completion as signaled, but doesn't awaken all waiters right away.
+// Instead, all waiters are requeued to the |requeue_target|, and the owner of
+// the |requeue_target| is set to |requeue_target_owner|, or to no one if
+// ZX_HANDLE_INVALID is passed.
+//
+// Waits after this call but before a reset of the completion will also see the
+// signal and immediately return.
 //
 // Intended to be used by libsync internally, e.g. the condition variable
 // implementation.
-void sync_completion_signal_requeue(sync_completion_t* completion, zx_futex_t* futex);
+void sync_completion_signal_requeue(sync_completion_t* completion, zx_futex_t* requeue_target,
+                                    zx_handle_t requeue_target_owner);
 
 // Resets the completion's signaled state to unsignaled.
 void sync_completion_reset(sync_completion_t* completion);
 
+// Returns true iff a completion has been signaled.
+bool sync_completion_signaled(sync_completion_t* completion);
+
 __END_CDECLS
 
-#endif // LIB_SYNC_COMPLETION_H_
+#endif  // LIB_SYNC_COMPLETION_H_
diff --git a/pkg/sync/include/lib/sync/condition.h b/pkg/sync/include/lib/sync/condition.h
index 6f6eb58..27e5457 100644
--- a/pkg/sync/include/lib/sync/condition.h
+++ b/pkg/sync/include/lib/sync/condition.h
@@ -5,6 +5,7 @@
 #ifndef LIB_SYNC_CONDITION_H_
 #define LIB_SYNC_CONDITION_H_
 
+#include <assert.h>
 #include <lib/sync/mutex.h>
 #include <zircon/compiler.h>
 #include <zircon/types.h>
@@ -13,29 +14,31 @@
 
 // A condition variable that works with a sync_mutex_t
 typedef struct sync_condition {
-    int lock;
-    void* head;
-    void* tail;
+  int lock;
+  void* head;
+  void* tail;
 
 #ifdef __cplusplus
-    sync_condition()
-        : lock(0), head(nullptr), tail(nullptr) {}
+  sync_condition() : lock(0), head(nullptr), tail(nullptr) {}
 #endif
 } sync_condition_t;
 
+static_assert(sizeof(((sync_condition_t*)0)->lock) == sizeof(sync_mutex_t),
+              "sync_condition lock storage must be the same size as sync_mutex_t");
+
 #if !defined(__cplusplus)
 #define SYNC_CONDITION_INIT ((sync_condition_t){0})
 #endif
 
-// Block until |condition| is signaled by sync_condition_signal()/sync_condition_broadcast(), or a spurious
-// wake up occurs.
+// Block until |condition| is signaled by sync_condition_signal()/sync_condition_broadcast(), or a
+// spurious wake up occurs.
 //
 // |mutex| must be in a locked state, and will be atomically unlocked for the duration of the wait,
 // then locked again before the function returns.
 void sync_condition_wait(sync_condition_t* condition, sync_mutex_t* mutex);
 
-// Block until |condition| is signaled by sync_condition_signal()/sync_condition_broadcast(), or a spurious
-// wake up or a timeout occurs.
+// Block until |condition| is signaled by sync_condition_signal()/sync_condition_broadcast(), or a
+// spurious wake up or a timeout occurs.
 //
 // |mutex| must be in a locked state, and will be atomically unlocked for the duration of the wait,
 // then locked again before the function returns.
@@ -45,7 +48,8 @@
 // Return value:
 //      ZX_OK if |condition| was signaled or a spurious wake up occurred.
 //      ZX_ERR_TIMED_OUT if the wait timed out.
-zx_status_t sync_condition_timedwait(sync_condition_t* condition, sync_mutex_t* mutex, zx_time_t deadline);
+zx_status_t sync_condition_timedwait(sync_condition_t* condition, sync_mutex_t* mutex,
+                                     zx_time_t deadline);
 
 // Wake up one thread waiting for |condition|.
 //
@@ -92,4 +96,4 @@
 
 __END_CDECLS
 
-#endif // LIB_SYNC_CONDITION_H_
+#endif  // LIB_SYNC_CONDITION_H_
diff --git a/pkg/sync/include/lib/sync/internal/condition-template.h b/pkg/sync/include/lib/sync/internal/condition-template.h
index 7bd4f2d..7a5506f 100644
--- a/pkg/sync/include/lib/sync/internal/condition-template.h
+++ b/pkg/sync/include/lib/sync/internal/condition-template.h
@@ -7,7 +7,7 @@
 
 #include <zircon/syscalls.h>
 #include <lib/sync/completion.h>
-#include <lib/sync/mutex.h>
+#include <lib/sync/internal/mutex-internal.h>
 
 namespace condition_impl_internal {
 
@@ -23,23 +23,25 @@
 // in order to instantiate the template:
 template <typename Mutex>
 struct MutexOps {
-    // Return a pointer to the futex that backs the |mutex|
-    static zx_futex_t* get_futex(Mutex* mutex);
+  // Return a pointer to the futex that backs the |mutex|
+  static zx_futex_t* get_futex(Mutex* mutex);
 
-    // Lock the |mutex|. If an error occurs while locking the mutex,
-    // ZX_ERR_BAD_STATE must be returned. An implementation-defined
-    // error code can be returned via |mutex_lock_err| if it's not null.
-    static zx_status_t lock(Mutex* mutex, int* mutex_lock_err);
+  // Lock the |mutex|. If an error occurs while locking the mutex,
+  // ZX_ERR_BAD_STATE must be returned. An implementation-defined
+  // error code can be returned via |mutex_lock_err| if it's not null.
+  static zx_status_t lock(Mutex* mutex, int* mutex_lock_err);
 
-    // Similar to lock(), but also update the waiter information in the mutex.
-    // If the mutex implements waiter counting, then the count must be adjusted
-    // by |waiters_delta|. Otherwise, the mutex must be marked as potentially
-    // having waiters.
-    static zx_status_t lock_with_waiters(
-        Mutex* mutex, int waiters_delta, int* mutex_lock_err);
+  // Similar to lock(), but also update the waiter information in the mutex.
+  // If the mutex implements waiter counting, then the count must be adjusted
+  // by |waiters_delta|. Otherwise, the mutex must be marked as potentially
+  // having waiters.
+  static zx_status_t lock_with_waiters(Mutex* mutex, int waiters_delta, int* mutex_lock_err);
 
-    // Unlock the mutex
-    static void unlock(Mutex* mutex);
+  // Unlock the mutex
+  static void unlock(Mutex* mutex);
+
+  // Requeue all of the memebrs waiting in |completion| to the futex backing |mutex|.
+  static void signal_requeue(sync_completion_t* completion, Mutex* mutex);
 };
 
 // Note that this library is used by libc, and as such needs to use
@@ -47,48 +49,45 @@
 
 static inline void spin() {
 #if defined(__x86_64__)
-    __asm__ __volatile__("pause"
-                         :
-                         :
-                         : "memory");
+  __asm__ __volatile__("pause" : : : "memory");
 #elif defined(__aarch64__)
-    __atomic_thread_fence(__ATOMIC_SEQ_CST);
+  __atomic_thread_fence(__ATOMIC_SEQ_CST);
 #else
 #error Please define spin() for your architecture
 #endif
 }
 
 static inline bool cas(int* ptr, int* expected, int desired) {
-    return __atomic_compare_exchange_n(ptr, expected, desired, false,
-                                       __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+  return __atomic_compare_exchange_n(ptr, expected, desired, false, __ATOMIC_SEQ_CST,
+                                     __ATOMIC_SEQ_CST);
 }
 
 static inline void wait(int* futex, int current_value) {
-    int spins = 100;
-    while (spins--) {
-        if (__atomic_load_n(futex, __ATOMIC_SEQ_CST) == current_value) {
-            spin();
-        } else {
-            return;
-        }
+  int spins = 100;
+  while (spins--) {
+    if (__atomic_load_n(futex, __ATOMIC_SEQ_CST) == current_value) {
+      spin();
+    } else {
+      return;
     }
-    while (__atomic_load_n(futex, __ATOMIC_SEQ_CST) == current_value) {
-        _zx_futex_wait(futex, current_value, ZX_HANDLE_INVALID, ZX_TIME_INFINITE);
-    }
+  }
+  while (__atomic_load_n(futex, __ATOMIC_SEQ_CST) == current_value) {
+    _zx_futex_wait(futex, current_value, ZX_HANDLE_INVALID, ZX_TIME_INFINITE);
+  }
 }
 
 enum {
-    WAITING,
-    SIGNALED,
-    LEAVING,
+  WAITING,
+  SIGNALED,
+  LEAVING,
 };
 
 struct Waiter {
-    Waiter* prev = nullptr;
-    Waiter* next = nullptr;
-    int state = WAITING;
-    sync_completion_t ready;
-    int* notify = nullptr;
+  Waiter* prev = nullptr;
+  Waiter* next = nullptr;
+  int state = WAITING;
+  sync_completion_t ready;
+  int* notify = nullptr;
 };
 
 // Return value:
@@ -99,198 +98,197 @@
 //        provided by the mutex implementation.
 template <typename Condition, typename Mutex>
 static inline zx_status_t timedwait(Condition* c, Mutex* mutex, zx_time_t deadline,
-                                    int* mutex_lock_err)
-    __TA_NO_THREAD_SAFETY_ANALYSIS {
+                                    int* mutex_lock_err) __TA_NO_THREAD_SAFETY_ANALYSIS {
+  sync_mutex_lock(reinterpret_cast<sync_mutex_t*>(&c->lock));
+
+  Waiter node;
+
+  // Add our waiter node onto the condition's list.  We add the node to the
+  // head of the list, but this is logically the end of the queue.
+  node.next = static_cast<Waiter*>(c->head);
+  c->head = &node;
+  if (!c->tail) {
+    c->tail = &node;
+  } else {
+    node.next->prev = &node;
+  }
+
+  sync_mutex_unlock(reinterpret_cast<sync_mutex_t*>(&c->lock));
+
+  MutexOps<Mutex>::unlock(mutex);
+
+  // Wait to be signaled.  There are multiple ways this wait could finish:
+  //  1) After being woken by signal().
+  //  2) After being woken by a mutex unlock, after we were
+  //     requeued from the condition's futex to the mutex's futex (by
+  //     timedwait() in another thread).
+  //  3) After a timeout.
+  // In the original Linux version of this algorithm, this could also exit
+  // when interrupted by an asynchronous signal, but that does not apply on Zircon.
+  sync_completion_wait_deadline(&node.ready, deadline);
+
+  int oldstate = WAITING;
+  if (cas(&node.state, &oldstate, LEAVING)) {
+    // The wait timed out.  So far, this thread was not signaled by
+    // signal() -- this thread was able to move state.node out of the
+    // WAITING state before any signal() call could do that.
+    //
+    // This thread must therefore remove the waiter node from the
+    // list itself.
+
+    // Access to cv object is valid because this waiter was not
+    // yet signaled and a new signal/broadcast cannot return
+    // after seeing a LEAVING waiter without getting notified
+    // via the futex notify below.
+
     sync_mutex_lock(reinterpret_cast<sync_mutex_t*>(&c->lock));
 
-    Waiter node;
+    // Remove our waiter node from the list.
+    if (c->head == &node) {
+      c->head = node.next;
+    } else if (node.prev) {
+      node.prev->next = node.next;
+    }
 
-    // Add our waiter node onto the condition's list.  We add the node to the
-    // head of the list, but this is logically the end of the queue.
-    node.next = static_cast<Waiter*>(c->head);
-    c->head = &node;
-    if (!c->tail) {
-        c->tail = &node;
-    } else {
-        node.next->prev = &node;
+    if (c->tail == &node) {
+      c->tail = node.prev;
+    } else if (node.next) {
+      node.next->prev = node.prev;
     }
 
     sync_mutex_unlock(reinterpret_cast<sync_mutex_t*>(&c->lock));
 
-    MutexOps<Mutex>::unlock(mutex);
-
-    // Wait to be signaled.  There are multiple ways this wait could finish:
-    //  1) After being woken by signal().
-    //  2) After being woken by a mutex unlock, after we were
-    //     requeued from the condition's futex to the mutex's futex (by
-    //     timedwait() in another thread).
-    //  3) After a timeout.
-    // In the original Linux version of this algorithm, this could also exit
-    // when interrupted by an asynchronous signal, but that does not apply on Zircon.
-    sync_completion_wait_deadline(&node.ready, deadline);
-
-    int oldstate = WAITING;
-    if (cas(&node.state, &oldstate, LEAVING)) {
-        // The wait timed out.  So far, this thread was not signaled by
-        // signal() -- this thread was able to move state.node out of the
-        // WAITING state before any signal() call could do that.
-        //
-        // This thread must therefore remove the waiter node from the
-        // list itself.
-
-        // Access to cv object is valid because this waiter was not
-        // yet signaled and a new signal/broadcast cannot return
-        // after seeing a LEAVING waiter without getting notified
-        // via the futex notify below.
-
-        sync_mutex_lock(reinterpret_cast<sync_mutex_t*>(&c->lock));
-
-        // Remove our waiter node from the list.
-        if (c->head == &node) {
-            c->head = node.next;
-        } else if (node.prev) {
-            node.prev->next = node.next;
-        }
-
-        if (c->tail == &node) {
-            c->tail = node.prev;
-        } else if (node.next) {
-            node.next->prev = node.prev;
-        }
-
-        sync_mutex_unlock(reinterpret_cast<sync_mutex_t*>(&c->lock));
-
-        // It is possible that signal() saw our waiter node after we set
-        // node.state to LEAVING but before we removed the node from the
-        // list.  If so, it will have set node.notify and will be waiting
-        // on it, and we need to wake it up.
-        //
-        // This is rather complex.  An alternative would be to eliminate
-        // the |node.state| field and always claim |lock| if we could have
-        // got a timeout.  However, that presumably has higher overhead
-        // (since it contends |lock| and involves more atomic ops).
-        if (node.notify) {
-            if (__atomic_fetch_add(node.notify, -1, __ATOMIC_SEQ_CST) == 1) {
-                _zx_futex_wake(node.notify, 1);
-            }
-        }
-
-        // We don't need lock_with_waiters() here: we haven't been signaled, and will
-        // never be since we managed to claim the state as LEAVING. This means that
-        // we could not have been woken up by unlock_requeue() + mutex unlock().
-        if (MutexOps<Mutex>::lock(mutex, mutex_lock_err) != ZX_OK) {
-            return ZX_ERR_BAD_STATE;
-        }
-        return ZX_ERR_TIMED_OUT;
-    }
-
-    // Since the CAS above failed, we have been signaled.
-    // It could still be the case that sync_completion_wait_deadline() above timed out,
-    // so we need to make sure to wait for the completion to control the wake order.
-    // If the completion has already been signaled, this will return immediately.
-    sync_completion_wait_deadline(&node.ready, ZX_TIME_INFINITE);
-
-    // By this point, our part of the waiter list cannot change further.
-    // It has been unlinked from the condition by signal().
-    // Any timed out waiters would have removed themselves from the list
-    // before signal() signaled the first node.ready in our list.
+    // It is possible that signal() saw our waiter node after we set
+    // node.state to LEAVING but before we removed the node from the
+    // list.  If so, it will have set node.notify and will be waiting
+    // on it, and we need to wake it up.
     //
-    // It is therefore safe now to read node.next and node.prev without
-    // holding c->lock.
-
-    // As an optimization, we only update waiter count at the beginning and
-    // end of the signaled list.
-    int waiters_delta = 0;
-    if (!node.prev) {
-        waiters_delta++;
-    }
-    if (!node.next) {
-        waiters_delta--;
+    // This is rather complex.  An alternative would be to eliminate
+    // the |node.state| field and always claim |lock| if we could have
+    // got a timeout.  However, that presumably has higher overhead
+    // (since it contends |lock| and involves more atomic ops).
+    if (node.notify) {
+      if (__atomic_fetch_add(node.notify, -1, __ATOMIC_SEQ_CST) == 1) {
+        _zx_futex_wake(node.notify, 1);
+      }
     }
 
-    // We must leave the mutex in the "locked with waiters" state here
-    // (or adjust its waiter count, depending on the implementation).
-    // There are two reasons for that:
-    //  1) If we do the unlock_requeue() below, a condition waiter will be
-    //     requeued to the mutex's futex.  We need to ensure that it will
-    //     be signaled by mutex unlock() in future.
-    //  2) If the current thread was woken via an unlock_requeue() +
-    //     mutex unlock, there *might* be another thread waiting for
-    //     the mutex after us in the queue.  We need to ensure that it
-    //     will be signaled by zxr_mutex_unlock() in future.
-    zx_status_t status = MutexOps<Mutex>::lock_with_waiters(mutex, waiters_delta, mutex_lock_err);
-
-    if (node.prev) {
-        // Signal the completion that's holding back the next waiter, and
-        // requeue it to the mutex so that it will be woken when the
-        // mutex is unlocked.
-        sync_completion_signal_requeue(&node.prev->ready, MutexOps<Mutex>::get_futex(mutex));
+    // We don't need lock_with_waiters() here: we haven't been signaled, and will
+    // never be since we managed to claim the state as LEAVING. This means that
+    // we could not have been woken up by unlock_requeue() + mutex unlock().
+    if (MutexOps<Mutex>::lock(mutex, mutex_lock_err) != ZX_OK) {
+      return ZX_ERR_BAD_STATE;
     }
+    return ZX_ERR_TIMED_OUT;
+  }
 
-    // Even if the first call to sync_completion_wait_deadline() timed out,
-    // we still have been signaled. Thus we still return ZX_OK rather than
-    // ZX_ERR_TIMED_OUT. This provides the following guarantee: if multiple
-    // threads are waiting when signal() is called, at least one waiting
-    // thread will be woken *and* get a ZX_OK from timedwait() (unless there
-    // is an error locking the mutex). This property does not appear to be
-    // required by pthread condvars, although an analogous property is
-    // required for futex wake-ups. We also require this property for
-    // sync_condition_t.
-    return status;
+  // Since the CAS above failed, we have been signaled.
+  // It could still be the case that sync_completion_wait_deadline() above timed out,
+  // so we need to make sure to wait for the completion to control the wake order.
+  // If the completion has already been signaled, this will return immediately.
+  sync_completion_wait_deadline(&node.ready, ZX_TIME_INFINITE);
+
+  // By this point, our part of the waiter list cannot change further.
+  // It has been unlinked from the condition by signal().
+  // Any timed out waiters would have removed themselves from the list
+  // before signal() signaled the first node.ready in our list.
+  //
+  // It is therefore safe now to read node.next and node.prev without
+  // holding c->lock.
+
+  // As an optimization, we only update waiter count at the beginning and
+  // end of the signaled list.
+  int waiters_delta = 0;
+  if (!node.prev) {
+    waiters_delta++;
+  }
+  if (!node.next) {
+    waiters_delta--;
+  }
+
+  // We must leave the mutex in the "locked with waiters" state here
+  // (or adjust its waiter count, depending on the implementation).
+  // There are two reasons for that:
+  //  1) If we do the unlock_requeue() below, a condition waiter will be
+  //     requeued to the mutex's futex.  We need to ensure that it will
+  //     be signaled by mutex unlock() in future.
+  //  2) If the current thread was woken via an unlock_requeue() +
+  //     mutex unlock, there *might* be another thread waiting for
+  //     the mutex after us in the queue.  We need to ensure that it
+  //     will be signaled by zxr_mutex_unlock() in future.
+  zx_status_t status = MutexOps<Mutex>::lock_with_waiters(mutex, waiters_delta, mutex_lock_err);
+
+  if (node.prev) {
+    // Signal the completion that's holding back the next waiter, and
+    // requeue it to the mutex so that it will be woken when the
+    // mutex is unlocked.
+    MutexOps<Mutex>::signal_requeue(&node.prev->ready, mutex);
+  }
+
+  // Even if the first call to sync_completion_wait_deadline() timed out,
+  // we still have been signaled. Thus we still return ZX_OK rather than
+  // ZX_ERR_TIMED_OUT. This provides the following guarantee: if multiple
+  // threads are waiting when signal() is called, at least one waiting
+  // thread will be woken *and* get a ZX_OK from timedwait() (unless there
+  // is an error locking the mutex). This property does not appear to be
+  // required by pthread condvars, although an analogous property is
+  // required for futex wake-ups. We also require this property for
+  // sync_condition_t.
+  return status;
 }
 
 // This will wake up to |n| threads that are waiting on the condition,
 // or all waiting threads if |n| is set to -1
 template <typename Condition>
 static inline void signal(Condition* c, int n) {
-    Waiter* p;
-    Waiter* first = nullptr;
-    int ref = 0;
-    int cur;
+  Waiter* p;
+  Waiter* first = nullptr;
+  int ref = 0;
+  int cur;
 
-    sync_mutex_lock(reinterpret_cast<sync_mutex_t*>(&c->lock));
-    for (p = static_cast<Waiter*>(c->tail); n && p; p = p->prev) {
-        int oldstate = WAITING;
-        if (!cas(&p->state, &oldstate, SIGNALED)) {
-            // This waiter timed out, and it marked itself as in the
-            // LEAVING state.  However, it hasn't yet claimed |lock|
-            // (since we claimed the lock first) and so it hasn't yet
-            // removed itself from the list.  We will wait for the waiter
-            // to remove itself from the list and to notify us of that.
-            __atomic_fetch_add(&ref, 1, __ATOMIC_SEQ_CST);
-            p->notify = &ref;
-        } else {
-            n--;
-            if (!first) {
-                first = p;
-            }
-        }
-    }
-    // Split the list, leaving any remainder on the cv.
-    if (p) {
-        if (p->next) {
-            p->next->prev = 0;
-        }
-        p->next = 0;
+  sync_mutex_lock(reinterpret_cast<sync_mutex_t*>(&c->lock));
+  for (p = static_cast<Waiter*>(c->tail); n && p; p = p->prev) {
+    int oldstate = WAITING;
+    if (!cas(&p->state, &oldstate, SIGNALED)) {
+      // This waiter timed out, and it marked itself as in the
+      // LEAVING state.  However, it hasn't yet claimed |lock|
+      // (since we claimed the lock first) and so it hasn't yet
+      // removed itself from the list.  We will wait for the waiter
+      // to remove itself from the list and to notify us of that.
+      __atomic_fetch_add(&ref, 1, __ATOMIC_SEQ_CST);
+      p->notify = &ref;
     } else {
-        c->head = 0;
+      n--;
+      if (!first) {
+        first = p;
+      }
     }
-    c->tail = p;
-    sync_mutex_unlock(reinterpret_cast<sync_mutex_t*>(&c->lock));
+  }
+  // Split the list, leaving any remainder on the cv.
+  if (p) {
+    if (p->next) {
+      p->next->prev = 0;
+    }
+    p->next = 0;
+  } else {
+    c->head = 0;
+  }
+  c->tail = p;
+  sync_mutex_unlock(reinterpret_cast<sync_mutex_t*>(&c->lock));
 
-    // Wait for any waiters in the LEAVING state to remove
-    // themselves from the list before returning or allowing
-    // signaled threads to proceed.
-    while ((cur = __atomic_load_n(&ref, __ATOMIC_SEQ_CST))) {
-        wait(&ref, cur);
-    }
+  // Wait for any waiters in the LEAVING state to remove
+  // themselves from the list before returning or allowing
+  // signaled threads to proceed.
+  while ((cur = __atomic_load_n(&ref, __ATOMIC_SEQ_CST))) {
+    wait(&ref, cur);
+  }
 
-    // Allow first signaled waiter, if any, to proceed.
-    if (first) {
-        sync_completion_signal(&first->ready);
-    }
+  // Allow first signaled waiter, if any, to proceed.
+  if (first) {
+    sync_completion_signal(&first->ready);
+  }
 }
 
-} // namespace condition_impl_internal
+}  // namespace condition_impl_internal
 
-#endif // LIB_SYNC_INTERNAL_CONDITION_TEMPLATE_H_
+#endif  // LIB_SYNC_INTERNAL_CONDITION_TEMPLATE_H_
diff --git a/pkg/sync/include/lib/sync/internal/mutex-internal.h b/pkg/sync/include/lib/sync/internal/mutex-internal.h
new file mode 100644
index 0000000..4e47278
--- /dev/null
+++ b/pkg/sync/include/lib/sync/internal/mutex-internal.h
@@ -0,0 +1,53 @@
+// Copyright 2019 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.
+
+#ifndef LIB_SYNC_INTERNAL_MUTEX_INTERNAL_H_
+#define LIB_SYNC_INTERNAL_MUTEX_INTERNAL_H_
+
+#include <assert.h>
+#include <lib/sync/mutex.h>
+#include <zircon/process.h>
+#include <zircon/types.h>
+
+// The value of LIB_SYNC_MUTEX_UNLOCKED must be 0 to match C11's mtx.h and so
+// that mutexes can be allocated in BSS segments (zero-initialized data).
+//
+// Note that we use bit zero as the storage for our contested vs. unconstested
+// state, but the sense of the bit is negative instead of positive.  IOW - a
+// contested mutex's state is encoded as the handle of the owning thread with
+// the LSB cleared (not set).
+#define LIB_SYNC_MUTEX_UNLOCKED ((zx_futex_storage_t)0)
+#define CONTESTED_BIT ((zx_futex_storage_t)1)
+
+static_assert(sizeof(zx_handle_t) <= sizeof(zx_futex_storage_t),
+              "mutex implementation requires futex storage to be "
+              "large enough to hold a zircon handle");
+
+static_assert((CONTESTED_BIT & ZX_HANDLE_FIXED_BITS_MASK) == CONTESTED_BIT,
+              "mutex implementation requires that it's contested state storage "
+              "bit be one of the zx_handle_t's guaranteed-to-be-one bits.");
+
+static_assert((~CONTESTED_BIT & (zx_futex_storage_t)ZX_HANDLE_FIXED_BITS_MASK) != 0,
+              "mutex implementation requires at least two guaranteed-to-be-one "
+              "bits in zx_handle_t's");
+
+static inline zx_futex_storage_t libsync_mutex_locked_and_uncontested(void) {
+  return ((zx_futex_storage_t)_zx_thread_self());
+}
+
+static inline bool libsync_mutex_is_contested(zx_futex_storage_t val) {
+  return ((val & CONTESTED_BIT) == 0);
+}
+
+static inline zx_futex_storage_t libsync_mutex_make_contested(zx_futex_storage_t val) {
+  return (val & ~CONTESTED_BIT);
+}
+
+static inline zx_handle_t libsync_mutex_make_owner_from_state(zx_futex_storage_t val) {
+  return (val != LIB_SYNC_MUTEX_UNLOCKED) ? (zx_handle_t)(val | CONTESTED_BIT) : ZX_HANDLE_INVALID;
+}
+
+#undef CONTESTED_BIT
+
+#endif  // LIB_SYNC_INTERNAL_MUTEX_INTERNAL_H_
diff --git a/pkg/sync/include/lib/sync/mutex.h b/pkg/sync/include/lib/sync/mutex.h
index 37a5cd3..b7c020b 100644
--- a/pkg/sync/include/lib/sync/mutex.h
+++ b/pkg/sync/include/lib/sync/mutex.h
@@ -15,16 +15,15 @@
 // The |mutex_t| mutex in the standard library has several quirks in its design
 // that prevent it from being optimal. For example, the |mutex_t| interface
 // supports recursion, which adds a branch to |mutex_init| to check that the
-// client has not asked for recusion, and |mutex_timedlock| operates in
+// client has not asked for recursion, and |mutex_timedlock| operates in
 // |struct timespec| rather than |zx_time_t|.
 //
 // |sync_mutex| resolves these issues.
 typedef struct __TA_CAPABILITY("mutex") sync_mutex {
-    zx_futex_t futex;
+  zx_futex_t futex;
 
 #ifdef __cplusplus
-    sync_mutex()
-        : futex(0) {}
+  sync_mutex() : futex(0) {}
 #endif
 } sync_mutex_t;
 
@@ -41,7 +40,7 @@
 
 // Locks the mutex and mark the mutex as having a waiter.
 //
-// Similar to |sync_mutex_lock| but markes the mutex as having a waiter. Intended
+// Similar to |sync_mutex_lock| but marks the mutex as having a waiter. Intended
 // to be used by the condition variable implementation.
 void sync_mutex_lock_with_waiter(sync_mutex_t* mutex) __TA_ACQUIRE(mutex);
 
@@ -69,4 +68,4 @@
 
 __END_CDECLS
 
-#endif // LIB_SYNC_MUTEX_H_
+#endif  // LIB_SYNC_MUTEX_H_
diff --git a/pkg/sync/meta.json b/pkg/sync/meta.json
index 4908432..04799a3 100644
--- a/pkg/sync/meta.json
+++ b/pkg/sync/meta.json
@@ -2,21 +2,22 @@
   "binaries": {
     "arm64": {
       "link": "arch/arm64/lib/libsync.a"
-    }, 
+    },
     "x64": {
       "link": "arch/x64/lib/libsync.a"
     }
-  }, 
-  "deps": [], 
-  "format": "static", 
+  },
+  "deps": [],
+  "format": "static",
   "headers": [
-    "pkg/sync/include/lib/sync/completion.h", 
-    "pkg/sync/include/lib/sync/condition.h", 
-    "pkg/sync/include/lib/sync/internal/condition-template.h", 
+    "pkg/sync/include/lib/sync/internal/condition-template.h",
+    "pkg/sync/include/lib/sync/internal/mutex-internal.h",
+    "pkg/sync/include/lib/sync/completion.h",
+    "pkg/sync/include/lib/sync/condition.h",
     "pkg/sync/include/lib/sync/mutex.h"
-  ], 
-  "include_dir": "pkg/sync/include", 
-  "name": "sync", 
-  "root": "pkg/sync", 
+  ],
+  "include_dir": "pkg/sync/include",
+  "name": "sync",
+  "root": "pkg/sync",
   "type": "cc_prebuilt_library"
 }
\ No newline at end of file
diff --git a/pkg/syslog/include/lib/syslog/global.h b/pkg/syslog/include/lib/syslog/global.h
deleted file mode 100644
index 9c9cc89..0000000
--- a/pkg/syslog/include/lib/syslog/global.h
+++ /dev/null
@@ -1,132 +0,0 @@
-// 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.
-
-//
-// Entry points used by clients.
-
-#ifndef LIB_SYSLOG_GLOBAL_H_
-#define LIB_SYSLOG_GLOBAL_H_
-
-#include <lib/syslog/logger.h>
-
-__BEGIN_CDECLS
-
-// Gets the global logger for the process to which log messages emitted
-// using the FX_LOG macros will be written.  Returns NULL if logging is
-// not configured.
-fx_logger_t* fx_log_get_logger(void);
-
-// Returns true if writing messages with the given severity is enabled in the
-// global logger.
-static inline bool fx_log_is_enabled(fx_log_severity_t severity) {
-    fx_logger_t* logger = fx_log_get_logger();
-    return logger && severity >= fx_logger_get_min_severity(logger);
-}
-
-// Initializes the logging infrastructure with the specified configuration.
-// Returns |ZX_ERR_BAD_STATE| if logging has already been initialized.
-// If |console_fd| and |log_service_channel| are invalid in |config|,
-// this function chooses a default destination for the log.
-// |config| can be safely deallocated after this function returns.
-//
-// global logger would be deallocated once program ends.
-zx_status_t fx_log_init_with_config(const fx_logger_config_t* config);
-
-// Initializes the logging infrastructure for this process using default
-// parameters. Returns |ZX_ERR_BAD_STATE| if logging has already been
-// initialized.
-//
-// global logger would be deallocated once program ends.
-zx_status_t fx_log_init(void);
-
-// Returns true if writing messages with the given severity is enabled in the
-// global logger. |severity| is one of DEBUG, INFO, WARNING, ERROR, or FATAL.
-#define FX_LOG_IS_ENABLED(severity) (fx_log_is_enabled(FX_LOG_##severity))
-
-// Returns true if writing messages with the given verbosity is enabled in the
-// global logger. |verbosity| is positive number.
-#define FX_VLOG_IS_ENABLED(verbosity) (fx_log_is_enabled(-(verbosity)))
-
-#define _FX_LOG_SET_SEVERITY(severity)                      \
-    do {                                                    \
-        fx_logger_t* logger = fx_log_get_logger();          \
-        if (logger) {                                       \
-            fx_logger_set_min_severity(logger, (severity)); \
-        }                                                   \
-    } while (0)
-
-// Sets severity for global logger.
-// |severity| is one of DEBUG, INFO, WARNING, ERROR, or FATAL.
-#define FX_LOG_SET_SEVERITY(severity) _FX_LOG_SET_SEVERITY(FX_LOG_##severity)
-
-// Sets verbosity for global logger.
-// |verbosity| is positive number. Logger severity is set to -verbosity
-#define FX_LOG_SET_VERBOSITY(verbosity) _FX_LOG_SET_SEVERITY(-(verbosity))
-
-#define _FX_LOG(severity, tag, message)                                   \
-    do {                                                                  \
-        fx_logger_t* logger = fx_log_get_logger();                        \
-        if (logger && fx_logger_get_min_severity(logger) <= (severity)) { \
-            fx_logger_log(logger, (severity), (tag), (message));          \
-        }                                                                 \
-    } while (0)
-
-#define _FX_LOGF(severity, tag, message, ...)                             \
-    do {                                                                  \
-        fx_logger_t* logger = fx_log_get_logger();                        \
-        if (logger && fx_logger_get_min_severity(logger) <= (severity)) { \
-            fx_logger_logf(logger, (severity), (tag), (message),          \
-                           __VA_ARGS__);                                  \
-        }                                                                 \
-    } while (0)
-
-#define _FX_LOGVF(severity, tag, message, args)                            \
-    do {                                                                   \
-        fx_logger_t* logger = fx_log_get_logger();                         \
-        if (logger && fx_logger_get_min_severity(logger) <= (severity)) {  \
-            fx_logger_logvf(logger, (severity), (tag), (message), (args)); \
-        }                                                                  \
-    } while (0)
-
-// Writes a message to the global logger.
-// |severity| is one of DEBUG, INFO, WARNING, ERROR, FATAL
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-#define FX_LOG(severity, tag, message) _FX_LOG((FX_LOG_##severity), tag, message)
-
-// Writes formatted message to the global logger.
-// |severity| is one of DEBUG, INFO, WARNING, ERROR, FATAL
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-#define FX_LOGF(severity, tag, message, ...) _FX_LOGF((FX_LOG_##severity), tag, message, __VA_ARGS__)
-
-// Writes formatted message to the global logger using vaargs
-// |severity| is one of DEBUG, INFO, WARNING, ERROR, FATAL
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-// |args| are the arguments to |message|.
-#define FX_LOGVF(severity, tag, message, args) _FX_LOGVF((FX_LOG_##severity), tag, message, args)
-
-// Writes verbose message to the global logger.
-// |verbosity| is positive integer.
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-#define FX_VLOG(verbosity, tag, message) _FX_LOG(-(verbosity), tag, message)
-
-// Writes formatted verbose message to the global logger.
-// |verbosity| is positive integer.
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-#define FX_VLOGF(verbosity, tag, message, ...) _FX_LOGF(-(verbosity), tag, message, __VA_ARGS__)
-
-// Writes formatted verbose message to the global logger using vaargs
-// |verbosity| is positive integer.
-// |tag| is a tag to associated with the message, or NULL if none.
-// |message| is the message to write, or NULL if none.
-// |args| are the arguments to |message|.
-#define FX_VLOGVF(verbosity, tag, message, args) _FX_LOGVF(-(verbosity), tag, message, args)
-
-__END_CDECLS
-
-#endif // LIB_SYSLOG_GLOBAL_H_
diff --git a/pkg/syslog/include/lib/syslog/logger.h b/pkg/syslog/include/lib/syslog/logger.h
deleted file mode 100644
index 26e001a..0000000
--- a/pkg/syslog/include/lib/syslog/logger.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// 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.
-
-//
-// This header contains definition for the logger object and protocol.
-
-#ifndef LIB_SYSLOG_LOGGER_H_
-#define LIB_SYSLOG_LOGGER_H_
-
-#include <stdarg.h>
-#include <unistd.h>
-
-#include <zircon/types.h>
-
-// Max no of tags associated with a logger.
-#define FX_LOG_MAX_TAGS (4)
-
-// Max individual tag length including terminating character.
-#define FX_LOG_MAX_TAG_LEN (64)
-
-// Log entry severity.
-// Used for coarse filtering of log messages
-typedef int fx_log_severity_t;
-#define FX_LOG_INFO (0)
-#define FX_LOG_WARNING (1)
-#define FX_LOG_ERROR (2)
-#define FX_LOG_FATAL (3)
-
-__BEGIN_CDECLS
-
-// Configuration for a logger object.
-// Specifies the destination to which log messages should be written.
-// Multiple destinations may be used concurrently.
-typedef struct fx_logger_config {
-    // The minimum log severity.
-    // Log messages with lower severity will be discarded.
-    fx_log_severity_t min_severity;
-
-    // The file descriptor to which formatted log messages should be written,
-    // or -1 if log messages should not be written to the console.
-    // logger takes ownership of this fd.
-    int console_fd;
-
-    // The FIDL log service channel to which the logger should connect, or
-    // |ZX_HANDLE_INVALID| if the logger should not connect to the log service.
-    // logger takes ownership of this handle.
-    zx_handle_t log_service_channel;
-
-    // An array of tag strings to associate with all messages written
-    // by this logger.  Tags will be truncated if they are (individually) longer
-    // than |FX_LOG_MAX_TAG_LEN|.
-    const char** tags;
-
-    // Number of tag strings.  Must be no more than |FX_LOG_MAX_TAGS|.
-    size_t num_tags;
-} fx_logger_config_t;
-
-// Opaque type representing a logger object.
-typedef struct fx_logger fx_logger_t;
-
-// Creates a logger object from the specified configuration.
-//
-// This will return ZX_ERR_INVALID_ARGS if |num_tags| is more than
-// |FX_LOG_MAX_TAGS| and return |ZX_ERR_INTERNAL} if dup fails.
-// |config| can be safely deleted after this function returns.
-zx_status_t fx_logger_create(const fx_logger_config_t* config,
-                             fx_logger_t** out_logger);
-
-// Destroys a logger object.
-//
-// This closes |console_fd| or |log_service_channel| which were passed in
-// |fx_logger_config_t|.
-void fx_logger_destroy(fx_logger_t* logger);
-
-// Gets the logger's minimum log severity.
-fx_log_severity_t fx_logger_get_min_severity(fx_logger_t* logger);
-
-// Sets logger severity
-void fx_logger_set_min_severity(fx_logger_t* logger,
-                                fx_log_severity_t severity);
-
-// Activates fallback mode and logger starts writing to |fallback_fd|.
-// There is no way to revert this action.
-//
-// This function does not take ownership of |fallback_fd| and it should not be
-// closed till this logger object is no longer in use. Logger will log to
-// stderr if -1 is provided.
-//
-// This function is thread unsafe.
-void fx_logger_activate_fallback(fx_logger_t* logger,
-                                 int fallback_fd);
-
-// Writes formatted message to a logger.
-// The message will be discarded if |severity| is less than the logger's
-// minimum log severity.
-// The |tag| may be NULL, in which case no additional tags are added to the
-// log message.
-// The |tag| will be truncated if it is longer than |FX_LOG_MAX_TAG_LEN|.
-// No message is written if |message| is NULL.
-zx_status_t fx_logger_logf(fx_logger_t* logger, fx_log_severity_t severity,
-                           const char* tag, const char* msg, ...);
-
-// Writes formatted message to a logger using varargs.
-// The message will be discarded if |severity| is less than the logger's
-// minimum log severity.
-// The |tag| may be NULL, in which case no additional tags are added to the
-// log message.
-// The |tag| will be truncated if it is longer than |FX_LOG_MAX_TAG_LEN|.
-// No message is written if |message| is NULL.
-zx_status_t fx_logger_logvf(fx_logger_t* logger, fx_log_severity_t severity,
-                            const char* tag, const char* msg, va_list args);
-
-// Writes a message to a logger.
-// The message will be discarded if |severity| is less than the logger's
-// minimum log severity.
-// The |tag| may be NULL, in which case no additional tags are added to the
-// log message.
-// The |tag| will be truncated if it is longer than |FX_LOG_MAX_TAG_LEN|.
-// No message is written if |message| is NULL.
-zx_status_t fx_logger_log(fx_logger_t* logger, fx_log_severity_t severity,
-                          const char* tag, const char* msg);
-
-__END_CDECLS
-
-#endif // LIB_SYSLOG_LOGGER_H_
diff --git a/pkg/syslog/include/lib/syslog/wire_format.h b/pkg/syslog/include/lib/syslog/wire_format.h
deleted file mode 100644
index 33dbff0..0000000
--- a/pkg/syslog/include/lib/syslog/wire_format.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-//
-// This header file defines wire format to transfer logs to listening service.
-
-#ifndef LIB_SYSLOG_WIRE_FORMAT_H_
-#define LIB_SYSLOG_WIRE_FORMAT_H_
-
-#include <lib/syslog/logger.h>
-#include <zircon/types.h>
-
-// Defines max length for storing log_metadata, tags and msgbuffer.
-// TODO(anmittal): Increase it when zircon sockets are able to support a higher
-// buffer.
-#define FX_LOG_MAX_DATAGRAM_LEN (2032)
-
-typedef struct fx_log_metadata {
-    zx_koid_t pid;
-    zx_koid_t tid;
-    zx_time_t time;
-    fx_log_severity_t severity;
-
-    // Increment this field whenever there is a socket write error and client
-    // drops the log and send it with next log msg.
-    uint32_t dropped_logs;
-} fx_log_metadata_t;
-
-// Packet to transfer over socket.
-typedef struct fx_log_packet {
-    fx_log_metadata_t metadata;
-
-    // Contains concatenated tags and message and a null terminating character at
-    // the end.
-    char data[FX_LOG_MAX_DATAGRAM_LEN - sizeof(fx_log_metadata_t)];
-} fx_log_packet_t;
-
-#endif // LIB_SYSLOG_WIRE_FORMAT_H_
diff --git a/pkg/syslog/meta.json b/pkg/syslog/meta.json
deleted file mode 100644
index e427a70..0000000
--- a/pkg/syslog/meta.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/ab/d169689a6ad6a1155ae97b4155fa92810bfdce.debug", 
-      "dist": "arch/arm64/dist/libsyslog.so", 
-      "link": "arch/arm64/lib/libsyslog.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/6c/dab7364d696b10a4fdeb1f6c64eac9c8f707f5.debug", 
-      "dist": "arch/x64/dist/libsyslog.so", 
-      "link": "arch/x64/lib/libsyslog.so"
-    }
-  }, 
-  "deps": [
-    "fdio"
-  ], 
-  "format": "shared", 
-  "headers": [
-    "pkg/syslog/include/lib/syslog/global.h", 
-    "pkg/syslog/include/lib/syslog/logger.h", 
-    "pkg/syslog/include/lib/syslog/wire_format.h"
-  ], 
-  "include_dir": "pkg/syslog/include", 
-  "name": "syslog", 
-  "root": "pkg/syslog", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/sysroot/meta.json b/pkg/sysroot/meta.json
index 3219922..66b31ff 100644
--- a/pkg/sysroot/meta.json
+++ b/pkg/sysroot/meta.json
@@ -1,538 +1,545 @@
 {
-  "name": "sysroot", 
-  "root": "pkg/sysroot", 
-  "type": "sysroot", 
+  "name": "sysroot",
+  "type": "sysroot",
   "versions": {
     "arm64": {
       "debug_libs": [
-        "arch/arm64/sysroot/debug/libc.so", 
-        "arch/arm64/sysroot/debug/libzircon.so"
-      ], 
+        ".build-id/e8/f15aa421e721e0.debug",
+        ".build-id/55/b95d079278df9d.debug",
+        ".build-id/61/c6eccde507b5db.debug",
+        ".build-id/b1/26a162015eed95.debug"
+      ],
+      "dist_dir": "arch/arm64/sysroot",
       "dist_libs": [
-        "arch/arm64/sysroot/dist/lib/ld.so.1"
-      ], 
+        "arch/arm64/sysroot/dist/lib/ld.so.1",
+        "arch/arm64/sysroot/dist/lib/asan/ld.so.1",
+        "arch/arm64/sysroot/dist/lib/asan-ubsan/ld.so.1"
+      ],
       "headers": [
-        "arch/arm64/sysroot/include/alloca.h", 
-        "arch/arm64/sysroot/include/ar.h", 
-        "arch/arm64/sysroot/include/arpa/ftp.h", 
-        "arch/arm64/sysroot/include/arpa/inet.h", 
-        "arch/arm64/sysroot/include/arpa/nameser.h", 
-        "arch/arm64/sysroot/include/arpa/nameser_compat.h", 
-        "arch/arm64/sysroot/include/arpa/telnet.h", 
-        "arch/arm64/sysroot/include/arpa/tftp.h", 
-        "arch/arm64/sysroot/include/assert.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/endian.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/fenv.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/float.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/io.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/ioctl.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/ipc.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/reg.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/setjmp.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/signal.h", 
-        "arch/arm64/sysroot/include/bits/aarch64/stat.h", 
-        "arch/arm64/sysroot/include/bits/alltypes.h", 
-        "arch/arm64/sysroot/include/bits/endian.h", 
-        "arch/arm64/sysroot/include/bits/errno.h", 
-        "arch/arm64/sysroot/include/bits/fcntl.h", 
-        "arch/arm64/sysroot/include/bits/fenv.h", 
-        "arch/arm64/sysroot/include/bits/float.h", 
-        "arch/arm64/sysroot/include/bits/io.h", 
-        "arch/arm64/sysroot/include/bits/ioctl.h", 
-        "arch/arm64/sysroot/include/bits/ipc.h", 
-        "arch/arm64/sysroot/include/bits/limits.h", 
-        "arch/arm64/sysroot/include/bits/msg.h", 
-        "arch/arm64/sysroot/include/bits/null.h", 
-        "arch/arm64/sysroot/include/bits/poll.h", 
-        "arch/arm64/sysroot/include/bits/posix.h", 
-        "arch/arm64/sysroot/include/bits/reg.h", 
-        "arch/arm64/sysroot/include/bits/resource.h", 
-        "arch/arm64/sysroot/include/bits/sem.h", 
-        "arch/arm64/sysroot/include/bits/setjmp.h", 
-        "arch/arm64/sysroot/include/bits/shm.h", 
-        "arch/arm64/sysroot/include/bits/signal.h", 
-        "arch/arm64/sysroot/include/bits/socket.h", 
-        "arch/arm64/sysroot/include/bits/stat.h", 
-        "arch/arm64/sysroot/include/bits/statfs.h", 
-        "arch/arm64/sysroot/include/bits/termios.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/endian.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/fenv.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/float.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/io.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/ioctl.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/ipc.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/reg.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/setjmp.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/signal.h", 
-        "arch/arm64/sysroot/include/bits/x86_64/stat.h", 
-        "arch/arm64/sysroot/include/byteswap.h", 
-        "arch/arm64/sysroot/include/complex.h", 
-        "arch/arm64/sysroot/include/cpio.h", 
-        "arch/arm64/sysroot/include/crypt.h", 
-        "arch/arm64/sysroot/include/ctype.h", 
-        "arch/arm64/sysroot/include/dirent.h", 
-        "arch/arm64/sysroot/include/dlfcn.h", 
-        "arch/arm64/sysroot/include/elf.h", 
-        "arch/arm64/sysroot/include/endian.h", 
-        "arch/arm64/sysroot/include/err.h", 
-        "arch/arm64/sysroot/include/errno.h", 
-        "arch/arm64/sysroot/include/fcntl.h", 
-        "arch/arm64/sysroot/include/features.h", 
-        "arch/arm64/sysroot/include/fenv.h", 
-        "arch/arm64/sysroot/include/float.h", 
-        "arch/arm64/sysroot/include/fmtmsg.h", 
-        "arch/arm64/sysroot/include/fnmatch.h", 
-        "arch/arm64/sysroot/include/ftw.h", 
-        "arch/arm64/sysroot/include/getopt.h", 
-        "arch/arm64/sysroot/include/glob.h", 
-        "arch/arm64/sysroot/include/grp.h", 
-        "arch/arm64/sysroot/include/iconv.h", 
-        "arch/arm64/sysroot/include/ifaddrs.h", 
-        "arch/arm64/sysroot/include/inttypes.h", 
-        "arch/arm64/sysroot/include/iso646.h", 
-        "arch/arm64/sysroot/include/langinfo.h", 
-        "arch/arm64/sysroot/include/libgen.h", 
-        "arch/arm64/sysroot/include/limits.h", 
-        "arch/arm64/sysroot/include/link.h", 
-        "arch/arm64/sysroot/include/locale.h", 
-        "arch/arm64/sysroot/include/malloc.h", 
-        "arch/arm64/sysroot/include/math.h", 
-        "arch/arm64/sysroot/include/memory.h", 
-        "arch/arm64/sysroot/include/monetary.h", 
-        "arch/arm64/sysroot/include/net/ethernet.h", 
-        "arch/arm64/sysroot/include/net/if.h", 
-        "arch/arm64/sysroot/include/net/if_arp.h", 
-        "arch/arm64/sysroot/include/net/route.h", 
-        "arch/arm64/sysroot/include/netdb.h", 
-        "arch/arm64/sysroot/include/netinet/ether.h", 
-        "arch/arm64/sysroot/include/netinet/icmp6.h", 
-        "arch/arm64/sysroot/include/netinet/if_ether.h", 
-        "arch/arm64/sysroot/include/netinet/igmp.h", 
-        "arch/arm64/sysroot/include/netinet/in.h", 
-        "arch/arm64/sysroot/include/netinet/in_systm.h", 
-        "arch/arm64/sysroot/include/netinet/ip.h", 
-        "arch/arm64/sysroot/include/netinet/ip6.h", 
-        "arch/arm64/sysroot/include/netinet/ip_icmp.h", 
-        "arch/arm64/sysroot/include/netinet/tcp.h", 
-        "arch/arm64/sysroot/include/netinet/udp.h", 
-        "arch/arm64/sysroot/include/netpacket/packet.h", 
-        "arch/arm64/sysroot/include/nl_types.h", 
-        "arch/arm64/sysroot/include/paths.h", 
-        "arch/arm64/sysroot/include/poll.h", 
-        "arch/arm64/sysroot/include/pthread.h", 
-        "arch/arm64/sysroot/include/pty.h", 
-        "arch/arm64/sysroot/include/pwd.h", 
-        "arch/arm64/sysroot/include/regex.h", 
-        "arch/arm64/sysroot/include/resolv.h", 
-        "arch/arm64/sysroot/include/sched.h", 
-        "arch/arm64/sysroot/include/search.h", 
-        "arch/arm64/sysroot/include/semaphore.h", 
-        "arch/arm64/sysroot/include/setjmp.h", 
-        "arch/arm64/sysroot/include/signal.h", 
-        "arch/arm64/sysroot/include/spawn.h", 
-        "arch/arm64/sysroot/include/stdio.h", 
-        "arch/arm64/sysroot/include/stdlib.h", 
-        "arch/arm64/sysroot/include/stdnoreturn.h", 
-        "arch/arm64/sysroot/include/string.h", 
-        "arch/arm64/sysroot/include/strings.h", 
-        "arch/arm64/sysroot/include/stropts.h", 
-        "arch/arm64/sysroot/include/sys/acct.h", 
-        "arch/arm64/sysroot/include/sys/auxv.h", 
-        "arch/arm64/sysroot/include/sys/dir.h", 
-        "arch/arm64/sysroot/include/sys/errno.h", 
-        "arch/arm64/sysroot/include/sys/eventfd.h", 
-        "arch/arm64/sysroot/include/sys/fcntl.h", 
-        "arch/arm64/sysroot/include/sys/file.h", 
-        "arch/arm64/sysroot/include/sys/fsuid.h", 
-        "arch/arm64/sysroot/include/sys/io.h", 
-        "arch/arm64/sysroot/include/sys/ioctl.h", 
-        "arch/arm64/sysroot/include/sys/ipc.h", 
-        "arch/arm64/sysroot/include/sys/klog.h", 
-        "arch/arm64/sysroot/include/sys/mman.h", 
-        "arch/arm64/sysroot/include/sys/mount.h", 
-        "arch/arm64/sysroot/include/sys/msg.h", 
-        "arch/arm64/sysroot/include/sys/mtio.h", 
-        "arch/arm64/sysroot/include/sys/param.h", 
-        "arch/arm64/sysroot/include/sys/personality.h", 
-        "arch/arm64/sysroot/include/sys/poll.h", 
-        "arch/arm64/sysroot/include/sys/quota.h", 
-        "arch/arm64/sysroot/include/sys/random.h", 
-        "arch/arm64/sysroot/include/sys/reboot.h", 
-        "arch/arm64/sysroot/include/sys/reg.h", 
-        "arch/arm64/sysroot/include/sys/select.h", 
-        "arch/arm64/sysroot/include/sys/sem.h", 
-        "arch/arm64/sysroot/include/sys/sendfile.h", 
-        "arch/arm64/sysroot/include/sys/shm.h", 
-        "arch/arm64/sysroot/include/sys/signal.h", 
-        "arch/arm64/sysroot/include/sys/signalfd.h", 
-        "arch/arm64/sysroot/include/sys/socket.h", 
-        "arch/arm64/sysroot/include/sys/stat.h", 
-        "arch/arm64/sysroot/include/sys/statfs.h", 
-        "arch/arm64/sysroot/include/sys/statvfs.h", 
-        "arch/arm64/sysroot/include/sys/stropts.h", 
-        "arch/arm64/sysroot/include/sys/swap.h", 
-        "arch/arm64/sysroot/include/sys/syslog.h", 
-        "arch/arm64/sysroot/include/sys/termios.h", 
-        "arch/arm64/sysroot/include/sys/time.h", 
-        "arch/arm64/sysroot/include/sys/timeb.h", 
-        "arch/arm64/sysroot/include/sys/timerfd.h", 
-        "arch/arm64/sysroot/include/sys/times.h", 
-        "arch/arm64/sysroot/include/sys/timex.h", 
-        "arch/arm64/sysroot/include/sys/ttydefaults.h", 
-        "arch/arm64/sysroot/include/sys/types.h", 
-        "arch/arm64/sysroot/include/sys/ucontext.h", 
-        "arch/arm64/sysroot/include/sys/uio.h", 
-        "arch/arm64/sysroot/include/sys/un.h", 
-        "arch/arm64/sysroot/include/sys/utsname.h", 
-        "arch/arm64/sysroot/include/sys/vfs.h", 
-        "arch/arm64/sysroot/include/sys/wait.h", 
-        "arch/arm64/sysroot/include/sysexits.h", 
-        "arch/arm64/sysroot/include/syslog.h", 
-        "arch/arm64/sysroot/include/tar.h", 
-        "arch/arm64/sysroot/include/termios.h", 
-        "arch/arm64/sysroot/include/threads.h", 
-        "arch/arm64/sysroot/include/time.h", 
-        "arch/arm64/sysroot/include/uchar.h", 
-        "arch/arm64/sysroot/include/ucontext.h", 
-        "arch/arm64/sysroot/include/unistd.h", 
-        "arch/arm64/sysroot/include/utime.h", 
-        "arch/arm64/sysroot/include/values.h", 
-        "arch/arm64/sysroot/include/wait.h", 
-        "arch/arm64/sysroot/include/wchar.h", 
-        "arch/arm64/sysroot/include/wctype.h", 
-        "arch/arm64/sysroot/include/wordexp.h", 
-        "arch/arm64/sysroot/include/zircon/assert.h", 
-        "arch/arm64/sysroot/include/zircon/boot/bootdata.h", 
-        "arch/arm64/sysroot/include/zircon/boot/driver-config.h", 
-        "arch/arm64/sysroot/include/zircon/boot/e820.h", 
-        "arch/arm64/sysroot/include/zircon/boot/image.h", 
-        "arch/arm64/sysroot/include/zircon/boot/multiboot.h", 
-        "arch/arm64/sysroot/include/zircon/boot/netboot.h", 
-        "arch/arm64/sysroot/include/zircon/boot/sysconfig.h", 
-        "arch/arm64/sysroot/include/zircon/compiler.h", 
-        "arch/arm64/sysroot/include/zircon/device/ioctl-wrapper.h", 
-        "arch/arm64/sysroot/include/zircon/device/ioctl.h", 
-        "arch/arm64/sysroot/include/zircon/device/ramdisk.h", 
-        "arch/arm64/sysroot/include/zircon/dlfcn.h", 
-        "arch/arm64/sysroot/include/zircon/driver/binding.h", 
-        "arch/arm64/sysroot/include/zircon/errors.h", 
-        "arch/arm64/sysroot/include/zircon/features.h", 
-        "arch/arm64/sysroot/include/zircon/fidl.h", 
-        "arch/arm64/sysroot/include/zircon/hw/gpt.h", 
-        "arch/arm64/sysroot/include/zircon/hw/i2c.h", 
-        "arch/arm64/sysroot/include/zircon/hw/pci.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-audio.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-cdc.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-hid.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-hub.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-mass-storage.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb-video.h", 
-        "arch/arm64/sysroot/include/zircon/hw/usb.h", 
-        "arch/arm64/sysroot/include/zircon/limits.h", 
-        "arch/arm64/sysroot/include/zircon/listnode.h", 
-        "arch/arm64/sysroot/include/zircon/pixelformat.h", 
-        "arch/arm64/sysroot/include/zircon/process.h", 
-        "arch/arm64/sysroot/include/zircon/processargs.h", 
-        "arch/arm64/sysroot/include/zircon/rights.h", 
-        "arch/arm64/sysroot/include/zircon/sanitizer.h", 
-        "arch/arm64/sysroot/include/zircon/status.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/debug.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/definitions.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/exception.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/iommu.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/log.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/object.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/pci.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/policy.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/port.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/profile.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/resource.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/smc.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/system.h", 
-        "arch/arm64/sysroot/include/zircon/syscalls/types.h", 
-        "arch/arm64/sysroot/include/zircon/threads.h", 
-        "arch/arm64/sysroot/include/zircon/time.h", 
-        "arch/arm64/sysroot/include/zircon/tls.h", 
-        "arch/arm64/sysroot/include/zircon/types.h"
-      ], 
-      "include_dir": "arch/arm64/sysroot/include", 
+        "arch/arm64/sysroot/include/zircon/assert.h",
+        "arch/arm64/sysroot/include/zircon/boot/bootfs.h",
+        "arch/arm64/sysroot/include/zircon/boot/crash-reason.h",
+        "arch/arm64/sysroot/include/zircon/boot/driver-config.h",
+        "arch/arm64/sysroot/include/zircon/boot/e820.h",
+        "arch/arm64/sysroot/include/zircon/boot/image.h",
+        "arch/arm64/sysroot/include/zircon/boot/multiboot.h",
+        "arch/arm64/sysroot/include/zircon/boot/netboot.h",
+        "arch/arm64/sysroot/include/zircon/boot/sysconfig.h",
+        "arch/arm64/sysroot/include/zircon/compiler.h",
+        "arch/arm64/sysroot/include/zircon/errors.h",
+        "arch/arm64/sysroot/include/zircon/features.h",
+        "arch/arm64/sysroot/include/zircon/fidl.h",
+        "arch/arm64/sysroot/include/zircon/hw/debug/arm64.h",
+        "arch/arm64/sysroot/include/zircon/hw/debug/x86.h",
+        "arch/arm64/sysroot/include/zircon/hw/gpt.h",
+        "arch/arm64/sysroot/include/zircon/hw/i2c.h",
+        "arch/arm64/sysroot/include/zircon/hw/pci.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/audio.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/cdc.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/dfu.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/hid.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/hub.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/ums.h",
+        "arch/arm64/sysroot/include/zircon/hw/usb/video.h",
+        "arch/arm64/sysroot/include/zircon/limits.h",
+        "arch/arm64/sysroot/include/zircon/listnode.h",
+        "arch/arm64/sysroot/include/zircon/pixelformat.h",
+        "arch/arm64/sysroot/include/zircon/process.h",
+        "arch/arm64/sysroot/include/zircon/processargs.h",
+        "arch/arm64/sysroot/include/zircon/rights.h",
+        "arch/arm64/sysroot/include/zircon/string_view.h",
+        "arch/arm64/sysroot/include/zircon/syscalls.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/clock.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/debug.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/exception.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/hypervisor.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/iommu.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/log.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/object.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/pci.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/policy.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/port.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/profile.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/resource.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/scheduler.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/smc.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/system.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/types.h",
+        "arch/arm64/sysroot/include/zircon/time.h",
+        "arch/arm64/sysroot/include/zircon/tls.h",
+        "arch/arm64/sysroot/include/zircon/types.h",
+        "arch/arm64/sysroot/include/zircon/device/audio.h",
+        "arch/arm64/sysroot/include/zircon/testonly-syscalls.h",
+        "arch/arm64/sysroot/include/alloca.h",
+        "arch/arm64/sysroot/include/ar.h",
+        "arch/arm64/sysroot/include/arpa/ftp.h",
+        "arch/arm64/sysroot/include/arpa/inet.h",
+        "arch/arm64/sysroot/include/arpa/nameser.h",
+        "arch/arm64/sysroot/include/arpa/nameser_compat.h",
+        "arch/arm64/sysroot/include/arpa/telnet.h",
+        "arch/arm64/sysroot/include/arpa/tftp.h",
+        "arch/arm64/sysroot/include/assert.h",
+        "arch/arm64/sysroot/include/bits/aarch64/endian.h",
+        "arch/arm64/sysroot/include/bits/aarch64/fenv.h",
+        "arch/arm64/sysroot/include/bits/aarch64/io.h",
+        "arch/arm64/sysroot/include/bits/aarch64/ioctl.h",
+        "arch/arm64/sysroot/include/bits/aarch64/ipc.h",
+        "arch/arm64/sysroot/include/bits/aarch64/reg.h",
+        "arch/arm64/sysroot/include/bits/aarch64/setjmp.h",
+        "arch/arm64/sysroot/include/bits/aarch64/signal.h",
+        "arch/arm64/sysroot/include/bits/aarch64/stat.h",
+        "arch/arm64/sysroot/include/bits/alltypes.h",
+        "arch/arm64/sysroot/include/bits/endian.h",
+        "arch/arm64/sysroot/include/bits/errno.h",
+        "arch/arm64/sysroot/include/bits/fcntl.h",
+        "arch/arm64/sysroot/include/bits/fenv.h",
+        "arch/arm64/sysroot/include/bits/io.h",
+        "arch/arm64/sysroot/include/bits/ioctl.h",
+        "arch/arm64/sysroot/include/bits/ipc.h",
+        "arch/arm64/sysroot/include/bits/limits.h",
+        "arch/arm64/sysroot/include/bits/msg.h",
+        "arch/arm64/sysroot/include/bits/null.h",
+        "arch/arm64/sysroot/include/bits/poll.h",
+        "arch/arm64/sysroot/include/bits/posix.h",
+        "arch/arm64/sysroot/include/bits/reg.h",
+        "arch/arm64/sysroot/include/bits/resource.h",
+        "arch/arm64/sysroot/include/bits/sem.h",
+        "arch/arm64/sysroot/include/bits/setjmp.h",
+        "arch/arm64/sysroot/include/bits/shm.h",
+        "arch/arm64/sysroot/include/bits/signal.h",
+        "arch/arm64/sysroot/include/bits/socket.h",
+        "arch/arm64/sysroot/include/bits/stat.h",
+        "arch/arm64/sysroot/include/bits/statfs.h",
+        "arch/arm64/sysroot/include/bits/termios.h",
+        "arch/arm64/sysroot/include/bits/x86_64/endian.h",
+        "arch/arm64/sysroot/include/bits/x86_64/fenv.h",
+        "arch/arm64/sysroot/include/bits/x86_64/io.h",
+        "arch/arm64/sysroot/include/bits/x86_64/ioctl.h",
+        "arch/arm64/sysroot/include/bits/x86_64/ipc.h",
+        "arch/arm64/sysroot/include/bits/x86_64/reg.h",
+        "arch/arm64/sysroot/include/bits/x86_64/setjmp.h",
+        "arch/arm64/sysroot/include/bits/x86_64/signal.h",
+        "arch/arm64/sysroot/include/bits/x86_64/stat.h",
+        "arch/arm64/sysroot/include/byteswap.h",
+        "arch/arm64/sysroot/include/complex.h",
+        "arch/arm64/sysroot/include/cpio.h",
+        "arch/arm64/sysroot/include/ctype.h",
+        "arch/arm64/sysroot/include/dirent.h",
+        "arch/arm64/sysroot/include/dlfcn.h",
+        "arch/arm64/sysroot/include/elf.h",
+        "arch/arm64/sysroot/include/endian.h",
+        "arch/arm64/sysroot/include/err.h",
+        "arch/arm64/sysroot/include/errno.h",
+        "arch/arm64/sysroot/include/fcntl.h",
+        "arch/arm64/sysroot/include/features.h",
+        "arch/arm64/sysroot/include/fenv.h",
+        "arch/arm64/sysroot/include/fmtmsg.h",
+        "arch/arm64/sysroot/include/fnmatch.h",
+        "arch/arm64/sysroot/include/getopt.h",
+        "arch/arm64/sysroot/include/glob.h",
+        "arch/arm64/sysroot/include/grp.h",
+        "arch/arm64/sysroot/include/iconv.h",
+        "arch/arm64/sysroot/include/ifaddrs.h",
+        "arch/arm64/sysroot/include/inttypes.h",
+        "arch/arm64/sysroot/include/iso646.h",
+        "arch/arm64/sysroot/include/langinfo.h",
+        "arch/arm64/sysroot/include/libgen.h",
+        "arch/arm64/sysroot/include/limits.h",
+        "arch/arm64/sysroot/include/link.h",
+        "arch/arm64/sysroot/include/locale.h",
+        "arch/arm64/sysroot/include/malloc.h",
+        "arch/arm64/sysroot/include/math.h",
+        "arch/arm64/sysroot/include/memory.h",
+        "arch/arm64/sysroot/include/monetary.h",
+        "arch/arm64/sysroot/include/net/ethernet.h",
+        "arch/arm64/sysroot/include/net/if.h",
+        "arch/arm64/sysroot/include/net/if_arp.h",
+        "arch/arm64/sysroot/include/net/route.h",
+        "arch/arm64/sysroot/include/netdb.h",
+        "arch/arm64/sysroot/include/netinet/ether.h",
+        "arch/arm64/sysroot/include/netinet/icmp6.h",
+        "arch/arm64/sysroot/include/netinet/if_ether.h",
+        "arch/arm64/sysroot/include/netinet/igmp.h",
+        "arch/arm64/sysroot/include/netinet/in.h",
+        "arch/arm64/sysroot/include/netinet/in_systm.h",
+        "arch/arm64/sysroot/include/netinet/ip.h",
+        "arch/arm64/sysroot/include/netinet/ip6.h",
+        "arch/arm64/sysroot/include/netinet/ip_icmp.h",
+        "arch/arm64/sysroot/include/netinet/tcp.h",
+        "arch/arm64/sysroot/include/netinet/udp.h",
+        "arch/arm64/sysroot/include/netpacket/packet.h",
+        "arch/arm64/sysroot/include/nl_types.h",
+        "arch/arm64/sysroot/include/paths.h",
+        "arch/arm64/sysroot/include/poll.h",
+        "arch/arm64/sysroot/include/pthread.h",
+        "arch/arm64/sysroot/include/pwd.h",
+        "arch/arm64/sysroot/include/regex.h",
+        "arch/arm64/sysroot/include/resolv.h",
+        "arch/arm64/sysroot/include/sched.h",
+        "arch/arm64/sysroot/include/search.h",
+        "arch/arm64/sysroot/include/semaphore.h",
+        "arch/arm64/sysroot/include/setjmp.h",
+        "arch/arm64/sysroot/include/signal.h",
+        "arch/arm64/sysroot/include/spawn.h",
+        "arch/arm64/sysroot/include/stdio.h",
+        "arch/arm64/sysroot/include/stdlib.h",
+        "arch/arm64/sysroot/include/string.h",
+        "arch/arm64/sysroot/include/strings.h",
+        "arch/arm64/sysroot/include/stropts.h",
+        "arch/arm64/sysroot/include/sys/acct.h",
+        "arch/arm64/sysroot/include/sys/auxv.h",
+        "arch/arm64/sysroot/include/sys/dir.h",
+        "arch/arm64/sysroot/include/sys/errno.h",
+        "arch/arm64/sysroot/include/sys/eventfd.h",
+        "arch/arm64/sysroot/include/sys/fcntl.h",
+        "arch/arm64/sysroot/include/sys/file.h",
+        "arch/arm64/sysroot/include/sys/fsuid.h",
+        "arch/arm64/sysroot/include/sys/io.h",
+        "arch/arm64/sysroot/include/sys/ioctl.h",
+        "arch/arm64/sysroot/include/sys/ipc.h",
+        "arch/arm64/sysroot/include/sys/klog.h",
+        "arch/arm64/sysroot/include/sys/mman.h",
+        "arch/arm64/sysroot/include/sys/mount.h",
+        "arch/arm64/sysroot/include/sys/msg.h",
+        "arch/arm64/sysroot/include/sys/mtio.h",
+        "arch/arm64/sysroot/include/sys/param.h",
+        "arch/arm64/sysroot/include/sys/personality.h",
+        "arch/arm64/sysroot/include/sys/poll.h",
+        "arch/arm64/sysroot/include/sys/quota.h",
+        "arch/arm64/sysroot/include/sys/random.h",
+        "arch/arm64/sysroot/include/sys/reboot.h",
+        "arch/arm64/sysroot/include/sys/reg.h",
+        "arch/arm64/sysroot/include/sys/select.h",
+        "arch/arm64/sysroot/include/sys/sem.h",
+        "arch/arm64/sysroot/include/sys/shm.h",
+        "arch/arm64/sysroot/include/sys/signal.h",
+        "arch/arm64/sysroot/include/sys/signalfd.h",
+        "arch/arm64/sysroot/include/sys/socket.h",
+        "arch/arm64/sysroot/include/sys/stat.h",
+        "arch/arm64/sysroot/include/sys/statfs.h",
+        "arch/arm64/sysroot/include/sys/statvfs.h",
+        "arch/arm64/sysroot/include/sys/stropts.h",
+        "arch/arm64/sysroot/include/sys/swap.h",
+        "arch/arm64/sysroot/include/sys/syslog.h",
+        "arch/arm64/sysroot/include/sys/termios.h",
+        "arch/arm64/sysroot/include/sys/time.h",
+        "arch/arm64/sysroot/include/sys/timeb.h",
+        "arch/arm64/sysroot/include/sys/timerfd.h",
+        "arch/arm64/sysroot/include/sys/times.h",
+        "arch/arm64/sysroot/include/sys/timex.h",
+        "arch/arm64/sysroot/include/sys/ttydefaults.h",
+        "arch/arm64/sysroot/include/sys/types.h",
+        "arch/arm64/sysroot/include/sys/ucontext.h",
+        "arch/arm64/sysroot/include/sys/uio.h",
+        "arch/arm64/sysroot/include/sys/un.h",
+        "arch/arm64/sysroot/include/sys/utsname.h",
+        "arch/arm64/sysroot/include/sys/vfs.h",
+        "arch/arm64/sysroot/include/sys/wait.h",
+        "arch/arm64/sysroot/include/sysexits.h",
+        "arch/arm64/sysroot/include/syslog.h",
+        "arch/arm64/sysroot/include/tar.h",
+        "arch/arm64/sysroot/include/termios.h",
+        "arch/arm64/sysroot/include/threads.h",
+        "arch/arm64/sysroot/include/time.h",
+        "arch/arm64/sysroot/include/uchar.h",
+        "arch/arm64/sysroot/include/ucontext.h",
+        "arch/arm64/sysroot/include/unistd.h",
+        "arch/arm64/sysroot/include/utime.h",
+        "arch/arm64/sysroot/include/values.h",
+        "arch/arm64/sysroot/include/wait.h",
+        "arch/arm64/sysroot/include/wchar.h",
+        "arch/arm64/sysroot/include/wctype.h",
+        "arch/arm64/sysroot/include/wordexp.h",
+        "arch/arm64/sysroot/include/zircon/dlfcn.h",
+        "arch/arm64/sysroot/include/zircon/lookup.h",
+        "arch/arm64/sysroot/include/zircon/sanitizer.h",
+        "arch/arm64/sysroot/include/zircon/threads.h",
+        "arch/arm64/sysroot/include/zircon/utc.h",
+        "arch/arm64/sysroot/include/zircon/syscalls/internal/cdecls.inc",
+        "arch/arm64/sysroot/include/zircon/status.h",
+        "arch/arm64/sysroot/include/zircon/exception.h"
+      ],
+      "include_dir": "arch/arm64/sysroot/include",
       "link_libs": [
-        "arch/arm64/sysroot/lib/Scrt1.o", 
-        "arch/arm64/sysroot/lib/libc.so", 
-        "arch/arm64/sysroot/lib/libdl.so", 
-        "arch/arm64/sysroot/lib/libm.so", 
-        "arch/arm64/sysroot/lib/libpthread.so", 
-        "arch/arm64/sysroot/lib/librt.so", 
+        "arch/arm64/sysroot/lib/libc.so",
+        "arch/arm64/sysroot/lib/libdl.so",
+        "arch/arm64/sysroot/lib/libm.so",
+        "arch/arm64/sysroot/lib/libpthread.so",
+        "arch/arm64/sysroot/lib/librt.so",
+        "arch/arm64/sysroot/lib/Scrt1.o",
         "arch/arm64/sysroot/lib/libzircon.so"
-      ], 
+      ],
       "root": "arch/arm64/sysroot"
-    }, 
+    },
     "x64": {
       "debug_libs": [
-        "arch/x64/sysroot/debug/libc.so", 
-        "arch/x64/sysroot/debug/libzircon.so"
-      ], 
+        ".build-id/59/1142fde7ffba7c.debug",
+        ".build-id/bc/9ab4810439a645.debug",
+        ".build-id/02/f5f7da6fb6d41f.debug",
+        ".build-id/a1/92662b149df3e5.debug"
+      ],
+      "dist_dir": "arch/x64/sysroot",
       "dist_libs": [
-        "arch/x64/sysroot/dist/lib/ld.so.1"
-      ], 
+        "arch/x64/sysroot/dist/lib/ld.so.1",
+        "arch/x64/sysroot/dist/lib/asan/ld.so.1",
+        "arch/x64/sysroot/dist/lib/asan-ubsan/ld.so.1"
+      ],
       "headers": [
-        "arch/x64/sysroot/include/alloca.h", 
-        "arch/x64/sysroot/include/ar.h", 
-        "arch/x64/sysroot/include/arpa/ftp.h", 
-        "arch/x64/sysroot/include/arpa/inet.h", 
-        "arch/x64/sysroot/include/arpa/nameser.h", 
-        "arch/x64/sysroot/include/arpa/nameser_compat.h", 
-        "arch/x64/sysroot/include/arpa/telnet.h", 
-        "arch/x64/sysroot/include/arpa/tftp.h", 
-        "arch/x64/sysroot/include/assert.h", 
-        "arch/x64/sysroot/include/bits/aarch64/endian.h", 
-        "arch/x64/sysroot/include/bits/aarch64/fenv.h", 
-        "arch/x64/sysroot/include/bits/aarch64/float.h", 
-        "arch/x64/sysroot/include/bits/aarch64/io.h", 
-        "arch/x64/sysroot/include/bits/aarch64/ioctl.h", 
-        "arch/x64/sysroot/include/bits/aarch64/ipc.h", 
-        "arch/x64/sysroot/include/bits/aarch64/reg.h", 
-        "arch/x64/sysroot/include/bits/aarch64/setjmp.h", 
-        "arch/x64/sysroot/include/bits/aarch64/signal.h", 
-        "arch/x64/sysroot/include/bits/aarch64/stat.h", 
-        "arch/x64/sysroot/include/bits/alltypes.h", 
-        "arch/x64/sysroot/include/bits/endian.h", 
-        "arch/x64/sysroot/include/bits/errno.h", 
-        "arch/x64/sysroot/include/bits/fcntl.h", 
-        "arch/x64/sysroot/include/bits/fenv.h", 
-        "arch/x64/sysroot/include/bits/float.h", 
-        "arch/x64/sysroot/include/bits/io.h", 
-        "arch/x64/sysroot/include/bits/ioctl.h", 
-        "arch/x64/sysroot/include/bits/ipc.h", 
-        "arch/x64/sysroot/include/bits/limits.h", 
-        "arch/x64/sysroot/include/bits/msg.h", 
-        "arch/x64/sysroot/include/bits/null.h", 
-        "arch/x64/sysroot/include/bits/poll.h", 
-        "arch/x64/sysroot/include/bits/posix.h", 
-        "arch/x64/sysroot/include/bits/reg.h", 
-        "arch/x64/sysroot/include/bits/resource.h", 
-        "arch/x64/sysroot/include/bits/sem.h", 
-        "arch/x64/sysroot/include/bits/setjmp.h", 
-        "arch/x64/sysroot/include/bits/shm.h", 
-        "arch/x64/sysroot/include/bits/signal.h", 
-        "arch/x64/sysroot/include/bits/socket.h", 
-        "arch/x64/sysroot/include/bits/stat.h", 
-        "arch/x64/sysroot/include/bits/statfs.h", 
-        "arch/x64/sysroot/include/bits/termios.h", 
-        "arch/x64/sysroot/include/bits/x86_64/endian.h", 
-        "arch/x64/sysroot/include/bits/x86_64/fenv.h", 
-        "arch/x64/sysroot/include/bits/x86_64/float.h", 
-        "arch/x64/sysroot/include/bits/x86_64/io.h", 
-        "arch/x64/sysroot/include/bits/x86_64/ioctl.h", 
-        "arch/x64/sysroot/include/bits/x86_64/ipc.h", 
-        "arch/x64/sysroot/include/bits/x86_64/reg.h", 
-        "arch/x64/sysroot/include/bits/x86_64/setjmp.h", 
-        "arch/x64/sysroot/include/bits/x86_64/signal.h", 
-        "arch/x64/sysroot/include/bits/x86_64/stat.h", 
-        "arch/x64/sysroot/include/byteswap.h", 
-        "arch/x64/sysroot/include/complex.h", 
-        "arch/x64/sysroot/include/cpio.h", 
-        "arch/x64/sysroot/include/crypt.h", 
-        "arch/x64/sysroot/include/ctype.h", 
-        "arch/x64/sysroot/include/dirent.h", 
-        "arch/x64/sysroot/include/dlfcn.h", 
-        "arch/x64/sysroot/include/elf.h", 
-        "arch/x64/sysroot/include/endian.h", 
-        "arch/x64/sysroot/include/err.h", 
-        "arch/x64/sysroot/include/errno.h", 
-        "arch/x64/sysroot/include/fcntl.h", 
-        "arch/x64/sysroot/include/features.h", 
-        "arch/x64/sysroot/include/fenv.h", 
-        "arch/x64/sysroot/include/float.h", 
-        "arch/x64/sysroot/include/fmtmsg.h", 
-        "arch/x64/sysroot/include/fnmatch.h", 
-        "arch/x64/sysroot/include/ftw.h", 
-        "arch/x64/sysroot/include/getopt.h", 
-        "arch/x64/sysroot/include/glob.h", 
-        "arch/x64/sysroot/include/grp.h", 
-        "arch/x64/sysroot/include/iconv.h", 
-        "arch/x64/sysroot/include/ifaddrs.h", 
-        "arch/x64/sysroot/include/inttypes.h", 
-        "arch/x64/sysroot/include/iso646.h", 
-        "arch/x64/sysroot/include/langinfo.h", 
-        "arch/x64/sysroot/include/libgen.h", 
-        "arch/x64/sysroot/include/limits.h", 
-        "arch/x64/sysroot/include/link.h", 
-        "arch/x64/sysroot/include/locale.h", 
-        "arch/x64/sysroot/include/malloc.h", 
-        "arch/x64/sysroot/include/math.h", 
-        "arch/x64/sysroot/include/memory.h", 
-        "arch/x64/sysroot/include/monetary.h", 
-        "arch/x64/sysroot/include/net/ethernet.h", 
-        "arch/x64/sysroot/include/net/if.h", 
-        "arch/x64/sysroot/include/net/if_arp.h", 
-        "arch/x64/sysroot/include/net/route.h", 
-        "arch/x64/sysroot/include/netdb.h", 
-        "arch/x64/sysroot/include/netinet/ether.h", 
-        "arch/x64/sysroot/include/netinet/icmp6.h", 
-        "arch/x64/sysroot/include/netinet/if_ether.h", 
-        "arch/x64/sysroot/include/netinet/igmp.h", 
-        "arch/x64/sysroot/include/netinet/in.h", 
-        "arch/x64/sysroot/include/netinet/in_systm.h", 
-        "arch/x64/sysroot/include/netinet/ip.h", 
-        "arch/x64/sysroot/include/netinet/ip6.h", 
-        "arch/x64/sysroot/include/netinet/ip_icmp.h", 
-        "arch/x64/sysroot/include/netinet/tcp.h", 
-        "arch/x64/sysroot/include/netinet/udp.h", 
-        "arch/x64/sysroot/include/netpacket/packet.h", 
-        "arch/x64/sysroot/include/nl_types.h", 
-        "arch/x64/sysroot/include/paths.h", 
-        "arch/x64/sysroot/include/poll.h", 
-        "arch/x64/sysroot/include/pthread.h", 
-        "arch/x64/sysroot/include/pty.h", 
-        "arch/x64/sysroot/include/pwd.h", 
-        "arch/x64/sysroot/include/regex.h", 
-        "arch/x64/sysroot/include/resolv.h", 
-        "arch/x64/sysroot/include/sched.h", 
-        "arch/x64/sysroot/include/search.h", 
-        "arch/x64/sysroot/include/semaphore.h", 
-        "arch/x64/sysroot/include/setjmp.h", 
-        "arch/x64/sysroot/include/signal.h", 
-        "arch/x64/sysroot/include/spawn.h", 
-        "arch/x64/sysroot/include/stdio.h", 
-        "arch/x64/sysroot/include/stdlib.h", 
-        "arch/x64/sysroot/include/stdnoreturn.h", 
-        "arch/x64/sysroot/include/string.h", 
-        "arch/x64/sysroot/include/strings.h", 
-        "arch/x64/sysroot/include/stropts.h", 
-        "arch/x64/sysroot/include/sys/acct.h", 
-        "arch/x64/sysroot/include/sys/auxv.h", 
-        "arch/x64/sysroot/include/sys/dir.h", 
-        "arch/x64/sysroot/include/sys/errno.h", 
-        "arch/x64/sysroot/include/sys/eventfd.h", 
-        "arch/x64/sysroot/include/sys/fcntl.h", 
-        "arch/x64/sysroot/include/sys/file.h", 
-        "arch/x64/sysroot/include/sys/fsuid.h", 
-        "arch/x64/sysroot/include/sys/io.h", 
-        "arch/x64/sysroot/include/sys/ioctl.h", 
-        "arch/x64/sysroot/include/sys/ipc.h", 
-        "arch/x64/sysroot/include/sys/klog.h", 
-        "arch/x64/sysroot/include/sys/mman.h", 
-        "arch/x64/sysroot/include/sys/mount.h", 
-        "arch/x64/sysroot/include/sys/msg.h", 
-        "arch/x64/sysroot/include/sys/mtio.h", 
-        "arch/x64/sysroot/include/sys/param.h", 
-        "arch/x64/sysroot/include/sys/personality.h", 
-        "arch/x64/sysroot/include/sys/poll.h", 
-        "arch/x64/sysroot/include/sys/quota.h", 
-        "arch/x64/sysroot/include/sys/random.h", 
-        "arch/x64/sysroot/include/sys/reboot.h", 
-        "arch/x64/sysroot/include/sys/reg.h", 
-        "arch/x64/sysroot/include/sys/select.h", 
-        "arch/x64/sysroot/include/sys/sem.h", 
-        "arch/x64/sysroot/include/sys/sendfile.h", 
-        "arch/x64/sysroot/include/sys/shm.h", 
-        "arch/x64/sysroot/include/sys/signal.h", 
-        "arch/x64/sysroot/include/sys/signalfd.h", 
-        "arch/x64/sysroot/include/sys/socket.h", 
-        "arch/x64/sysroot/include/sys/stat.h", 
-        "arch/x64/sysroot/include/sys/statfs.h", 
-        "arch/x64/sysroot/include/sys/statvfs.h", 
-        "arch/x64/sysroot/include/sys/stropts.h", 
-        "arch/x64/sysroot/include/sys/swap.h", 
-        "arch/x64/sysroot/include/sys/syslog.h", 
-        "arch/x64/sysroot/include/sys/termios.h", 
-        "arch/x64/sysroot/include/sys/time.h", 
-        "arch/x64/sysroot/include/sys/timeb.h", 
-        "arch/x64/sysroot/include/sys/timerfd.h", 
-        "arch/x64/sysroot/include/sys/times.h", 
-        "arch/x64/sysroot/include/sys/timex.h", 
-        "arch/x64/sysroot/include/sys/ttydefaults.h", 
-        "arch/x64/sysroot/include/sys/types.h", 
-        "arch/x64/sysroot/include/sys/ucontext.h", 
-        "arch/x64/sysroot/include/sys/uio.h", 
-        "arch/x64/sysroot/include/sys/un.h", 
-        "arch/x64/sysroot/include/sys/utsname.h", 
-        "arch/x64/sysroot/include/sys/vfs.h", 
-        "arch/x64/sysroot/include/sys/wait.h", 
-        "arch/x64/sysroot/include/sysexits.h", 
-        "arch/x64/sysroot/include/syslog.h", 
-        "arch/x64/sysroot/include/tar.h", 
-        "arch/x64/sysroot/include/termios.h", 
-        "arch/x64/sysroot/include/threads.h", 
-        "arch/x64/sysroot/include/time.h", 
-        "arch/x64/sysroot/include/uchar.h", 
-        "arch/x64/sysroot/include/ucontext.h", 
-        "arch/x64/sysroot/include/unistd.h", 
-        "arch/x64/sysroot/include/utime.h", 
-        "arch/x64/sysroot/include/values.h", 
-        "arch/x64/sysroot/include/wait.h", 
-        "arch/x64/sysroot/include/wchar.h", 
-        "arch/x64/sysroot/include/wctype.h", 
-        "arch/x64/sysroot/include/wordexp.h", 
-        "arch/x64/sysroot/include/zircon/assert.h", 
-        "arch/x64/sysroot/include/zircon/boot/bootdata.h", 
-        "arch/x64/sysroot/include/zircon/boot/driver-config.h", 
-        "arch/x64/sysroot/include/zircon/boot/e820.h", 
-        "arch/x64/sysroot/include/zircon/boot/image.h", 
-        "arch/x64/sysroot/include/zircon/boot/multiboot.h", 
-        "arch/x64/sysroot/include/zircon/boot/netboot.h", 
-        "arch/x64/sysroot/include/zircon/boot/sysconfig.h", 
-        "arch/x64/sysroot/include/zircon/compiler.h", 
-        "arch/x64/sysroot/include/zircon/device/ioctl-wrapper.h", 
-        "arch/x64/sysroot/include/zircon/device/ioctl.h", 
-        "arch/x64/sysroot/include/zircon/device/ramdisk.h", 
-        "arch/x64/sysroot/include/zircon/dlfcn.h", 
-        "arch/x64/sysroot/include/zircon/driver/binding.h", 
-        "arch/x64/sysroot/include/zircon/errors.h", 
-        "arch/x64/sysroot/include/zircon/features.h", 
-        "arch/x64/sysroot/include/zircon/fidl.h", 
-        "arch/x64/sysroot/include/zircon/hw/gpt.h", 
-        "arch/x64/sysroot/include/zircon/hw/i2c.h", 
-        "arch/x64/sysroot/include/zircon/hw/pci.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-audio.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-cdc.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-hid.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-hub.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-mass-storage.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb-video.h", 
-        "arch/x64/sysroot/include/zircon/hw/usb.h", 
-        "arch/x64/sysroot/include/zircon/limits.h", 
-        "arch/x64/sysroot/include/zircon/listnode.h", 
-        "arch/x64/sysroot/include/zircon/pixelformat.h", 
-        "arch/x64/sysroot/include/zircon/process.h", 
-        "arch/x64/sysroot/include/zircon/processargs.h", 
-        "arch/x64/sysroot/include/zircon/rights.h", 
-        "arch/x64/sysroot/include/zircon/sanitizer.h", 
-        "arch/x64/sysroot/include/zircon/status.h", 
-        "arch/x64/sysroot/include/zircon/syscalls.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/debug.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/definitions.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/exception.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/hypervisor.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/iommu.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/log.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/object.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/pci.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/policy.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/port.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/profile.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/resource.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/smc.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/system.h", 
-        "arch/x64/sysroot/include/zircon/syscalls/types.h", 
-        "arch/x64/sysroot/include/zircon/threads.h", 
-        "arch/x64/sysroot/include/zircon/time.h", 
-        "arch/x64/sysroot/include/zircon/tls.h", 
-        "arch/x64/sysroot/include/zircon/types.h"
-      ], 
-      "include_dir": "arch/x64/sysroot/include", 
+        "arch/x64/sysroot/include/zircon/assert.h",
+        "arch/x64/sysroot/include/zircon/boot/bootfs.h",
+        "arch/x64/sysroot/include/zircon/boot/crash-reason.h",
+        "arch/x64/sysroot/include/zircon/boot/driver-config.h",
+        "arch/x64/sysroot/include/zircon/boot/e820.h",
+        "arch/x64/sysroot/include/zircon/boot/image.h",
+        "arch/x64/sysroot/include/zircon/boot/multiboot.h",
+        "arch/x64/sysroot/include/zircon/boot/netboot.h",
+        "arch/x64/sysroot/include/zircon/boot/sysconfig.h",
+        "arch/x64/sysroot/include/zircon/compiler.h",
+        "arch/x64/sysroot/include/zircon/errors.h",
+        "arch/x64/sysroot/include/zircon/features.h",
+        "arch/x64/sysroot/include/zircon/fidl.h",
+        "arch/x64/sysroot/include/zircon/hw/debug/arm64.h",
+        "arch/x64/sysroot/include/zircon/hw/debug/x86.h",
+        "arch/x64/sysroot/include/zircon/hw/gpt.h",
+        "arch/x64/sysroot/include/zircon/hw/i2c.h",
+        "arch/x64/sysroot/include/zircon/hw/pci.h",
+        "arch/x64/sysroot/include/zircon/hw/usb.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/audio.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/cdc.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/dfu.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/hid.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/hub.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/ums.h",
+        "arch/x64/sysroot/include/zircon/hw/usb/video.h",
+        "arch/x64/sysroot/include/zircon/limits.h",
+        "arch/x64/sysroot/include/zircon/listnode.h",
+        "arch/x64/sysroot/include/zircon/pixelformat.h",
+        "arch/x64/sysroot/include/zircon/process.h",
+        "arch/x64/sysroot/include/zircon/processargs.h",
+        "arch/x64/sysroot/include/zircon/rights.h",
+        "arch/x64/sysroot/include/zircon/string_view.h",
+        "arch/x64/sysroot/include/zircon/syscalls.h",
+        "arch/x64/sysroot/include/zircon/syscalls/clock.h",
+        "arch/x64/sysroot/include/zircon/syscalls/debug.h",
+        "arch/x64/sysroot/include/zircon/syscalls/exception.h",
+        "arch/x64/sysroot/include/zircon/syscalls/hypervisor.h",
+        "arch/x64/sysroot/include/zircon/syscalls/iommu.h",
+        "arch/x64/sysroot/include/zircon/syscalls/log.h",
+        "arch/x64/sysroot/include/zircon/syscalls/object.h",
+        "arch/x64/sysroot/include/zircon/syscalls/pci.h",
+        "arch/x64/sysroot/include/zircon/syscalls/policy.h",
+        "arch/x64/sysroot/include/zircon/syscalls/port.h",
+        "arch/x64/sysroot/include/zircon/syscalls/profile.h",
+        "arch/x64/sysroot/include/zircon/syscalls/resource.h",
+        "arch/x64/sysroot/include/zircon/syscalls/scheduler.h",
+        "arch/x64/sysroot/include/zircon/syscalls/smc.h",
+        "arch/x64/sysroot/include/zircon/syscalls/system.h",
+        "arch/x64/sysroot/include/zircon/syscalls/types.h",
+        "arch/x64/sysroot/include/zircon/time.h",
+        "arch/x64/sysroot/include/zircon/tls.h",
+        "arch/x64/sysroot/include/zircon/types.h",
+        "arch/x64/sysroot/include/zircon/device/audio.h",
+        "arch/x64/sysroot/include/zircon/testonly-syscalls.h",
+        "arch/x64/sysroot/include/alloca.h",
+        "arch/x64/sysroot/include/ar.h",
+        "arch/x64/sysroot/include/arpa/ftp.h",
+        "arch/x64/sysroot/include/arpa/inet.h",
+        "arch/x64/sysroot/include/arpa/nameser.h",
+        "arch/x64/sysroot/include/arpa/nameser_compat.h",
+        "arch/x64/sysroot/include/arpa/telnet.h",
+        "arch/x64/sysroot/include/arpa/tftp.h",
+        "arch/x64/sysroot/include/assert.h",
+        "arch/x64/sysroot/include/bits/aarch64/endian.h",
+        "arch/x64/sysroot/include/bits/aarch64/fenv.h",
+        "arch/x64/sysroot/include/bits/aarch64/io.h",
+        "arch/x64/sysroot/include/bits/aarch64/ioctl.h",
+        "arch/x64/sysroot/include/bits/aarch64/ipc.h",
+        "arch/x64/sysroot/include/bits/aarch64/reg.h",
+        "arch/x64/sysroot/include/bits/aarch64/setjmp.h",
+        "arch/x64/sysroot/include/bits/aarch64/signal.h",
+        "arch/x64/sysroot/include/bits/aarch64/stat.h",
+        "arch/x64/sysroot/include/bits/alltypes.h",
+        "arch/x64/sysroot/include/bits/endian.h",
+        "arch/x64/sysroot/include/bits/errno.h",
+        "arch/x64/sysroot/include/bits/fcntl.h",
+        "arch/x64/sysroot/include/bits/fenv.h",
+        "arch/x64/sysroot/include/bits/io.h",
+        "arch/x64/sysroot/include/bits/ioctl.h",
+        "arch/x64/sysroot/include/bits/ipc.h",
+        "arch/x64/sysroot/include/bits/limits.h",
+        "arch/x64/sysroot/include/bits/msg.h",
+        "arch/x64/sysroot/include/bits/null.h",
+        "arch/x64/sysroot/include/bits/poll.h",
+        "arch/x64/sysroot/include/bits/posix.h",
+        "arch/x64/sysroot/include/bits/reg.h",
+        "arch/x64/sysroot/include/bits/resource.h",
+        "arch/x64/sysroot/include/bits/sem.h",
+        "arch/x64/sysroot/include/bits/setjmp.h",
+        "arch/x64/sysroot/include/bits/shm.h",
+        "arch/x64/sysroot/include/bits/signal.h",
+        "arch/x64/sysroot/include/bits/socket.h",
+        "arch/x64/sysroot/include/bits/stat.h",
+        "arch/x64/sysroot/include/bits/statfs.h",
+        "arch/x64/sysroot/include/bits/termios.h",
+        "arch/x64/sysroot/include/bits/x86_64/endian.h",
+        "arch/x64/sysroot/include/bits/x86_64/fenv.h",
+        "arch/x64/sysroot/include/bits/x86_64/io.h",
+        "arch/x64/sysroot/include/bits/x86_64/ioctl.h",
+        "arch/x64/sysroot/include/bits/x86_64/ipc.h",
+        "arch/x64/sysroot/include/bits/x86_64/reg.h",
+        "arch/x64/sysroot/include/bits/x86_64/setjmp.h",
+        "arch/x64/sysroot/include/bits/x86_64/signal.h",
+        "arch/x64/sysroot/include/bits/x86_64/stat.h",
+        "arch/x64/sysroot/include/byteswap.h",
+        "arch/x64/sysroot/include/complex.h",
+        "arch/x64/sysroot/include/cpio.h",
+        "arch/x64/sysroot/include/ctype.h",
+        "arch/x64/sysroot/include/dirent.h",
+        "arch/x64/sysroot/include/dlfcn.h",
+        "arch/x64/sysroot/include/elf.h",
+        "arch/x64/sysroot/include/endian.h",
+        "arch/x64/sysroot/include/err.h",
+        "arch/x64/sysroot/include/errno.h",
+        "arch/x64/sysroot/include/fcntl.h",
+        "arch/x64/sysroot/include/features.h",
+        "arch/x64/sysroot/include/fenv.h",
+        "arch/x64/sysroot/include/fmtmsg.h",
+        "arch/x64/sysroot/include/fnmatch.h",
+        "arch/x64/sysroot/include/getopt.h",
+        "arch/x64/sysroot/include/glob.h",
+        "arch/x64/sysroot/include/grp.h",
+        "arch/x64/sysroot/include/iconv.h",
+        "arch/x64/sysroot/include/ifaddrs.h",
+        "arch/x64/sysroot/include/inttypes.h",
+        "arch/x64/sysroot/include/iso646.h",
+        "arch/x64/sysroot/include/langinfo.h",
+        "arch/x64/sysroot/include/libgen.h",
+        "arch/x64/sysroot/include/limits.h",
+        "arch/x64/sysroot/include/link.h",
+        "arch/x64/sysroot/include/locale.h",
+        "arch/x64/sysroot/include/malloc.h",
+        "arch/x64/sysroot/include/math.h",
+        "arch/x64/sysroot/include/memory.h",
+        "arch/x64/sysroot/include/monetary.h",
+        "arch/x64/sysroot/include/net/ethernet.h",
+        "arch/x64/sysroot/include/net/if.h",
+        "arch/x64/sysroot/include/net/if_arp.h",
+        "arch/x64/sysroot/include/net/route.h",
+        "arch/x64/sysroot/include/netdb.h",
+        "arch/x64/sysroot/include/netinet/ether.h",
+        "arch/x64/sysroot/include/netinet/icmp6.h",
+        "arch/x64/sysroot/include/netinet/if_ether.h",
+        "arch/x64/sysroot/include/netinet/igmp.h",
+        "arch/x64/sysroot/include/netinet/in.h",
+        "arch/x64/sysroot/include/netinet/in_systm.h",
+        "arch/x64/sysroot/include/netinet/ip.h",
+        "arch/x64/sysroot/include/netinet/ip6.h",
+        "arch/x64/sysroot/include/netinet/ip_icmp.h",
+        "arch/x64/sysroot/include/netinet/tcp.h",
+        "arch/x64/sysroot/include/netinet/udp.h",
+        "arch/x64/sysroot/include/netpacket/packet.h",
+        "arch/x64/sysroot/include/nl_types.h",
+        "arch/x64/sysroot/include/paths.h",
+        "arch/x64/sysroot/include/poll.h",
+        "arch/x64/sysroot/include/pthread.h",
+        "arch/x64/sysroot/include/pwd.h",
+        "arch/x64/sysroot/include/regex.h",
+        "arch/x64/sysroot/include/resolv.h",
+        "arch/x64/sysroot/include/sched.h",
+        "arch/x64/sysroot/include/search.h",
+        "arch/x64/sysroot/include/semaphore.h",
+        "arch/x64/sysroot/include/setjmp.h",
+        "arch/x64/sysroot/include/signal.h",
+        "arch/x64/sysroot/include/spawn.h",
+        "arch/x64/sysroot/include/stdio.h",
+        "arch/x64/sysroot/include/stdlib.h",
+        "arch/x64/sysroot/include/string.h",
+        "arch/x64/sysroot/include/strings.h",
+        "arch/x64/sysroot/include/stropts.h",
+        "arch/x64/sysroot/include/sys/acct.h",
+        "arch/x64/sysroot/include/sys/auxv.h",
+        "arch/x64/sysroot/include/sys/dir.h",
+        "arch/x64/sysroot/include/sys/errno.h",
+        "arch/x64/sysroot/include/sys/eventfd.h",
+        "arch/x64/sysroot/include/sys/fcntl.h",
+        "arch/x64/sysroot/include/sys/file.h",
+        "arch/x64/sysroot/include/sys/fsuid.h",
+        "arch/x64/sysroot/include/sys/io.h",
+        "arch/x64/sysroot/include/sys/ioctl.h",
+        "arch/x64/sysroot/include/sys/ipc.h",
+        "arch/x64/sysroot/include/sys/klog.h",
+        "arch/x64/sysroot/include/sys/mman.h",
+        "arch/x64/sysroot/include/sys/mount.h",
+        "arch/x64/sysroot/include/sys/msg.h",
+        "arch/x64/sysroot/include/sys/mtio.h",
+        "arch/x64/sysroot/include/sys/param.h",
+        "arch/x64/sysroot/include/sys/personality.h",
+        "arch/x64/sysroot/include/sys/poll.h",
+        "arch/x64/sysroot/include/sys/quota.h",
+        "arch/x64/sysroot/include/sys/random.h",
+        "arch/x64/sysroot/include/sys/reboot.h",
+        "arch/x64/sysroot/include/sys/reg.h",
+        "arch/x64/sysroot/include/sys/select.h",
+        "arch/x64/sysroot/include/sys/sem.h",
+        "arch/x64/sysroot/include/sys/shm.h",
+        "arch/x64/sysroot/include/sys/signal.h",
+        "arch/x64/sysroot/include/sys/signalfd.h",
+        "arch/x64/sysroot/include/sys/socket.h",
+        "arch/x64/sysroot/include/sys/stat.h",
+        "arch/x64/sysroot/include/sys/statfs.h",
+        "arch/x64/sysroot/include/sys/statvfs.h",
+        "arch/x64/sysroot/include/sys/stropts.h",
+        "arch/x64/sysroot/include/sys/swap.h",
+        "arch/x64/sysroot/include/sys/syslog.h",
+        "arch/x64/sysroot/include/sys/termios.h",
+        "arch/x64/sysroot/include/sys/time.h",
+        "arch/x64/sysroot/include/sys/timeb.h",
+        "arch/x64/sysroot/include/sys/timerfd.h",
+        "arch/x64/sysroot/include/sys/times.h",
+        "arch/x64/sysroot/include/sys/timex.h",
+        "arch/x64/sysroot/include/sys/ttydefaults.h",
+        "arch/x64/sysroot/include/sys/types.h",
+        "arch/x64/sysroot/include/sys/ucontext.h",
+        "arch/x64/sysroot/include/sys/uio.h",
+        "arch/x64/sysroot/include/sys/un.h",
+        "arch/x64/sysroot/include/sys/utsname.h",
+        "arch/x64/sysroot/include/sys/vfs.h",
+        "arch/x64/sysroot/include/sys/wait.h",
+        "arch/x64/sysroot/include/sysexits.h",
+        "arch/x64/sysroot/include/syslog.h",
+        "arch/x64/sysroot/include/tar.h",
+        "arch/x64/sysroot/include/termios.h",
+        "arch/x64/sysroot/include/threads.h",
+        "arch/x64/sysroot/include/time.h",
+        "arch/x64/sysroot/include/uchar.h",
+        "arch/x64/sysroot/include/ucontext.h",
+        "arch/x64/sysroot/include/unistd.h",
+        "arch/x64/sysroot/include/utime.h",
+        "arch/x64/sysroot/include/values.h",
+        "arch/x64/sysroot/include/wait.h",
+        "arch/x64/sysroot/include/wchar.h",
+        "arch/x64/sysroot/include/wctype.h",
+        "arch/x64/sysroot/include/wordexp.h",
+        "arch/x64/sysroot/include/zircon/dlfcn.h",
+        "arch/x64/sysroot/include/zircon/lookup.h",
+        "arch/x64/sysroot/include/zircon/sanitizer.h",
+        "arch/x64/sysroot/include/zircon/threads.h",
+        "arch/x64/sysroot/include/zircon/utc.h",
+        "arch/x64/sysroot/include/zircon/syscalls/internal/cdecls.inc",
+        "arch/x64/sysroot/include/zircon/status.h",
+        "arch/x64/sysroot/include/zircon/exception.h"
+      ],
+      "include_dir": "arch/x64/sysroot/include",
       "link_libs": [
-        "arch/x64/sysroot/lib/Scrt1.o", 
-        "arch/x64/sysroot/lib/libc.so", 
-        "arch/x64/sysroot/lib/libdl.so", 
-        "arch/x64/sysroot/lib/libm.so", 
-        "arch/x64/sysroot/lib/libpthread.so", 
-        "arch/x64/sysroot/lib/librt.so", 
+        "arch/x64/sysroot/lib/libc.so",
+        "arch/x64/sysroot/lib/libdl.so",
+        "arch/x64/sysroot/lib/libm.so",
+        "arch/x64/sysroot/lib/libpthread.so",
+        "arch/x64/sysroot/lib/librt.so",
+        "arch/x64/sysroot/lib/Scrt1.o",
         "arch/x64/sysroot/lib/libzircon.so"
-      ], 
+      ],
       "root": "arch/x64/sysroot"
     }
   }
diff --git a/pkg/trace-engine/meta.json b/pkg/trace-engine/meta.json
deleted file mode 100644
index 8856e4e..0000000
--- a/pkg/trace-engine/meta.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/e7/2a14a0b645f41576a9d25e89239df92cd488d0.debug", 
-      "dist": "arch/arm64/dist/libtrace-engine.so", 
-      "link": "arch/arm64/lib/libtrace-engine.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/db/dab49d734285639cadc0b2eb151b302ecb2edf.debug", 
-      "dist": "arch/x64/dist/libtrace-engine.so", 
-      "link": "arch/x64/lib/libtrace-engine.so"
-    }
-  }, 
-  "deps": [], 
-  "format": "shared", 
-  "headers": [], 
-  "include_dir": "pkg/trace-engine/include", 
-  "name": "trace-engine", 
-  "root": "pkg/trace-engine", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/vulkan/meta.json b/pkg/vulkan/meta.json
deleted file mode 100644
index 440ecf0..0000000
--- a/pkg/vulkan/meta.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "binaries": {
-    "arm64": {
-      "debug": ".build-id/13/1673e529cae5f1.debug", 
-      "dist": "arch/arm64/dist/libvulkan.so", 
-      "link": "arch/arm64/lib/libvulkan.so"
-    }, 
-    "x64": {
-      "debug": ".build-id/72/f8518d550ec0aa.debug", 
-      "dist": "arch/x64/dist/libvulkan.so", 
-      "link": "arch/x64/lib/libvulkan.so"
-    }
-  }, 
-  "deps": [
-    "fdio", 
-    "trace-engine"
-  ], 
-  "format": "shared", 
-  "headers": [], 
-  "include_dir": "pkg/vulkan/include", 
-  "name": "vulkan", 
-  "root": "pkg/vulkan", 
-  "type": "cc_prebuilt_library"
-}
\ No newline at end of file
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_core_validation.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_core_validation.json
deleted file mode 100644
index 94887e6..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_core_validation.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-    "file_format_version" : "1.1.0",
-    "layer" : {
-        "name": "VK_LAYER_LUNARG_core_validation",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_core_validation.so",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "LunarG Validation Layer",
-        "instance_extensions": [
-             {
-                 "name": "VK_EXT_debug_report",
-                 "spec_version": "6"
-             }
-         ],
-        "device_extensions": [
-             {
-                 "name": "VK_EXT_debug_marker",
-                 "spec_version": "4",
-                 "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
-                        "vkDebugMarkerSetObjectNameEXT",
-                        "vkCmdDebugMarkerBeginEXT",
-                        "vkCmdDebugMarkerEndEXT",
-                        "vkCmdDebugMarkerInsertEXT"
-                       ]
-             },
-             {
-                 "name": "VK_EXT_validation_cache",
-                 "spec_version": "1",
-                 "entrypoints": ["vkCreateValidationCacheEXT",
-                         "vkDestroyValidationCacheEXT",
-                         "vkGetValidationCacheDataEXT",
-                         "vkMergeValidationCachesEXT"
-                        ]
-             }
-         ]
-    }
-}
-
-
-
-
-
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_image_pipe_swapchain.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_image_pipe_swapchain.json
deleted file mode 100644
index 7c6ebe6..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_image_pipe_swapchain.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "file_format_version" : "1.0.0",
-    "layer" : {
-        "name": "VK_LAYER_GOOGLE_image_pipe_swapchain",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_image_pipe_swapchain.so",
-        "api_version": "1.0.38",
-        "implementation_version": "1",
-        "description": "Image Pipe Swapchain",
-        "disable_environment": {
-            "DISABLE_IMAGEPIPE_SWAPCHAIN_LAYER": "1"
-        },
-        "instance_extensions": [
-            { "name": "VK_KHR_surface", "spec_version": "25" },
-            { "name": "VK_KHR_magma_surface", "spec_version": "1" }
-        ],
-        "device_extensions": [
-            { "name": "VK_KHR_swapchain", "spec_version": "68" }
-        ]
-    }
-}
\ No newline at end of file
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_object_tracker.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_object_tracker.json
deleted file mode 100644
index 3da8c58..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_object_tracker.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-    "file_format_version" : "1.1.0",
-    "layer" : {
-        "name": "VK_LAYER_LUNARG_object_tracker",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_object_tracker.so",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "LunarG Validation Layer",
-        "instance_extensions": [
-             {
-                 "name": "VK_EXT_debug_report",
-                 "spec_version": "6"
-             }
-         ],
-        "device_extensions": [
-             {
-                 "name": "VK_EXT_debug_marker",
-                 "spec_version": "4",
-                 "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
-                        "vkDebugMarkerSetObjectNameEXT",
-                        "vkCmdDebugMarkerBeginEXT",
-                        "vkCmdDebugMarkerEndEXT",
-                        "vkCmdDebugMarkerInsertEXT"
-                       ]
-             }
-         ]
-    }
-}
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_parameter_validation.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_parameter_validation.json
deleted file mode 100644
index 83018ed..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_parameter_validation.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-    "file_format_version" : "1.1.0",
-    "layer" : {
-        "name": "VK_LAYER_LUNARG_parameter_validation",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_parameter_validation.so",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "LunarG Validation Layer",
-        "instance_extensions": [
-             {
-                 "name": "VK_EXT_debug_report",
-                 "spec_version": "6"
-             }
-         ],
-        "device_extensions": [
-             {
-                 "name": "VK_EXT_debug_marker",
-                 "spec_version": "4",
-                 "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
-                        "vkDebugMarkerSetObjectNameEXT",
-                        "vkCmdDebugMarkerBeginEXT",
-                        "vkCmdDebugMarkerEndEXT",
-                        "vkCmdDebugMarkerInsertEXT"
-                       ]
-             }
-         ]
-    }
-}
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_standard_validation.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_standard_validation.json
deleted file mode 100644
index ccf4189..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_standard_validation.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "file_format_version": "1.1.1",
-    "layer": {
-        "name": "VK_LAYER_LUNARG_standard_validation",
-        "type": "GLOBAL",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "LunarG Standard Validation",
-        "component_layers": [
-            "VK_LAYER_GOOGLE_threading",
-            "VK_LAYER_LUNARG_parameter_validation",
-            "VK_LAYER_LUNARG_object_tracker",
-            "VK_LAYER_LUNARG_core_validation",
-            "VK_LAYER_GOOGLE_unique_objects"
-        ]
-    }
-}
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_threading.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_threading.json
deleted file mode 100644
index 2e162b2..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_threading.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "file_format_version" : "1.1.0",
-    "layer" : {
-        "name": "VK_LAYER_GOOGLE_threading",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_threading.so",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "Google Validation Layer",
-        "instance_extensions": [
-             {
-                 "name": "VK_EXT_debug_report",
-                 "spec_version": "6"
-             }
-         ]
-    }
-}
diff --git a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_unique_objects.json b/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_unique_objects.json
deleted file mode 100644
index 82ad4e7..0000000
--- a/pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_unique_objects.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "file_format_version" : "1.1.0",
-    "layer" : {
-        "name": "VK_LAYER_GOOGLE_unique_objects",
-        "type": "GLOBAL",
-        "library_path": "libVkLayer_unique_objects.so",
-        "api_version": "1.0.68",
-        "implementation_version": "1",
-        "description": "Google Validation Layer"
-    }
-}
diff --git a/pkg/vulkan_layers/meta.json b/pkg/vulkan_layers/meta.json
deleted file mode 100644
index f5355b7..0000000
--- a/pkg/vulkan_layers/meta.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "binaries": {
-    "arm64": [
-      "arch/arm64/dist/libVkLayer_core_validation.so", 
-      "arch/arm64/dist/libVkLayer_threading.so", 
-      "arch/arm64/dist/libVkLayer_unique_objects.so", 
-      "arch/arm64/dist/libVkLayer_parameter_validation.so", 
-      "arch/arm64/dist/libVkLayer_object_tracker.so", 
-      "arch/arm64/dist/libVkLayer_image_pipe_swapchain.so"
-    ], 
-    "x64": [
-      "arch/x64/dist/libVkLayer_core_validation.so", 
-      "arch/x64/dist/libVkLayer_threading.so", 
-      "arch/x64/dist/libVkLayer_unique_objects.so", 
-      "arch/x64/dist/libVkLayer_parameter_validation.so", 
-      "arch/x64/dist/libVkLayer_object_tracker.so", 
-      "arch/x64/dist/libVkLayer_image_pipe_swapchain.so"
-    ]
-  }, 
-  "name": "vulkan_layers", 
-  "resources": [
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_core_validation.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_parameter_validation.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_threading.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_unique_objects.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_object_tracker.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_standard_validation.json", 
-    "pkg/vulkan_layers/data/vulkan/explicit_layer.d/VkLayer_image_pipe_swapchain.json"
-  ], 
-  "root": "pkg/vulkan_layers", 
-  "type": "loadable_module"
-}
\ No newline at end of file
diff --git a/pkg/zx/bti.cc b/pkg/zx/bti.cc
new file mode 100644
index 0000000..bd53051
--- /dev/null
+++ b/pkg/zx/bti.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include <lib/zx/bti.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t bti::create(const iommu& iommu, uint32_t options, uint64_t bti_id, bti* result) {
+  return zx_bti_create(iommu.get(), options, bti_id, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/bti.cpp b/pkg/zx/bti.cpp
deleted file mode 100644
index 436177d..0000000
--- a/pkg/zx/bti.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include <lib/zx/bti.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t bti::create(const iommu& iommu, uint32_t options, uint64_t bti_id, bti* result) {
-    return zx_bti_create(iommu.get(), options, bti_id, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/channel.cc b/pkg/zx/channel.cc
new file mode 100644
index 0000000..39b4da6
--- /dev/null
+++ b/pkg/zx/channel.cc
@@ -0,0 +1,23 @@
+// 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.
+
+#include <lib/zx/channel.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t channel::create(uint32_t flags, channel* endpoint0, channel* endpoint1) {
+  // Ensure aliasing of both out parameters to the same container
+  // has a well-defined result, and does not leak.
+  channel h0;
+  channel h1;
+  zx_status_t status =
+      zx_channel_create(flags, h0.reset_and_get_address(), h1.reset_and_get_address());
+  endpoint0->reset(h0.release());
+  endpoint1->reset(h1.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/channel.cpp b/pkg/zx/channel.cpp
deleted file mode 100644
index bbf84bb..0000000
--- a/pkg/zx/channel.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-#include <lib/zx/channel.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t channel::create(uint32_t flags, channel* endpoint0,
-                            channel* endpoint1) {
-    // Ensure aliasing of both out parameters to the same container
-    // has a well-defined result, and does not leak.
-    channel h0;
-    channel h1;
-    zx_status_t status = zx_channel_create(flags,
-                                           h0.reset_and_get_address(),
-                                           h1.reset_and_get_address());
-    endpoint0->reset(h0.release());
-    endpoint1->reset(h1.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/debuglog.cc b/pkg/zx/debuglog.cc
new file mode 100644
index 0000000..030c012
--- /dev/null
+++ b/pkg/zx/debuglog.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include <lib/zx/debuglog.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t debuglog::create(const resource& resource, uint32_t options, debuglog* result) {
+  return zx_debuglog_create(resource.get(), options, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/debuglog.cpp b/pkg/zx/debuglog.cpp
deleted file mode 100644
index 05ee86d..0000000
--- a/pkg/zx/debuglog.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include <lib/zx/debuglog.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t debuglog::create(const resource& resource, uint32_t options, debuglog* result) {
-    return zx_debuglog_create(resource.get(), options, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/event.cc b/pkg/zx/event.cc
new file mode 100644
index 0000000..538aa99
--- /dev/null
+++ b/pkg/zx/event.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include <lib/zx/event.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t event::create(uint32_t options, event* result) {
+  return zx_event_create(options, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/event.cpp b/pkg/zx/event.cpp
deleted file mode 100644
index 4539a68..0000000
--- a/pkg/zx/event.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include <lib/zx/event.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t event::create(uint32_t options, event* result) {
-    return zx_event_create(options, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/eventpair.cc b/pkg/zx/eventpair.cc
new file mode 100644
index 0000000..480ea07
--- /dev/null
+++ b/pkg/zx/eventpair.cc
@@ -0,0 +1,23 @@
+// 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.
+
+#include <lib/zx/eventpair.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t eventpair::create(uint32_t flags, eventpair* endpoint0, eventpair* endpoint1) {
+  // Ensure aliasing of both out parameters to the same container
+  // has a well-defined result, and does not leak.
+  eventpair h0;
+  eventpair h1;
+  zx_status_t status =
+      zx_eventpair_create(flags, h0.reset_and_get_address(), h1.reset_and_get_address());
+  endpoint0->reset(h0.release());
+  endpoint1->reset(h1.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/eventpair.cpp b/pkg/zx/eventpair.cpp
deleted file mode 100644
index f561e14..0000000
--- a/pkg/zx/eventpair.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-#include <lib/zx/eventpair.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t eventpair::create(uint32_t flags, eventpair* endpoint0,
-                              eventpair* endpoint1) {
-    // Ensure aliasing of both out parameters to the same container
-    // has a well-defined result, and does not leak.
-    eventpair h0;
-    eventpair h1;
-    zx_status_t status = zx_eventpair_create(
-        flags, h0.reset_and_get_address(),
-        h1.reset_and_get_address());
-    endpoint0->reset(h0.release());
-    endpoint1->reset(h1.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/fifo.cc b/pkg/zx/fifo.cc
new file mode 100644
index 0000000..ea0e7d1
--- /dev/null
+++ b/pkg/zx/fifo.cc
@@ -0,0 +1,24 @@
+// 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.
+
+#include <lib/zx/fifo.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t fifo::create(uint32_t elem_count, uint32_t elem_size, uint32_t options, fifo* out0,
+                         fifo* out1) {
+  // Ensure aliasing of both out parameters to the same container
+  // has a well-defined result, and does not leak.
+  fifo h0;
+  fifo h1;
+  zx_status_t status = zx_fifo_create(elem_count, elem_size, options, h0.reset_and_get_address(),
+                                      h1.reset_and_get_address());
+  out0->reset(h0.release());
+  out1->reset(h1.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/fifo.cpp b/pkg/zx/fifo.cpp
deleted file mode 100644
index 27f965f..0000000
--- a/pkg/zx/fifo.cpp
+++ /dev/null
@@ -1,25 +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.
-
-#include <lib/zx/fifo.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t fifo::create(uint32_t elem_count, uint32_t elem_size,
-                         uint32_t options, fifo* out0, fifo* out1) {
-    // Ensure aliasing of both out parameters to the same container
-    // has a well-defined result, and does not leak.
-    fifo h0;
-    fifo h1;
-    zx_status_t status = zx_fifo_create(
-        elem_count, elem_size, options, h0.reset_and_get_address(),
-        h1.reset_and_get_address());
-    out0->reset(h0.release());
-    out1->reset(h1.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/guest.cc b/pkg/zx/guest.cc
new file mode 100644
index 0000000..b78effe
--- /dev/null
+++ b/pkg/zx/guest.cc
@@ -0,0 +1,20 @@
+// 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.
+
+#include <lib/zx/guest.h>
+
+#include <zircon/syscalls.h>
+
+#include <lib/zx/vmar.h>
+
+namespace zx {
+
+zx_status_t guest::create(const resource& resource, uint32_t options, guest* guest, vmar* vmar) {
+  // Assume |resource|, |guest| and |vmar| must refer to different containers,
+  // due to strict aliasing.
+  return zx_guest_create(resource.get(), options, guest->reset_and_get_address(),
+                         vmar->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/guest.cpp b/pkg/zx/guest.cpp
deleted file mode 100644
index f3d6029..0000000
--- a/pkg/zx/guest.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-#include <lib/zx/guest.h>
-
-#include <zircon/syscalls.h>
-
-#include <lib/zx/vmar.h>
-
-namespace zx {
-
-zx_status_t guest::create(const resource& resource, uint32_t options,
-                          guest* guest, vmar* vmar) {
-    // Assume |resource|, |guest| and |vmar| must refer to different containers,
-    // due to strict aliasing.
-    return zx_guest_create(
-        resource.get(), options, guest->reset_and_get_address(),
-        vmar->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/include/lib/zx/bti.h b/pkg/zx/include/lib/zx/bti.h
index 0a66716..4ce438b 100644
--- a/pkg/zx/include/lib/zx/bti.h
+++ b/pkg/zx/include/lib/zx/bti.h
@@ -13,36 +13,36 @@
 
 namespace zx {
 
-class bti : public object<bti> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_BTI;
+class bti final : public object<bti> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_BTI;
 
-    constexpr bti() = default;
+  constexpr bti() = default;
 
-    explicit bti(zx_handle_t value) : object(value) {}
+  explicit bti(zx_handle_t value) : object(value) {}
 
-    explicit bti(handle&& h) : object(h.release()) {}
+  explicit bti(handle&& h) : object(h.release()) {}
 
-    bti(bti&& other) : object(other.release()) {}
+  bti(bti&& other) : object(other.release()) {}
 
-    bti& operator=(bti&& other) {
-        reset(other.release());
-        return *this;
-    }
+  bti& operator=(bti&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const iommu& iommu, uint32_t options, uint64_t bti_id, bti* result);
+  static zx_status_t create(const iommu& iommu, uint32_t options, uint64_t bti_id, bti* result);
 
-    zx_status_t pin(uint32_t options, const vmo& vmo, uint64_t offset, uint64_t size,
-                    zx_paddr_t* addrs, size_t addrs_count, pmt* pmt) const {
-        return zx_bti_pin(get(), options, vmo.get(), offset, size, addrs, addrs_count,
-                          pmt->reset_and_get_address());
-    }
+  zx_status_t pin(uint32_t options, const vmo& vmo, uint64_t offset, uint64_t size,
+                  zx_paddr_t* addrs, size_t addrs_count, pmt* pmt) const {
+    return zx_bti_pin(get(), options, vmo.get(), offset, size, addrs, addrs_count,
+                      pmt->reset_and_get_address());
+  }
 
-    zx_status_t release_quarantine() const { return zx_bti_release_quarantine(get()); }
+  zx_status_t release_quarantine() const { return zx_bti_release_quarantine(get()); }
 };
 
 using unowned_bti = unowned<bti>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_BTI_H_
diff --git a/pkg/zx/include/lib/zx/channel.h b/pkg/zx/include/lib/zx/channel.h
index bd28ca1..c5c7283 100644
--- a/pkg/zx/include/lib/zx/channel.h
+++ b/pkg/zx/include/lib/zx/channel.h
@@ -11,56 +11,61 @@
 
 namespace zx {
 
-class channel : public object<channel> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_CHANNEL;
+class channel final : public object<channel> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_CHANNEL;
 
-    constexpr channel() = default;
+  constexpr channel() = default;
 
-    explicit channel(zx_handle_t value) : object(value) {}
+  explicit channel(zx_handle_t value) : object(value) {}
 
-    explicit channel(handle&& h) : object(h.release()) {}
+  explicit channel(handle&& h) : object(h.release()) {}
 
-    channel(channel&& other) : object(other.release()) {}
+  channel(channel&& other) : object(other.release()) {}
 
-    channel& operator=(channel&& other) {
-        reset(other.release());
-        return *this;
-    }
+  channel& operator=(channel&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t flags, channel* endpoint0,
-                              channel* endpoint1);
+  static zx_status_t create(uint32_t flags, channel* endpoint0, channel* endpoint1);
 
-    zx_status_t read(uint32_t flags, void* bytes, uint32_t num_bytes,
-                     uint32_t* actual_bytes, zx_handle_t* handles,
-                     uint32_t num_handles, uint32_t* actual_handles) const {
-        return zx_channel_read(get(), flags, bytes, handles, num_bytes,
-                               num_handles, actual_bytes, actual_handles);
-    }
+  zx_status_t read(uint32_t flags, void* bytes, zx_handle_t* handles, uint32_t num_bytes,
+                   uint32_t num_handles, uint32_t* actual_bytes, uint32_t* actual_handles) const {
+    return zx_channel_read(get(), flags, bytes, handles, num_bytes, num_handles, actual_bytes,
+                           actual_handles);
+  }
 
-    zx_status_t read_etc(uint32_t flags, void* bytes, uint32_t num_bytes,
-                         uint32_t* actual_bytes, zx_handle_info_t* handles,
-                         uint32_t num_handles, uint32_t* actual_handles) const {
-        return zx_channel_read_etc(get(), flags, bytes, handles, num_bytes,
-                                   num_handles, actual_bytes, actual_handles);
-    }
-
-    zx_status_t write(uint32_t flags, const void* bytes, uint32_t num_bytes,
-                      const zx_handle_t* handles, uint32_t num_handles) const {
-        return zx_channel_write(get(), flags, bytes, num_bytes, handles,
-                                num_handles);
-    }
-
-    zx_status_t call(uint32_t flags, zx::time deadline,
-                     const zx_channel_call_args_t* args,
-                     uint32_t* actual_bytes, uint32_t* actual_handles) const {
-        return zx_channel_call(get(), flags, deadline.get(), args, actual_bytes,
+  zx_status_t read_etc(uint32_t flags, void* bytes, zx_handle_info_t* handles, uint32_t num_bytes,
+                       uint32_t num_handles, uint32_t* actual_bytes,
+                       uint32_t* actual_handles) const {
+    return zx_channel_read_etc(get(), flags, bytes, handles, num_bytes, num_handles, actual_bytes,
                                actual_handles);
-    }
+  }
+
+  zx_status_t write(uint32_t flags, const void* bytes, uint32_t num_bytes,
+                    const zx_handle_t* handles, uint32_t num_handles) const {
+    return zx_channel_write(get(), flags, bytes, num_bytes, handles, num_handles);
+  }
+
+  zx_status_t write_etc(uint32_t flags, const void* bytes, uint32_t num_bytes,
+                        zx_handle_disposition_t* handles, uint32_t num_handles) {
+    return zx_channel_write_etc(get(), flags, bytes, num_bytes, handles, num_handles);
+  }
+
+  zx_status_t call(uint32_t flags, zx::time deadline, const zx_channel_call_args_t* args,
+                   uint32_t* actual_bytes, uint32_t* actual_handles) const {
+    return zx_channel_call(get(), flags, deadline.get(), args, actual_bytes, actual_handles);
+  }
+
+  zx_status_t call_etc(uint32_t flags, zx::time deadline, zx_channel_call_etc_args_t* args,
+                       uint32_t* actual_bytes, uint32_t* actual_handles) const {
+    return zx_channel_call_etc(get(), flags, deadline.get(), args, actual_bytes, actual_handles);
+  }
 };
 
 using unowned_channel = unowned<channel>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_CHANNEL_H_
diff --git a/pkg/zx/include/lib/zx/clock.h b/pkg/zx/include/lib/zx/clock.h
new file mode 100644
index 0000000..39d1b80
--- /dev/null
+++ b/pkg/zx/include/lib/zx/clock.h
@@ -0,0 +1,102 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ZX_CLOCK_H_
+#define LIB_ZX_CLOCK_H_
+
+#include <lib/zx/handle.h>
+#include <lib/zx/object.h>
+#include <lib/zx/time.h>
+#include <zircon/syscalls/clock.h>
+
+namespace zx {
+
+class clock final : public object<clock> {
+ public:
+  class update_args {
+   public:
+    constexpr update_args() = default;
+
+    update_args& reset() {
+      options_ = 0;
+      return *this;
+    }
+
+    update_args& set_value(zx::time value) {
+      args_.value = value.get();
+      options_ |= ZX_CLOCK_UPDATE_OPTION_VALUE_VALID;
+      return *this;
+    }
+
+    update_args& set_rate_adjust(int32_t rate) {
+      args_.rate_adjust = rate;
+      options_ |= ZX_CLOCK_UPDATE_OPTION_RATE_ADJUST_VALID;
+      return *this;
+    }
+
+    update_args& set_error_bound(uint64_t error_bound) {
+      args_.error_bound = error_bound;
+      options_ |= ZX_CLOCK_UPDATE_OPTION_ERROR_BOUND_VALID;
+      return *this;
+    }
+
+   private:
+    friend class ::zx::clock;
+    zx_clock_update_args_v1_t args_{};
+    uint64_t options_ = 0;
+  };
+
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_CLOCK;
+
+  // TODO(johngro) : remove this alias once we remove the static get method from
+  // this class.  This static get method will no longer be needed once UTC
+  // leaves the kernel, and "thread" time becomes fetch-able only from a
+  // get_info request.  At that point in time, zx_clock_get will disappear and
+  // the only kernel provided sources of time will be get_monotonic and ticks.
+  zx_handle_t get_handle() const { return object_base::get(); }
+
+  constexpr clock() = default;
+
+  explicit clock(zx_handle_t value) : object(value) {}
+
+  explicit clock(handle&& h) : object(h.release()) {}
+
+  clock(clock&& other) : object(other.release()) {}
+
+  clock& operator=(clock&& other) {
+    reset(other.release());
+    return *this;
+  }
+
+  static zx_status_t create(uint64_t options, const zx_clock_create_args_v1* args, clock* result) {
+    options = (options & ~ZX_CLOCK_ARGS_VERSION_MASK) |
+              ((args != nullptr) ? ZX_CLOCK_ARGS_VERSION(1) : 0);
+
+    return zx_clock_create(options, args, result->reset_and_get_address());
+  }
+
+  zx_status_t read(zx_time_t* now_out) const { return zx_clock_read(value_, now_out); }
+
+  zx_status_t get_details(zx_clock_details_v1_t* details_out) const {
+    return zx_clock_get_details(value_, ZX_CLOCK_ARGS_VERSION(1), details_out);
+  }
+
+  zx_status_t update(const update_args& args) const {
+    uint64_t options = args.options_ | ZX_CLOCK_ARGS_VERSION(1);
+    return zx_clock_update(value_, options, &args.args_);
+  }
+
+  template <zx_clock_t kClockId>
+  static zx_status_t get(basic_time<kClockId>* result) {
+    return zx_clock_get(kClockId, result->get_address());
+  }
+
+  static time get_monotonic() { return time(zx_clock_get_monotonic()); }
+};
+
+using unowned_clock = unowned<clock>;
+
+}  // namespace zx
+
+#endif  // LIB_ZX_CLOCK_H_
diff --git a/pkg/zx/include/lib/zx/debuglog.h b/pkg/zx/include/lib/zx/debuglog.h
index 1b00042..2e7cf41 100644
--- a/pkg/zx/include/lib/zx/debuglog.h
+++ b/pkg/zx/include/lib/zx/debuglog.h
@@ -11,36 +11,36 @@
 
 namespace zx {
 
-class debuglog : public object<debuglog> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_LOG;
+class debuglog final : public object<debuglog> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_LOG;
 
-    constexpr debuglog() = default;
+  constexpr debuglog() = default;
 
-    explicit debuglog(zx_handle_t value) : object(value) {}
+  explicit debuglog(zx_handle_t value) : object(value) {}
 
-    explicit debuglog(handle&& h) : object(h.release()) {}
+  explicit debuglog(handle&& h) : object(h.release()) {}
 
-    debuglog(debuglog&& other) : object(other.release()) {}
+  debuglog(debuglog&& other) : object(other.release()) {}
 
-    debuglog& operator=(debuglog&& other) {
-        reset(other.release());
-        return *this;
-    }
+  debuglog& operator=(debuglog&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& resource, uint32_t options, debuglog* result);
+  static zx_status_t create(const resource& resource, uint32_t options, debuglog* result);
 
-    zx_status_t write(uint32_t options, const void* buffer, size_t buffer_size) const {
-        return zx_debuglog_write(get(), options, buffer, buffer_size);
-    }
+  zx_status_t write(uint32_t options, const void* buffer, size_t buffer_size) const {
+    return zx_debuglog_write(get(), options, buffer, buffer_size);
+  }
 
-    zx_status_t read(uint32_t options, void* buffer, size_t buffer_size) const {
-        return zx_debuglog_read(get(), options, buffer, buffer_size);
-    }
+  zx_status_t read(uint32_t options, void* buffer, size_t buffer_size) const {
+    return zx_debuglog_read(get(), options, buffer, buffer_size);
+  }
 };
 
 using unowned_debuglog = unowned<debuglog>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_DEBUGLOG_H_
diff --git a/pkg/zx/include/lib/zx/event.h b/pkg/zx/include/lib/zx/event.h
index 590c4c1..a9d62af 100644
--- a/pkg/zx/include/lib/zx/event.h
+++ b/pkg/zx/include/lib/zx/event.h
@@ -10,28 +10,28 @@
 
 namespace zx {
 
-class event : public object<event> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_EVENT;
+class event final : public object<event> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_EVENT;
 
-    constexpr event() = default;
+  constexpr event() = default;
 
-    explicit event(zx_handle_t value) : object(value) {}
+  explicit event(zx_handle_t value) : object(value) {}
 
-    explicit event(handle&& h) : object(h.release()) {}
+  explicit event(handle&& h) : object(h.release()) {}
 
-    event(event&& other) : object(other.release()) {}
+  event(event&& other) : object(other.release()) {}
 
-    event& operator=(event&& other) {
-        reset(other.release());
-        return *this;
-    }
+  event& operator=(event&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t options, event* result);
+  static zx_status_t create(uint32_t options, event* result);
 };
 
 using unowned_event = unowned<event>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_EVENT_H_
diff --git a/pkg/zx/include/lib/zx/eventpair.h b/pkg/zx/include/lib/zx/eventpair.h
index 56d094a..a46a6b0 100644
--- a/pkg/zx/include/lib/zx/eventpair.h
+++ b/pkg/zx/include/lib/zx/eventpair.h
@@ -10,29 +10,28 @@
 
 namespace zx {
 
-class eventpair : public object<eventpair> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_EVENTPAIR;
+class eventpair final : public object<eventpair> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_EVENTPAIR;
 
-    constexpr eventpair() = default;
+  constexpr eventpair() = default;
 
-    explicit eventpair(zx_handle_t value) : object(value) {}
+  explicit eventpair(zx_handle_t value) : object(value) {}
 
-    explicit eventpair(handle&& h) : object(h.release()) {}
+  explicit eventpair(handle&& h) : object(h.release()) {}
 
-    eventpair(eventpair&& other) : object(other.release()) {}
+  eventpair(eventpair&& other) : object(other.release()) {}
 
-    eventpair& operator=(eventpair&& other) {
-        reset(other.release());
-        return *this;
-    }
+  eventpair& operator=(eventpair&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t options, eventpair* endpoint0,
-                              eventpair* endpoint1);
+  static zx_status_t create(uint32_t options, eventpair* endpoint0, eventpair* endpoint1);
 };
 
 using unowned_eventpair = unowned<eventpair>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_EVENTPAIR_H_
diff --git a/pkg/zx/include/lib/zx/exception.h b/pkg/zx/include/lib/zx/exception.h
new file mode 100644
index 0000000..d5cc756
--- /dev/null
+++ b/pkg/zx/include/lib/zx/exception.h
@@ -0,0 +1,43 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ZX_EXCEPTION_H_
+#define LIB_ZX_EXCEPTION_H_
+
+#include <lib/zx/handle.h>
+#include <lib/zx/object.h>
+#include <lib/zx/process.h>
+#include <lib/zx/thread.h>
+
+namespace zx {
+
+class exception final : public object<exception> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_EXCEPTION;
+
+  constexpr exception() = default;
+
+  explicit exception(zx_handle_t value) : object(value) {}
+
+  explicit exception(handle&& h) : object(h.release()) {}
+
+  exception(exception&& other) : object(other.release()) {}
+
+  exception& operator=(exception&& other) {
+    reset(other.release());
+    return *this;
+  }
+
+  zx_status_t get_thread(thread* thread) const {
+    return zx_exception_get_thread(get(), thread->reset_and_get_address());
+  }
+
+  zx_status_t get_process(process* process) const {
+    return zx_exception_get_process(get(), process->reset_and_get_address());
+  }
+};
+
+}  // namespace zx
+
+#endif  // LIB_ZX_EXCEPTION_H_
diff --git a/pkg/zx/include/lib/zx/fifo.h b/pkg/zx/include/lib/zx/fifo.h
index aeab229..c95648b 100644
--- a/pkg/zx/include/lib/zx/fifo.h
+++ b/pkg/zx/include/lib/zx/fifo.h
@@ -10,38 +10,38 @@
 
 namespace zx {
 
-class fifo : public object<fifo> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_FIFO;
+class fifo final : public object<fifo> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_FIFO;
 
-    constexpr fifo() = default;
+  constexpr fifo() = default;
 
-    explicit fifo(zx_handle_t value) : object(value) {}
+  explicit fifo(zx_handle_t value) : object(value) {}
 
-    explicit fifo(handle&& h) : object(h.release()) {}
+  explicit fifo(handle&& h) : object(h.release()) {}
 
-    fifo(fifo&& other) : object(other.release()) {}
+  fifo(fifo&& other) : object(other.release()) {}
 
-    fifo& operator=(fifo&& other) {
-        reset(other.release());
-        return *this;
-    }
+  fifo& operator=(fifo&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t elem_count, uint32_t elem_size,
-                              uint32_t options, fifo* out0, fifo* out1);
+  static zx_status_t create(uint32_t elem_count, uint32_t elem_size, uint32_t options, fifo* out0,
+                            fifo* out1);
 
-    zx_status_t write(size_t elem_size, const void* buffer, size_t count, size_t* actual_count) const {
-        return zx_fifo_write(get(), elem_size, buffer, count, actual_count);
-    }
+  zx_status_t write(size_t elem_size, const void* buffer, size_t count,
+                    size_t* actual_count) const {
+    return zx_fifo_write(get(), elem_size, buffer, count, actual_count);
+  }
 
-    zx_status_t read(size_t elem_size, void* buffer, size_t count, size_t* actual_count) const {
-        return zx_fifo_read(get(), elem_size, buffer, count, actual_count);
-    }
-
+  zx_status_t read(size_t elem_size, void* buffer, size_t count, size_t* actual_count) const {
+    return zx_fifo_read(get(), elem_size, buffer, count, actual_count);
+  }
 };
 
 using unowned_fifo = unowned<fifo>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_FIFO_H_
diff --git a/pkg/zx/include/lib/zx/guest.h b/pkg/zx/include/lib/zx/guest.h
index 037bc6d..2c4c7ef 100644
--- a/pkg/zx/include/lib/zx/guest.h
+++ b/pkg/zx/include/lib/zx/guest.h
@@ -13,34 +13,33 @@
 
 namespace zx {
 
-class guest : public object<guest> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_GUEST;
+class guest final : public object<guest> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_GUEST;
 
-    constexpr guest() = default;
+  constexpr guest() = default;
 
-    explicit guest(zx_handle_t value) : object(value) {}
+  explicit guest(zx_handle_t value) : object(value) {}
 
-    explicit guest(handle&& h) : object(h.release()) {}
+  explicit guest(handle&& h) : object(h.release()) {}
 
-    guest(guest&& other) : object(other.release()) {}
+  guest(guest&& other) : object(other.release()) {}
 
-    guest& operator=(guest&& other) {
-        reset(other.release());
-        return *this;
-    }
+  guest& operator=(guest&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& resource, uint32_t options,
-                              guest* guest, vmar* vmar);
+  static zx_status_t create(const resource& resource, uint32_t options, guest* guest, vmar* vmar);
 
-    zx_status_t set_trap(uint32_t kind, zx_gpaddr_t addr, size_t len,
-                         const port& port, uint64_t key) {
-        return zx_guest_set_trap(get(), kind, addr, len, port.get(), key);
-    }
+  zx_status_t set_trap(uint32_t kind, zx_gpaddr_t addr, size_t len, const port& port,
+                       uint64_t key) const {
+    return zx_guest_set_trap(get(), kind, addr, len, port.get(), key);
+  }
 };
 
 using unowned_guest = unowned<guest>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_GUEST_H_
diff --git a/pkg/zx/include/lib/zx/handle.h b/pkg/zx/include/lib/zx/handle.h
index 3daca00..930161d 100644
--- a/pkg/zx/include/lib/zx/handle.h
+++ b/pkg/zx/include/lib/zx/handle.h
@@ -12,6 +12,6 @@
 using handle = object<void>;
 using unowned_handle = unowned<handle>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_HANDLE_H_
diff --git a/pkg/zx/include/lib/zx/interrupt.h b/pkg/zx/include/lib/zx/interrupt.h
index b3d3eb7..bb55a08 100644
--- a/pkg/zx/include/lib/zx/interrupt.h
+++ b/pkg/zx/include/lib/zx/interrupt.h
@@ -7,54 +7,56 @@
 
 #include <lib/zx/handle.h>
 #include <lib/zx/object.h>
+#include <lib/zx/port.h>
 #include <lib/zx/resource.h>
 #include <lib/zx/time.h>
+#include <lib/zx/vcpu.h>
 
 namespace zx {
 
-class interrupt : public object<interrupt> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_INTERRUPT;
+class interrupt final : public object<interrupt> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_INTERRUPT;
 
-    constexpr interrupt() = default;
+  constexpr interrupt() = default;
 
-    explicit interrupt(zx_handle_t value) : object(value) {}
+  explicit interrupt(zx_handle_t value) : object(value) {}
 
-    explicit interrupt(handle&& h) : object(h.release()) {}
+  explicit interrupt(handle&& h) : object(h.release()) {}
 
-    interrupt(interrupt&& other) : object(other.release()) {}
+  interrupt(interrupt&& other) : object(other.release()) {}
 
-    interrupt& operator=(interrupt&& other) {
-        reset(other.release());
-        return *this;
-    }
+  interrupt& operator=(interrupt&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& resource, uint32_t vector,
-                        uint32_t options, interrupt* result);
+  static zx_status_t create(const resource& resource, uint32_t vector, uint32_t options,
+                            interrupt* result);
 
-    zx_status_t wait(zx::time* timestamp) {
-        return zx_interrupt_wait(get(), timestamp->get_address());
-    }
+  zx_status_t wait(zx::time* timestamp) const {
+    return zx_interrupt_wait(get(), timestamp ? timestamp->get_address() : nullptr);
+  }
 
-    zx_status_t destroy() {
-        return zx_interrupt_destroy(get());
-    }
+  zx_status_t destroy() const { return zx_interrupt_destroy(get()); }
 
-    zx_status_t trigger(uint32_t options, zx::time timestamp) {
-        return zx_interrupt_trigger(get(), options, timestamp.get());
-    }
+  zx_status_t trigger(uint32_t options, zx::time timestamp) const {
+    return zx_interrupt_trigger(get(), options, timestamp.get());
+  }
 
-    zx_status_t bind(zx_handle_t porth, uint64_t key, uint32_t options) {
-        return zx_interrupt_bind(get(), porth, key, options);
-    }
+  zx_status_t bind(const zx::port& port, uint64_t key, uint32_t options) const {
+    return zx_interrupt_bind(get(), port.get(), key, options);
+  }
 
-    zx_status_t ack() {
-        return zx_interrupt_ack(get());
-    }
+  zx_status_t bind_vcpu(const zx::vcpu& vcpu, uint32_t options) const {
+    return zx_interrupt_bind_vcpu(get(), vcpu.get(), options);
+  }
+
+  zx_status_t ack() const { return zx_interrupt_ack(get()); }
 };
 
 using unowned_interrupt = unowned<interrupt>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_INTERRUPT_H_
diff --git a/pkg/zx/include/lib/zx/iommu.h b/pkg/zx/include/lib/zx/iommu.h
index 95dc427..b19a2bb 100644
--- a/pkg/zx/include/lib/zx/iommu.h
+++ b/pkg/zx/include/lib/zx/iommu.h
@@ -10,29 +10,29 @@
 
 namespace zx {
 
-class iommu : public object<iommu> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_IOMMU;
+class iommu final : public object<iommu> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_IOMMU;
 
-    constexpr iommu() = default;
+  constexpr iommu() = default;
 
-    explicit iommu(zx_handle_t value) : object(value) {}
+  explicit iommu(zx_handle_t value) : object(value) {}
 
-    explicit iommu(handle&& h) : object(h.release()) {}
+  explicit iommu(handle&& h) : object(h.release()) {}
 
-    iommu(iommu&& other) : object(other.release()) {}
+  iommu(iommu&& other) : object(other.release()) {}
 
-    iommu& operator=(iommu&& other) {
-        reset(other.release());
-        return *this;
-    }
+  iommu& operator=(iommu&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& resource, uint32_t type, const void* desc,
-                              size_t desc_size, iommu* result);
+  static zx_status_t create(const resource& resource, uint32_t type, const void* desc,
+                            size_t desc_size, iommu* result);
 };
 
 using unowned_iommu = unowned<iommu>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_IOMMU_H_
diff --git a/pkg/zx/include/lib/zx/job.h b/pkg/zx/include/lib/zx/job.h
index 3bd7125..7047ffc 100644
--- a/pkg/zx/include/lib/zx/job.h
+++ b/pkg/zx/include/lib/zx/job.h
@@ -6,58 +6,58 @@
 #define LIB_ZX_JOB_H_
 
 #include <lib/zx/task.h>
-#include <zircon/process.h>
+#include <lib/zx/process.h>
 
 namespace zx {
 
 class process;
 
-class job : public task<job> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_JOB;
+class job final : public task<job> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_JOB;
 
-    constexpr job() = default;
+  constexpr job() = default;
 
-    explicit job(zx_handle_t value) : task(value) {}
+  explicit job(zx_handle_t value) : task(value) {}
 
-    explicit job(handle&& h) : task(h.release()) {}
+  explicit job(handle&& h) : task(h.release()) {}
 
-    job(job&& other) : task(other.release()) {}
+  job(job&& other) : task(other.release()) {}
 
-    job& operator=(job&& other) {
-        reset(other.release());
-        return *this;
-    }
+  job& operator=(job&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const zx::job& parent, uint32_t options, job* result);
+  static zx_status_t create(const zx::job& parent, uint32_t options, job* result);
 
-    // Provide strongly-typed overloads, in addition to get_child(handle*).
-    using task<job>::get_child;
-    zx_status_t get_child(uint64_t koid, zx_rights_t rights,
-                          job* result) const {
-        // Allow for |result| and |this| aliasing the same container.
-        job h;
-        zx_status_t status = zx_object_get_child(
-            value_, koid, rights, h.reset_and_get_address());
-        result->reset(h.release());
-        return status;
-    }
-    zx_status_t get_child(uint64_t koid, zx_rights_t rights,
-                          process* result) const;
+  // Provide strongly-typed overloads, in addition to get_child(handle*).
+  using task<job>::get_child;
+  zx_status_t get_child(uint64_t koid, zx_rights_t rights, job* result) const {
+    // Allow for |result| and |this| aliasing the same container.
+    job h;
+    zx_status_t status = zx_object_get_child(value_, koid, rights, h.reset_and_get_address());
+    result->reset(h.release());
+    return status;
+  }
+  zx_status_t get_child(uint64_t koid, zx_rights_t rights, process* result) const;
 
-    zx_status_t set_policy(uint32_t options, uint32_t topic, const void* policy, uint32_t count) const {
-      return zx_job_set_policy(get(), options, topic, policy, count);
-    }
+  zx_status_t set_policy(uint32_t options, uint32_t topic, const void* policy,
+                         uint32_t count) const {
+    return zx_job_set_policy(get(), options, topic, policy, count);
+  }
 
-    // Ideally this would be called zx::job::default(), but default is a
-    // C++ keyword and cannot be used as a function name.
-    static inline unowned<job> default_job() {
-        return unowned<job>(zx_job_default());
-    }
+  zx_status_t set_critical(uint32_t options, const zx::process& process) const {
+    return zx_job_set_critical(get(), options, process.get());
+  }
+
+  // Ideally this would be called zx::job::default(), but default is a
+  // C++ keyword and cannot be used as a function name.
+  static inline unowned<job> default_job() { return unowned<job>(zx_job_default()); }
 };
 
 using unowned_job = unowned<job>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_JOB_H_
diff --git a/pkg/zx/include/lib/zx/log.h b/pkg/zx/include/lib/zx/log.h
deleted file mode 100644
index 36b6e22..0000000
--- a/pkg/zx/include/lib/zx/log.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-#ifndef LIB_ZX_LOG_H_
-#define LIB_ZX_LOG_H_
-
-#include <lib/zx/handle.h>
-#include <lib/zx/object.h>
-
-namespace zx {
-
-class log : public object<log> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_LOG;
-
-    constexpr log() = default;
-
-    explicit log(zx_handle_t value) : object(value) {}
-
-    explicit log(handle&& h) : object(h.release()) {}
-
-    log(log&& other) : object(other.release()) {}
-
-    log& operator=(log&& other) {
-        reset(other.release());
-        return *this;
-    }
-
-    static zx_status_t create(uint32_t flags, log* result);
-
-    zx_status_t write(uint32_t len, const void* buffer, uint32_t flags) const {
-        return zx_log_write(get(), len, buffer, flags);
-    }
-
-    zx_status_t read(uint32_t len, void* buffer, uint32_t flags) const {
-        return zx_log_read(get(), len, buffer, flags);
-    }
-};
-
-using unowned_log = unowned<log>;
-
-} // namespace zx
-
-#endif  // LIB_ZX_LOG_H_
diff --git a/pkg/zx/include/lib/zx/msi.h b/pkg/zx/include/lib/zx/msi.h
new file mode 100644
index 0000000..cd45a94
--- /dev/null
+++ b/pkg/zx/include/lib/zx/msi.h
@@ -0,0 +1,47 @@
+// Copyright 2020 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.
+
+#ifndef LIB_ZX_MSI_H_
+#define LIB_ZX_MSI_H_
+
+#include <lib/zx/handle.h>
+#include <lib/zx/interrupt.h>
+#include <lib/zx/object.h>
+#include <lib/zx/resource.h>
+#include <lib/zx/vmo.h>
+#include <stdint.h>
+#include <zircon/types.h>
+
+namespace zx {
+
+// This wrapper encompasses both MsiDispatcher MsiAllocationDispatcher due
+// to them only having static members and MsiDispatcher otherwise using the
+// same interface as a zx::interrupt.
+class msi final : public object<msi> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_MSI_ALLOCATION;
+
+  constexpr msi() = default;
+
+  explicit msi(zx_handle_t value) : object(value) {}
+
+  explicit msi(handle&& h) : object(h.release()) {}
+
+  msi(msi&& other) : object(other.release()) {}
+
+  msi& operator=(msi&& other) {
+    reset(other.release());
+    return *this;
+  }
+
+  static zx_status_t allocate(const resource& resource, uint32_t count, msi* result);
+  static zx_status_t create(const msi& msi, uint32_t options, uint32_t msi_id, const vmo& vmo,
+                            size_t vmo_offset, interrupt* result);
+};
+
+using unowned_msi = unowned<msi>;
+
+}  // namespace zx
+
+#endif  // LIB_ZX_MSI_H_
diff --git a/pkg/zx/include/lib/zx/object.h b/pkg/zx/include/lib/zx/object.h
index 57c023c..710b474 100644
--- a/pkg/zx/include/lib/zx/object.h
+++ b/pkg/zx/include/lib/zx/object.h
@@ -5,10 +5,10 @@
 #ifndef LIB_ZX_OBJECT_H_
 #define LIB_ZX_OBJECT_H_
 
-#include <zircon/syscalls.h>
-#include <zircon/types.h>
 #include <lib/zx/object_traits.h>
 #include <lib/zx/time.h>
+#include <zircon/syscalls.h>
+#include <zircon/types.h>
 
 namespace zx {
 
@@ -22,247 +22,262 @@
 //
 // The handle is automatically closed when the wrapper is destroyed.
 class object_base {
-public:
-    void reset(zx_handle_t value = ZX_HANDLE_INVALID) {
-        close();
-        value_ = value;
+ public:
+  void reset(zx_handle_t value = ZX_HANDLE_INVALID) {
+    close();
+    value_ = value;
+  }
+
+  bool is_valid() const { return value_ != ZX_HANDLE_INVALID; }
+  explicit operator bool() const { return is_valid(); }
+
+  zx_handle_t get() const { return value_; }
+
+  // Reset the underlying handle, and then get the address of the
+  // underlying internal handle storage.
+  //
+  // Note: The intended purpose is to facilitate interactions with C
+  // APIs which expect to be provided a pointer to a handle used as
+  // an out parameter.
+  zx_handle_t* reset_and_get_address() {
+    reset();
+    return &value_;
+  }
+
+  __attribute__((warn_unused_result)) zx_handle_t release() {
+    zx_handle_t result = value_;
+    value_ = ZX_HANDLE_INVALID;
+    return result;
+  }
+
+  zx_status_t get_info(uint32_t topic, void* buffer, size_t buffer_size, size_t* actual_count,
+                       size_t* avail_count) const {
+    return zx_object_get_info(get(), topic, buffer, buffer_size, actual_count, avail_count);
+  }
+
+  zx_status_t get_property(uint32_t property, void* value, size_t size) const {
+    return zx_object_get_property(get(), property, value, size);
+  }
+
+  zx_status_t set_property(uint32_t property, const void* value, size_t size) const {
+    return zx_object_set_property(get(), property, value, size);
+  }
+
+ protected:
+  constexpr object_base() : value_(ZX_HANDLE_INVALID) {}
+
+  explicit object_base(zx_handle_t value) : value_(value) {}
+
+  ~object_base() { close(); }
+
+  object_base(const object_base&) = delete;
+
+  void operator=(const object_base&) = delete;
+
+  void close() {
+    if (value_ != ZX_HANDLE_INVALID) {
+      zx_handle_close(value_);
+      value_ = ZX_HANDLE_INVALID;
     }
+  }
 
-    bool is_valid() const { return value_ != ZX_HANDLE_INVALID; }
-    explicit operator bool() const { return is_valid(); }
-
-    zx_handle_t get() const { return value_; }
-
-    // Reset the underlying handle, and then get the address of the
-    // underlying internal handle storage.
-    //
-    // Note: The intended purpose is to facilitate interactions with C
-    // APIs which expect to be provided a pointer to a handle used as
-    // an out parameter.
-    zx_handle_t* reset_and_get_address() {
-        reset();
-        return &value_;
-    }
-
-    __attribute__((warn_unused_result)) zx_handle_t release() {
-        zx_handle_t result = value_;
-        value_ = ZX_HANDLE_INVALID;
-        return result;
-    }
-
-protected:
-    constexpr object_base() : value_(ZX_HANDLE_INVALID) {}
-
-    explicit object_base(zx_handle_t value) : value_(value) {}
-
-    ~object_base() { close(); }
-
-    object_base(const object_base&) = delete;
-
-    void operator=(const object_base&) = delete;
-
-    void close() {
-        if (value_ != ZX_HANDLE_INVALID) {
-            zx_handle_close(value_);
-            value_ = ZX_HANDLE_INVALID;
-        }
-    }
-
-    zx_handle_t value_;
+  zx_handle_t value_;
 };
 
+// Forward declaration for borrow method.
+template <typename T>
+class unowned;
+
 // Provides type-safe access to operations on a handle.
-template <typename T> class object : public object_base {
-public:
-    constexpr object() = default;
+template <typename T>
+class object : public object_base {
+ public:
+  constexpr object() = default;
 
-    explicit object(zx_handle_t value) : object_base(value) {}
+  explicit object(zx_handle_t value) : object_base(value) {}
 
-    template <typename U> object(object<U>&& other) : object_base(other.release()) {
-        static_assert(is_same<T, void>::value, "Receiver must be compatible.");
-    }
+  template <typename U>
+  object(object<U>&& other) : object_base(other.release()) {
+    static_assert(is_same<T, void>::value, "Receiver must be compatible.");
+  }
 
-    template <typename U> object<T>& operator=(object<U>&& other) {
-        static_assert(is_same<T, void>::value, "Receiver must be compatible.");
-        reset(other.release());
-        return *this;
-    }
+  template <typename U>
+  object<T>& operator=(object<U>&& other) {
+    static_assert(is_same<T, void>::value, "Receiver must be compatible.");
+    reset(other.release());
+    return *this;
+  }
 
-    void swap(object<T>& other) {
-        zx_handle_t tmp = value_;
-        value_ = other.value_;
-        other.value_ = tmp;
-    }
+  void swap(object<T>& other) {
+    zx_handle_t tmp = value_;
+    value_ = other.value_;
+    other.value_ = tmp;
+  }
 
-    zx_status_t duplicate(zx_rights_t rights, object<T>* result) const {
-        static_assert(object_traits<T>::supports_duplication,
-                      "Object must support duplication.");
-        zx_handle_t h = ZX_HANDLE_INVALID;
-        zx_status_t status = zx_handle_duplicate(value_, rights, &h);
-        result->reset(h);
-        return status;
-    }
+  zx_status_t duplicate(zx_rights_t rights, object<T>* result) const {
+    static_assert(object_traits<T>::supports_duplication, "Object must support duplication.");
+    zx_handle_t h = ZX_HANDLE_INVALID;
+    zx_status_t status = zx_handle_duplicate(value_, rights, &h);
+    result->reset(h);
+    return status;
+  }
 
-    zx_status_t replace(zx_rights_t rights, object<T>* result) {
-        zx_handle_t h = ZX_HANDLE_INVALID;
-        zx_status_t status = zx_handle_replace(value_, rights, &h);
-        // We store ZX_HANDLE_INVALID to value_ before calling reset on result
-        // in case result == this.
-        value_ = ZX_HANDLE_INVALID;
-        result->reset(h);
-        return status;
-    }
+  zx_status_t replace(zx_rights_t rights, object<T>* result) {
+    zx_handle_t h = ZX_HANDLE_INVALID;
+    zx_status_t status = zx_handle_replace(value_, rights, &h);
+    // We store ZX_HANDLE_INVALID to value_ before calling reset on result
+    // in case result == this.
+    value_ = ZX_HANDLE_INVALID;
+    result->reset(h);
+    return status;
+  }
 
-    zx_status_t wait_one(zx_signals_t signals, zx::time deadline,
-                         zx_signals_t* pending) const {
-        static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
-        return zx_object_wait_one(value_, signals, deadline.get(), pending);
-    }
+  zx_status_t wait_one(zx_signals_t signals, zx::time deadline, zx_signals_t* pending) const {
+    static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
+    return zx_object_wait_one(value_, signals, deadline.get(), pending);
+  }
 
-    zx_status_t wait_async(const object<port>& port, uint64_t key,
-                           zx_signals_t signals, uint32_t options) const {
-        static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
-        return zx_object_wait_async(value_, port.get(), key, signals, options);
-    }
+  zx_status_t wait_async(const object<port>& port, uint64_t key, zx_signals_t signals,
+                         uint32_t options) const {
+    static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
+    return zx_object_wait_async(value_, port.get(), key, signals, options);
+  }
 
-    static zx_status_t wait_many(zx_wait_item_t* wait_items, uint32_t count, zx::time deadline) {
-        static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
-        return zx_object_wait_many(wait_items, count, deadline.get());
-    }
+  static zx_status_t wait_many(zx_wait_item_t* wait_items, uint32_t count, zx::time deadline) {
+    static_assert(object_traits<T>::supports_wait, "Object is not waitable.");
+    return zx_object_wait_many(wait_items, count, deadline.get());
+  }
 
-    zx_status_t signal(uint32_t clear_mask, uint32_t set_mask) const {
-        static_assert(object_traits<T>::supports_user_signal,
-                      "Object must support user signals.");
-        return zx_object_signal(get(), clear_mask, set_mask);
-    }
+  zx_status_t signal(uint32_t clear_mask, uint32_t set_mask) const {
+    static_assert(object_traits<T>::supports_user_signal, "Object must support user signals.");
+    return zx_object_signal(get(), clear_mask, set_mask);
+  }
 
-    zx_status_t signal_peer(uint32_t clear_mask, uint32_t set_mask) const {
-        static_assert(object_traits<T>::supports_user_signal,
-                      "Object must support user signals.");
-        static_assert(object_traits<T>::has_peer_handle,
-                      "Object must have peer object.");
-        return zx_object_signal_peer(get(), clear_mask, set_mask);
-    }
+  zx_status_t signal_peer(uint32_t clear_mask, uint32_t set_mask) const {
+    static_assert(object_traits<T>::supports_user_signal, "Object must support user signals.");
+    static_assert(object_traits<T>::has_peer_handle, "Object must have peer object.");
+    return zx_object_signal_peer(get(), clear_mask, set_mask);
+  }
 
-    zx_status_t get_info(uint32_t topic, void* buffer,
-                         size_t buffer_size,
-                         size_t* actual_count, size_t* avail_count) const {
-        return zx_object_get_info(get(), topic, buffer, buffer_size, actual_count, avail_count);
-    }
+  zx_status_t get_child(uint64_t koid, zx_rights_t rights, object<void>* result) const {
+    static_assert(object_traits<T>::supports_get_child, "Object must support getting children.");
+    // Allow for |result| and |this| being the same container, though that
+    // can only happen for |T=void|, due to strict aliasing.
+    object<void> h;
+    zx_status_t status = zx_object_get_child(value_, koid, rights, h.reset_and_get_address());
+    result->reset(h.release());
+    return status;
+  }
 
-    zx_status_t get_child(uint64_t koid, zx_rights_t rights,
-                          object<void>* result) const {
-        // Allow for |result| and |this| being the same container, though that
-        // can only happen for |T=void|, due to strict aliasing.
-        object<void> h;
-        zx_status_t status = zx_object_get_child(
-            value_, koid, rights, h.reset_and_get_address());
-        result->reset(h.release());
-        return status;
-    }
+  zx_status_t set_profile(const object<profile>& profile, uint32_t options) const {
+    static_assert(object_traits<T>::supports_set_profile,
+                  "Object must support scheduling profiles.");
+    return zx_object_set_profile(get(), profile.get(), options);
+  }
 
-    zx_status_t get_property(uint32_t property, void* value,
-                             size_t size) const {
-        return zx_object_get_property(get(), property, value, size);
-    }
+  // Returns a type-safe wrapper of the underlying handle that does not claim ownership.
+  unowned<T> borrow() const { return unowned<T>(get()); }
 
-    zx_status_t set_property(uint32_t property, const void* value,
-                             size_t size) const {
-        return zx_object_set_property(get(), property, value, size);
-    }
+ private:
+  template <typename A, typename B>
+  struct is_same {
+    static const bool value = false;
+  };
 
-    zx_status_t get_cookie(const object_base& scope, uint64_t *cookie) const {
-        return zx_object_get_cookie(get(), scope.get(), cookie);
-    }
-
-    zx_status_t set_cookie(const object_base& scope, uint64_t cookie) const {
-        return zx_object_set_cookie(get(), scope.get(), cookie);
-    }
-
-    zx_status_t set_profile(const object<profile>& profile, uint32_t options) const {
-        return zx_object_set_profile(get(), profile.get(), options);
-    }
-
-private:
-    template <typename A, typename B> struct is_same {
-        static const bool value = false;
-    };
-
-    template <typename A> struct is_same<A, A> {
-        static const bool value = true;
-    };
+  template <typename A>
+  struct is_same<A, A> {
+    static const bool value = true;
+  };
 };
 
-template <typename T> bool operator==(const object<T>& a, const object<T>& b) {
-    return a.get() == b.get();
+template <typename T>
+bool operator==(const object<T>& a, const object<T>& b) {
+  return a.get() == b.get();
 }
 
-template <typename T> bool operator!=(const object<T>& a, const object<T>& b) {
-    return !(a == b);
+template <typename T>
+bool operator!=(const object<T>& a, const object<T>& b) {
+  return !(a == b);
 }
 
-template <typename T> bool operator<(const object<T>& a, const object<T>& b) {
-    return a.get() < b.get();
+template <typename T>
+bool operator<(const object<T>& a, const object<T>& b) {
+  return a.get() < b.get();
 }
 
-template <typename T> bool operator>(const object<T>& a, const object<T>& b) {
-    return a.get() > b.get();
+template <typename T>
+bool operator>(const object<T>& a, const object<T>& b) {
+  return a.get() > b.get();
 }
 
-template <typename T> bool operator<=(const object<T>& a, const object<T>& b) {
-    return !(a.get() > b.get());
+template <typename T>
+bool operator<=(const object<T>& a, const object<T>& b) {
+  return !(a.get() > b.get());
 }
 
-template <typename T> bool operator>=(const object<T>& a, const object<T>& b) {
-    return !(a.get() < b.get());
+template <typename T>
+bool operator>=(const object<T>& a, const object<T>& b) {
+  return !(a.get() < b.get());
 }
 
-template <typename T> bool operator==(zx_handle_t a, const object<T>& b) {
-    return a == b.get();
+template <typename T>
+bool operator==(zx_handle_t a, const object<T>& b) {
+  return a == b.get();
 }
 
-template <typename T> bool operator!=(zx_handle_t a, const object<T>& b) {
-    return !(a == b);
+template <typename T>
+bool operator!=(zx_handle_t a, const object<T>& b) {
+  return !(a == b);
 }
 
-template <typename T> bool operator<(zx_handle_t a, const object<T>& b) {
-    return a < b.get();
+template <typename T>
+bool operator<(zx_handle_t a, const object<T>& b) {
+  return a < b.get();
 }
 
-template <typename T> bool operator>(zx_handle_t a, const object<T>& b) {
-    return a > b.get();
+template <typename T>
+bool operator>(zx_handle_t a, const object<T>& b) {
+  return a > b.get();
 }
 
-template <typename T> bool operator<=(zx_handle_t a, const object<T>& b) {
-    return !(a > b.get());
+template <typename T>
+bool operator<=(zx_handle_t a, const object<T>& b) {
+  return !(a > b.get());
 }
 
-template <typename T> bool operator>=(zx_handle_t a, const object<T>& b) {
-    return !(a < b.get());
+template <typename T>
+bool operator>=(zx_handle_t a, const object<T>& b) {
+  return !(a < b.get());
 }
 
-template <typename T> bool operator==(const object<T>& a, zx_handle_t b) {
-    return a.get() == b;
+template <typename T>
+bool operator==(const object<T>& a, zx_handle_t b) {
+  return a.get() == b;
 }
 
-template <typename T> bool operator!=(const object<T>& a, zx_handle_t b) {
-    return !(a == b);
+template <typename T>
+bool operator!=(const object<T>& a, zx_handle_t b) {
+  return !(a == b);
 }
 
-template <typename T> bool operator<(const object<T>& a, zx_handle_t b) {
-    return a.get() < b;
+template <typename T>
+bool operator<(const object<T>& a, zx_handle_t b) {
+  return a.get() < b;
 }
 
-template <typename T> bool operator>(const object<T>& a, zx_handle_t b) {
-    return a.get() > b;
+template <typename T>
+bool operator>(const object<T>& a, zx_handle_t b) {
+  return a.get() > b;
 }
 
-template <typename T> bool operator<=(const object<T>& a, zx_handle_t b) {
-    return !(a.get() > b);
+template <typename T>
+bool operator<=(const object<T>& a, zx_handle_t b) {
+  return !(a.get() > b);
 }
 
-template <typename T> bool operator>=(const object<T>& a, zx_handle_t b) {
-    return !(a.get() < b);
+template <typename T>
+bool operator>=(const object<T>& a, zx_handle_t b) {
+  return !(a.get() < b);
 }
 
 // Wraps a handle to an object to provide type-safe access to its operations
@@ -283,37 +298,131 @@
 // zx::unowned_event(handle)->signal(..)
 template <typename T>
 class unowned final {
-public:
-    explicit unowned(zx_handle_t h) : value_(h) {}
-    explicit unowned(const T& owner) : unowned(owner.get()) {}
-    explicit unowned(unowned& other) : unowned(*other) {}
-    constexpr unowned() = default;
-    unowned(unowned&& other) = default;
+ public:
+  explicit unowned(zx_handle_t h) : value_(h) {}
+  explicit unowned(const T& owner) : unowned(owner.get()) {}
+  explicit unowned(const unowned& other) : unowned(*other) {}
+  constexpr unowned() = default;
+  unowned(unowned&& other) = default;
 
-    ~unowned() { release_value(); }
+  ~unowned() { release_value(); }
 
-    unowned& operator=(unowned& other) {
-        *this = unowned(other);
-        return *this;
-    }
-    unowned& operator=(unowned&& other) {
-        release_value();
-        value_ = static_cast<T&&>(other.value_);
-        return *this;
+  unowned& operator=(const unowned& other) {
+    if (&other == this) {
+      return *this;
     }
 
-    const T& operator*() const { return value_; }
-    const T* operator->() const { return &value_; }
+    *this = unowned(other);
+    return *this;
+  }
+  unowned& operator=(unowned&& other) {
+    release_value();
+    value_ = static_cast<T&&>(other.value_);
+    return *this;
+  }
 
-private:
-    void release_value() {
-        zx_handle_t h = value_.release();
-        static_cast<void>(h);
-    }
+  const T& operator*() const { return value_; }
+  const T* operator->() const { return &value_; }
 
-    T value_;
+ private:
+  void release_value() {
+    zx_handle_t h = value_.release();
+    static_cast<void>(h);
+  }
+
+  T value_;
 };
 
-} // namespace zx
+template <typename T>
+bool operator==(const unowned<T>& a, const unowned<T>& b) {
+  return a->get() == b->get();
+}
+
+template <typename T>
+bool operator!=(const unowned<T>& a, const unowned<T>& b) {
+  return !(a == b);
+}
+
+template <typename T>
+bool operator<(const unowned<T>& a, const unowned<T>& b) {
+  return a->get() < b->get();
+}
+
+template <typename T>
+bool operator>(const unowned<T>& a, const unowned<T>& b) {
+  return a->get() > b->get();
+}
+
+template <typename T>
+bool operator<=(const unowned<T>& a, const unowned<T>& b) {
+  return !(a > b);
+}
+
+template <typename T>
+bool operator>=(const unowned<T>& a, const unowned<T>& b) {
+  return !(a < b);
+}
+
+template <typename T>
+bool operator==(zx_handle_t a, const unowned<T>& b) {
+  return a == b->get();
+}
+
+template <typename T>
+bool operator!=(zx_handle_t a, const unowned<T>& b) {
+  return !(a == b);
+}
+
+template <typename T>
+bool operator<(zx_handle_t a, const unowned<T>& b) {
+  return a < b->get();
+}
+
+template <typename T>
+bool operator>(zx_handle_t a, const unowned<T>& b) {
+  return a > b->get();
+}
+
+template <typename T>
+bool operator<=(zx_handle_t a, const unowned<T>& b) {
+  return !(a > b);
+}
+
+template <typename T>
+bool operator>=(zx_handle_t a, const unowned<T>& b) {
+  return !(a < b);
+}
+
+template <typename T>
+bool operator==(const unowned<T>& a, zx_handle_t b) {
+  return a->get() == b;
+}
+
+template <typename T>
+bool operator!=(const unowned<T>& a, zx_handle_t b) {
+  return !(a == b);
+}
+
+template <typename T>
+bool operator<(const unowned<T>& a, zx_handle_t b) {
+  return a->get() < b;
+}
+
+template <typename T>
+bool operator>(const unowned<T>& a, zx_handle_t b) {
+  return a->get() > b;
+}
+
+template <typename T>
+bool operator<=(const unowned<T>& a, zx_handle_t b) {
+  return !(a > b);
+}
+
+template <typename T>
+bool operator>=(const unowned<T>& a, zx_handle_t b) {
+  return !(a < b);
+}
+
+}  // namespace zx
 
 #endif  // LIB_ZX_OBJECT_H_
diff --git a/pkg/zx/include/lib/zx/object_traits.h b/pkg/zx/include/lib/zx/object_traits.h
index f5a62c6..1352c0b 100644
--- a/pkg/zx/include/lib/zx/object_traits.h
+++ b/pkg/zx/include/lib/zx/object_traits.h
@@ -9,103 +9,216 @@
 
 class channel;
 class eventpair;
-class log;
-class socket;
-class vmo;
-class vmar;
-class port;
-class guest;
+class exception;
 class fifo;
+class guest;
 class interrupt;
+class job;
+class log;
+class msi;
+class port;
+class process;
 class pmt;
+class resource;
+class socket;
+class thread;
+class vmar;
+class vmo;
 
 // The default traits supports:
-// - event
-// - thread
-// - process
-// - job
-// - vmo
 // - bti
-// - resource
-// - timer
+// - event
 // - iommu
-template <typename T> struct object_traits {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = false;
+// - profile
+// - timer
+// - vmo
+template <typename T>
+struct object_traits {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<channel> {
-    static constexpr bool supports_duplication = false;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = true;
+template <>
+struct object_traits<channel> {
+  static constexpr bool supports_duplication = false;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = true;
 };
 
-template <> struct object_traits<eventpair> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = true;
+template <>
+struct object_traits<eventpair> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = true;
 };
 
-template <> struct object_traits<fifo> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = true;
+template <>
+struct object_traits<fifo> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = true;
 };
 
-template <> struct object_traits<log> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<log> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<pmt> {
-    static constexpr bool supports_duplication = false;
-    static constexpr bool supports_user_signal = false;
-    static constexpr bool supports_wait = false;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<pmt> {
+  static constexpr bool supports_duplication = false;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = false;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<socket> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = true;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = true;
+template <>
+struct object_traits<socket> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = true;
 };
 
-template <> struct object_traits<port> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = false;
-    static constexpr bool supports_wait = false;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<port> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = false;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<vmar> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = false;
-    static constexpr bool supports_wait = false;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<vmar> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = false;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<interrupt> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = false;
-    static constexpr bool supports_wait = true;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<interrupt> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-template <> struct object_traits<guest> {
-    static constexpr bool supports_duplication = true;
-    static constexpr bool supports_user_signal = false;
-    static constexpr bool supports_wait = false;
-    static constexpr bool has_peer_handle = false;
+template <>
+struct object_traits<guest> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = false;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
 };
 
-} // namespace zx
+template <>
+struct object_traits<exception> {
+  static constexpr bool supports_duplication = false;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = false;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
+};
+
+template <>
+struct object_traits<job> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = true;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = true;
+  static constexpr bool has_peer_handle = false;
+};
+
+template <>
+struct object_traits<process> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = true;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = true;
+  static constexpr bool has_peer_handle = false;
+};
+
+template <>
+struct object_traits<thread> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = true;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
+};
+
+template <>
+struct object_traits<resource> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = true;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = true;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
+};
+
+template <>
+struct object_traits<msi> {
+  static constexpr bool supports_duplication = true;
+  static constexpr bool supports_get_child = false;
+  static constexpr bool supports_set_profile = false;
+  static constexpr bool supports_user_signal = false;
+  static constexpr bool supports_wait = true;
+  static constexpr bool supports_kill = false;
+  static constexpr bool has_peer_handle = false;
+};
+
+}  // namespace zx
 
 #endif  // LIB_ZX_OBJECT_TRAITS_H_
diff --git a/pkg/zx/include/lib/zx/pager.h b/pkg/zx/include/lib/zx/pager.h
new file mode 100644
index 0000000..a1e4663
--- /dev/null
+++ b/pkg/zx/include/lib/zx/pager.h
@@ -0,0 +1,57 @@
+// Copyright 2019 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.
+
+#ifndef LIB_ZX_PAGER_H_
+#define LIB_ZX_PAGER_H_
+
+#include <lib/zx/handle.h>
+#include <lib/zx/object.h>
+#include <lib/zx/port.h>
+#include <lib/zx/vmo.h>
+
+namespace zx {
+
+class pager final : public object<pager> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PAGER;
+
+  constexpr pager() = default;
+
+  explicit pager(zx_handle_t value) : object(value) {}
+
+  explicit pager(handle&& h) : object(h.release()) {}
+
+  pager(pager&& other) : object(other.release()) {}
+
+  pager& operator=(pager&& other) {
+    reset(other.release());
+    return *this;
+  }
+
+  static zx_status_t create(uint32_t options, pager* result);
+
+  zx_status_t create_vmo(uint32_t options, const port& port, uint64_t key, uint64_t size,
+                         vmo* result) const {
+    return zx_pager_create_vmo(get(), options, port.get(), key, size,
+                               result->reset_and_get_address());
+  }
+
+  zx_status_t detach_vmo(const vmo& vmo) const { return zx_pager_detach_vmo(get(), vmo.get()); }
+
+  zx_status_t supply_pages(const vmo& pager_vmo, uint64_t offset, uint64_t length,
+                           const vmo& aux_vmo, uint64_t aux_offset) const {
+    return zx_pager_supply_pages(get(), pager_vmo.get(), offset, length, aux_vmo.get(), aux_offset);
+  }
+
+  zx_status_t op_range(uint32_t op, const vmo& pager_vmo, uint64_t offset, uint64_t length,
+                       uint64_t data) const {
+    return zx_pager_op_range(get(), op, pager_vmo.get(), offset, length, data);
+  }
+};
+
+using unowned_pager = unowned<pager>;
+
+}  // namespace zx
+
+#endif  // LIB_ZX_PAGER_H_
diff --git a/pkg/zx/include/lib/zx/pmt.h b/pkg/zx/include/lib/zx/pmt.h
index 404235a..8d095da 100644
--- a/pkg/zx/include/lib/zx/pmt.h
+++ b/pkg/zx/include/lib/zx/pmt.h
@@ -10,28 +10,28 @@
 
 namespace zx {
 
-class pmt : public object<pmt> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PMT;
+class pmt final : public object<pmt> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PMT;
 
-    constexpr pmt() = default;
+  constexpr pmt() = default;
 
-    explicit pmt(zx_handle_t value) : object(value) {}
+  explicit pmt(zx_handle_t value) : object(value) {}
 
-    explicit pmt(handle&& h) : object(h.release()) {}
+  explicit pmt(handle&& h) : object(h.release()) {}
 
-    pmt(pmt&& other) : object(other.release()) {}
+  pmt(pmt&& other) : object(other.release()) {}
 
-    pmt& operator=(pmt&& other) {
-        reset(other.release());
-        return *this;
-    }
+  pmt& operator=(pmt&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    zx_status_t unpin() { return zx_pmt_unpin(release()); }
+  zx_status_t unpin() { return zx_pmt_unpin(release()); }
 };
 
 using unowned_pmt = unowned<pmt>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_PMT_H_
diff --git a/pkg/zx/include/lib/zx/port.h b/pkg/zx/include/lib/zx/port.h
index ef607ec..01a0fe5 100644
--- a/pkg/zx/include/lib/zx/port.h
+++ b/pkg/zx/include/lib/zx/port.h
@@ -11,40 +11,38 @@
 
 namespace zx {
 
-class port : public object<port> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PORT;
+class port final : public object<port> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PORT;
 
-    constexpr port() = default;
+  constexpr port() = default;
 
-    explicit port(zx_handle_t value) : object(value) {}
+  explicit port(zx_handle_t value) : object(value) {}
 
-    explicit port(handle&& h) : object(h.release()) {}
+  explicit port(handle&& h) : object(h.release()) {}
 
-    port(port&& other) : object(other.release()) {}
+  port(port&& other) : object(other.release()) {}
 
-    port& operator=(port&& other) {
-        reset(other.release());
-        return *this;
-    }
+  port& operator=(port&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t options, port* result);
+  static zx_status_t create(uint32_t options, port* result);
 
-    zx_status_t queue(const zx_port_packet_t* packet) const {
-        return zx_port_queue(get(), packet);
-    }
+  zx_status_t queue(const zx_port_packet_t* packet) const { return zx_port_queue(get(), packet); }
 
-    zx_status_t wait(zx::time deadline, zx_port_packet_t* packet) const {
-        return zx_port_wait(get(), deadline.get(), packet);
-    }
+  zx_status_t wait(zx::time deadline, zx_port_packet_t* packet) const {
+    return zx_port_wait(get(), deadline.get(), packet);
+  }
 
-    zx_status_t cancel(const object_base& source, uint64_t key) const {
-        return zx_port_cancel(get(), source.get(), key);
-    }
+  zx_status_t cancel(const object_base& source, uint64_t key) const {
+    return zx_port_cancel(get(), source.get(), key);
+  }
 };
 
 using unowned_port = unowned<port>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_PORT_H_
diff --git a/pkg/zx/include/lib/zx/process.h b/pkg/zx/include/lib/zx/process.h
index c3fe348..7fca7dc 100644
--- a/pkg/zx/include/lib/zx/process.h
+++ b/pkg/zx/include/lib/zx/process.h
@@ -15,53 +15,50 @@
 class job;
 class thread;
 
-class process : public task<process> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PROCESS;
+class process final : public task<process> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PROCESS;
 
-    constexpr process() = default;
+  constexpr process() = default;
 
-    explicit process(zx_handle_t value) : task(value) {}
+  explicit process(zx_handle_t value) : task(value) {}
 
-    explicit process(handle&& h) : task(h.release()) {}
+  explicit process(handle&& h) : task(h.release()) {}
 
-    process(process&& other) : task(other.release()) {}
+  process(process&& other) : task(other.release()) {}
 
-    process& operator=(process&& other) {
-        reset(other.release());
-        return *this;
-    }
+  process& operator=(process&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    // Rather than creating a process directly with this syscall,
-    // consider using the launchpad library, which properly sets up
-    // the many details of creating a process beyond simply creating
-    // the kernel structure.
-    static zx_status_t create(const job& job, const char* name, uint32_t name_len,
-                              uint32_t flags, process* proc, vmar* root_vmar);
+  // Rather than creating a process directly with this syscall,
+  // consider using the launchpad library, which properly sets up
+  // the many details of creating a process beyond simply creating
+  // the kernel structure.
+  static zx_status_t create(const job& job, const char* name, uint32_t name_len, uint32_t flags,
+                            process* proc, vmar* root_vmar);
 
-    zx_status_t start(const thread& thread_handle, uintptr_t entry,
-                      uintptr_t stack, handle arg_handle, uintptr_t arg2) const;
+  zx_status_t start(const thread& thread_handle, uintptr_t entry, uintptr_t stack,
+                    handle arg_handle, uintptr_t arg2) const;
 
-    zx_status_t read_memory(uintptr_t vaddr, void* buffer, size_t len, size_t* actual) const {
-        return zx_process_read_memory(get(), vaddr, buffer, len, actual);
-    }
+  zx_status_t read_memory(uintptr_t vaddr, void* buffer, size_t len, size_t* actual) const {
+    return zx_process_read_memory(get(), vaddr, buffer, len, actual);
+  }
 
-    zx_status_t write_memory(uintptr_t vaddr, const void* buffer, size_t len, size_t* actual) {
-        return zx_process_write_memory(get(), vaddr, buffer, len, actual);
-    }
+  zx_status_t write_memory(uintptr_t vaddr, const void* buffer, size_t len, size_t* actual) const {
+    return zx_process_write_memory(get(), vaddr, buffer, len, actual);
+  }
 
-    // Provide strongly-typed overload, in addition to get_child(handle*).
-    using task<process>::get_child;
-    zx_status_t get_child(uint64_t koid, zx_rights_t rights,
-                          thread* result) const;
+  // Provide strongly-typed overload, in addition to get_child(handle*).
+  using task<process>::get_child;
+  zx_status_t get_child(uint64_t koid, zx_rights_t rights, thread* result) const;
 
-    static inline unowned<process> self() {
-        return unowned<process>(zx_process_self());
-    }
+  static inline unowned<process> self() { return unowned<process>(zx_process_self()); }
 };
 
 using unowned_process = unowned<process>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_PROCESS_H_
diff --git a/pkg/zx/include/lib/zx/profile.h b/pkg/zx/include/lib/zx/profile.h
index ddc3fe3..fa3814f 100644
--- a/pkg/zx/include/lib/zx/profile.h
+++ b/pkg/zx/include/lib/zx/profile.h
@@ -6,33 +6,34 @@
 #define LIB_ZX_PROFILE_H_
 
 #include <lib/zx/handle.h>
+#include <lib/zx/job.h>
 #include <lib/zx/object.h>
-#include <lib/zx/resource.h>
 
 namespace zx {
 
-class profile : public object<profile> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_LOG;
+class profile final : public object<profile> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_PROFILE;
 
-    constexpr profile() = default;
+  constexpr profile() = default;
 
-    explicit profile(zx_handle_t value) : object(value) {}
+  explicit profile(zx_handle_t value) : object(value) {}
 
-    explicit profile(handle&& h) : object(h.release()) {}
+  explicit profile(handle&& h) : object(h.release()) {}
 
-    profile(profile&& other) : object(other.release()) {}
+  profile(profile&& other) : object(other.release()) {}
 
-    profile& operator=(profile&& other) {
-        reset(other.release());
-        return *this;
-    }
+  profile& operator=(profile&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& resource, const zx_profile_info_t* info, profile* result);
+  static zx_status_t create(const job& job, uint32_t options, const zx_profile_info_t* info,
+                            profile* result);
 };
 
 using unowned_profile = unowned<profile>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_PROFILE_H_
diff --git a/pkg/zx/include/lib/zx/resource.h b/pkg/zx/include/lib/zx/resource.h
index 4909868..0f3afd1 100644
--- a/pkg/zx/include/lib/zx/resource.h
+++ b/pkg/zx/include/lib/zx/resource.h
@@ -10,34 +10,29 @@
 
 namespace zx {
 
-class resource : public object<resource> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_RESOURCE;
+class resource final : public object<resource> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_RESOURCE;
 
-    constexpr resource() = default;
+  constexpr resource() = default;
 
-    explicit resource(zx_handle_t value) : object(value) {}
+  explicit resource(zx_handle_t value) : object(value) {}
 
-    explicit resource(handle&& h) : object(h.release()) {}
+  explicit resource(handle&& h) : object(h.release()) {}
 
-    resource(resource&& other) : object(other.release()) {}
+  resource(resource&& other) : object(other.release()) {}
 
-    resource& operator=(resource&& other) {
-        reset(other.release());
-        return *this;
-    }
+  resource& operator=(resource&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const resource& parent,
-                              uint32_t options,
-                              uint64_t base,
-                              size_t len,
-                              const char* name,
-                              size_t namelen,
-                              resource* result);
+  static zx_status_t create(const resource& parent, uint32_t options, uint64_t base, size_t len,
+                            const char* name, size_t namelen, resource* result);
 };
 
 using unowned_resource = unowned<resource>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_RESOURCE_H_
diff --git a/pkg/zx/include/lib/zx/socket.h b/pkg/zx/include/lib/zx/socket.h
index 180e1fa..d1563e3 100644
--- a/pkg/zx/include/lib/zx/socket.h
+++ b/pkg/zx/include/lib/zx/socket.h
@@ -10,56 +10,38 @@
 
 namespace zx {
 
-class socket : public object<socket> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_SOCKET;
+class socket final : public object<socket> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_SOCKET;
 
-    constexpr socket() = default;
+  constexpr socket() = default;
 
-    explicit socket(zx_handle_t value) : object(value) {}
+  explicit socket(zx_handle_t value) : object(value) {}
 
-    explicit socket(handle&& h) : object(h.release()) {}
+  explicit socket(handle&& h) : object(h.release()) {}
 
-    socket(socket&& other) : object(other.release()) {}
+  socket(socket&& other) : object(other.release()) {}
 
-    socket& operator=(socket&& other) {
-        reset(other.release());
-        return *this;
-    }
+  socket& operator=(socket&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t options, socket* endpoint0,
-                              socket* endpoint1);
+  static zx_status_t create(uint32_t options, socket* endpoint0, socket* endpoint1);
 
-    zx_status_t write(uint32_t options, const void* buffer, size_t len,
-                      size_t* actual) const {
-        return zx_socket_write(get(), options, buffer, len, actual);
-    }
+  zx_status_t write(uint32_t options, const void* buffer, size_t len, size_t* actual) const {
+    return zx_socket_write(get(), options, buffer, len, actual);
+  }
 
-    zx_status_t read(uint32_t options, void* buffer, size_t len,
-                     size_t* actual) const {
-        return zx_socket_read(get(), options, buffer, len, actual);
-    }
+  zx_status_t read(uint32_t options, void* buffer, size_t len, size_t* actual) const {
+    return zx_socket_read(get(), options, buffer, len, actual);
+  }
 
-    zx_status_t share(socket socket_to_share) const {
-        return zx_socket_share(get(), socket_to_share.release());
-    }
-
-    zx_status_t accept(socket* out_socket) const {
-        // We use a temporary to handle the case where |this| and |out_socket|
-        // are aliased.
-        socket result;
-        zx_status_t status = zx_socket_accept(get(), result.reset_and_get_address());
-        out_socket->reset(result.release());
-        return status;
-    }
-
-    zx_status_t shutdown(uint32_t options) const {
-        return zx_socket_shutdown(get(), options);
-    }
+  zx_status_t shutdown(uint32_t options) const { return zx_socket_shutdown(get(), options); }
 };
 
 using unowned_socket = unowned<socket>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_SOCKET_H_
diff --git a/pkg/zx/include/lib/zx/stream.h b/pkg/zx/include/lib/zx/stream.h
new file mode 100644
index 0000000..1d7080a
--- /dev/null
+++ b/pkg/zx/include/lib/zx/stream.h
@@ -0,0 +1,66 @@
+// Copyright 2020 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.
+
+#ifndef LIB_ZX_STREAM_H_
+#define LIB_ZX_STREAM_H_
+
+#include <lib/zx/handle.h>
+#include <lib/zx/object.h>
+#include <lib/zx/vmo.h>
+
+namespace zx {
+
+class stream final : public object<stream> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_STREAM;
+
+  constexpr stream() = default;
+
+  explicit stream(zx_handle_t value) : object(value) {}
+
+  explicit stream(handle&& h) : object(h.release()) {}
+
+  stream(stream&& other) : object(other.release()) {}
+
+  stream& operator=(stream&& other) {
+    reset(other.release());
+    return *this;
+  }
+
+  static zx_status_t create(uint32_t options, const vmo& vmo_handle, zx_off_t seek,
+                            stream* out_stream);
+
+  zx_status_t writev(uint32_t options, const zx_iovec_t* vector, size_t vector_count,
+                     size_t* actual) const {
+    return zx_stream_writev(get(), options, vector, vector_count, actual);
+  }
+
+  zx_status_t writev_at(uint32_t options, zx_off_t offset, const zx_iovec_t* vector,
+                        size_t vector_count, size_t* actual) const {
+    return zx_stream_writev_at(get(), options, offset, vector, vector_count, actual);
+  }
+
+  zx_status_t readv(uint32_t options, const zx_iovec_t* vector, size_t vector_count,
+                    size_t* actual) const {
+    // TODO: zx_stream_readv should accept a |const zx_iovec_t*|.
+    return zx_stream_readv(get(), options, const_cast<zx_iovec_t*>(vector), vector_count, actual);
+  }
+
+  zx_status_t readv_at(uint32_t options, zx_off_t offset, const zx_iovec_t* vector,
+                       size_t vector_count, size_t* actual) const {
+    // TODO: zx_stream_readv should accept a |const zx_iovec_t*|.
+    return zx_stream_readv_at(get(), options, offset, const_cast<zx_iovec_t*>(vector), vector_count,
+                              actual);
+  }
+
+  zx_status_t seek(zx_stream_seek_origin_t whence, int64_t offset, zx_off_t* out_seek) const {
+    return zx_stream_seek(get(), whence, offset, out_seek);
+  }
+};
+
+using unowned_stream = unowned<stream>;
+
+}  // namespace zx
+
+#endif  // LIB_ZX_STREAM_H_
diff --git a/pkg/zx/include/lib/zx/suspend_token.h b/pkg/zx/include/lib/zx/suspend_token.h
index 8eba2df..691094f 100644
--- a/pkg/zx/include/lib/zx/suspend_token.h
+++ b/pkg/zx/include/lib/zx/suspend_token.h
@@ -12,24 +12,24 @@
 
 // The only thing you can do with a suspend token is close it (which will
 // resume the thread).
-class suspend_token : public object<suspend_token> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_SUSPEND_TOKEN;
+class suspend_token final : public object<suspend_token> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_SUSPEND_TOKEN;
 
-    constexpr suspend_token() = default;
+  constexpr suspend_token() = default;
 
-    explicit suspend_token(zx_handle_t value) : object<suspend_token>(value) {}
+  explicit suspend_token(zx_handle_t value) : object<suspend_token>(value) {}
 
-    explicit suspend_token(handle&& h) : object<suspend_token>(h.release()) {}
+  explicit suspend_token(handle&& h) : object<suspend_token>(h.release()) {}
 
-    suspend_token(suspend_token&& other) : object<suspend_token>(other.release()) {}
+  suspend_token(suspend_token&& other) : object<suspend_token>(other.release()) {}
 
-    suspend_token& operator=(suspend_token&& other) {
-        reset(other.release());
-        return *this;
-    }
+  suspend_token& operator=(suspend_token&& other) {
+    reset(other.release());
+    return *this;
+  }
 };
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_SUSPEND_TOKEN_H_
diff --git a/pkg/zx/include/lib/zx/task.h b/pkg/zx/include/lib/zx/task.h
index a3bc20d..ef1ec78 100644
--- a/pkg/zx/include/lib/zx/task.h
+++ b/pkg/zx/include/lib/zx/task.h
@@ -5,6 +5,7 @@
 #ifndef LIB_ZX_TASK_H_
 #define LIB_ZX_TASK_H_
 
+#include <lib/zx/channel.h>
 #include <lib/zx/handle.h>
 #include <lib/zx/object.h>
 #include <lib/zx/suspend_token.h>
@@ -14,38 +15,33 @@
 class port;
 class suspend_token;
 
-template <typename T = void> class task : public object<T> {
-public:
-    constexpr task() = default;
+template <typename T = void>
+class task : public object<T> {
+ public:
+  constexpr task() = default;
 
-    explicit task(zx_handle_t value) : object<T>(value) {}
+  explicit task(zx_handle_t value) : object<T>(value) {}
 
-    explicit task(handle&& h) : object<T>(h.release()) {}
+  explicit task(handle&& h) : object<T>(h.release()) {}
 
-    task(task&& other) : object<T>(other.release()) {}
+  task(task&& other) : object<T>(other.release()) {}
 
-    zx_status_t bind_exception_port(
-            const object<port>& port, uint64_t key, uint32_t options) const {
-        return zx_task_bind_exception_port(object<T>::get(), port.get(), key, options);
-    }
+  zx_status_t kill() const {
+    static_assert(object_traits<T>::supports_kill, "Object must support being killed.");
+    return zx_task_kill(object<T>::get()); }
 
-    zx_status_t kill() const { return zx_task_kill(object<T>::get()); }
+  zx_status_t suspend(suspend_token* result) const {
+    // Assume |result| must refer to a different container than |this|, due
+    // to strict aliasing.
+    return zx_task_suspend_token(object<T>::get(), result->reset_and_get_address());
+  }
 
-    // Deprecated: Use the variant that takes a suspend_token.
-    zx_status_t suspend() const { return zx_task_suspend(object<T>::get()); }
-
-    zx_status_t suspend(suspend_token* result) const {
-        // Assume |result| must refer to a different container than |this|, due
-        // to strict aliasing.
-        return zx_task_suspend_token(
-            object<T>::get(), result->reset_and_get_address());
-    }
-
-    zx_status_t resume_from_exception(const object<port>& port, uint32_t options) const {
-        return zx_task_resume_from_exception(object<T>::get(), port.get(), options);
-    }
+  zx_status_t create_exception_channel(uint32_t options, object<channel>* channel) const {
+    return zx_task_create_exception_channel(object<T>::get(), options,
+                                            channel->reset_and_get_address());
+  }
 };
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_TASK_H_
diff --git a/pkg/zx/include/lib/zx/thread.h b/pkg/zx/include/lib/zx/thread.h
index eabf3ed..bb80bc6 100644
--- a/pkg/zx/include/lib/zx/thread.h
+++ b/pkg/zx/include/lib/zx/thread.h
@@ -12,61 +12,53 @@
 namespace zx {
 class process;
 
-class thread : public task<thread> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_THREAD;
+class thread final : public task<thread> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_THREAD;
 
-    constexpr thread() = default;
+  constexpr thread() = default;
 
-    explicit thread(zx_handle_t value)
-        : task(value) {}
+  explicit thread(zx_handle_t value) : task(value) {}
 
-    explicit thread(handle&& h)
-        : task(h.release()) {}
+  explicit thread(handle&& h) : task(h.release()) {}
 
-    thread(thread&& other)
-        : task(other.release()) {}
+  thread(thread&& other) : task(other.release()) {}
 
-    thread& operator=(thread&& other) {
-        reset(other.release());
-        return *this;
-    }
+  thread& operator=(thread&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    // Rather than creating a thread directly with this syscall, consider using
-    // std::thread or thrd_create, which properly integrates with the
-    // thread-local data structures in libc.
-    static zx_status_t create(const process& process, const char* name,
-                              uint32_t name_len, uint32_t flags,
-                              thread* result);
+  // Rather than creating a thread directly with this syscall, consider using
+  // std::thread or thrd_create, which properly integrates with the
+  // thread-local data structures in libc.
+  static zx_status_t create(const process& process, const char* name, uint32_t name_len,
+                            uint32_t flags, thread* result);
 
-    // The first variant maps exactly to the syscall and can be used for
-    // launching threads in remote processes. The second variant is for
-    // conveniently launching threads in the current process.
-    zx_status_t start(uintptr_t thread_entry, uintptr_t stack, uintptr_t arg1,
-                      uintptr_t arg2) const {
-        return zx_thread_start(get(), thread_entry, stack, arg1, arg2);
-    }
-    zx_status_t start(void (*thread_entry)(uintptr_t arg1, uintptr_t arg2),
-                      void* stack, uintptr_t arg1, uintptr_t arg2) {
-        return zx_thread_start(get(),
-                               reinterpret_cast<uintptr_t>(thread_entry),
-                               reinterpret_cast<uintptr_t>(stack), arg1, arg2);
-    }
+  // The first variant maps exactly to the syscall and can be used for
+  // launching threads in remote processes. The second variant is for
+  // conveniently launching threads in the current process.
+  zx_status_t start(uintptr_t thread_entry, uintptr_t stack, uintptr_t arg1, uintptr_t arg2) const {
+    return zx_thread_start(get(), thread_entry, stack, arg1, arg2);
+  }
+  zx_status_t start(void (*thread_entry)(uintptr_t arg1, uintptr_t arg2), void* stack,
+                    uintptr_t arg1, uintptr_t arg2) const {
+    return zx_thread_start(get(), reinterpret_cast<uintptr_t>(thread_entry),
+                           reinterpret_cast<uintptr_t>(stack), arg1, arg2);
+  }
 
-    zx_status_t read_state(uint32_t kind, void* buffer, size_t len) const {
-        return zx_thread_read_state(get(), kind, buffer, len);
-    }
-    zx_status_t write_state(uint32_t kind, const void* buffer, size_t len) {
-        return zx_thread_write_state(get(), kind, buffer, len);
-    }
+  zx_status_t read_state(uint32_t kind, void* buffer, size_t len) const {
+    return zx_thread_read_state(get(), kind, buffer, len);
+  }
+  zx_status_t write_state(uint32_t kind, const void* buffer, size_t len) const {
+    return zx_thread_write_state(get(), kind, buffer, len);
+  }
 
-    static inline unowned<thread> self() {
-        return unowned<thread>(zx_thread_self());
-    }
+  static inline unowned<thread> self() { return unowned<thread>(zx_thread_self()); }
 };
 
 using unowned_thread = unowned<thread>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_THREAD_H_
diff --git a/pkg/zx/include/lib/zx/time.h b/pkg/zx/include/lib/zx/time.h
index 101e057..7ee0b02 100644
--- a/pkg/zx/include/lib/zx/time.h
+++ b/pkg/zx/include/lib/zx/time.h
@@ -10,224 +10,284 @@
 #include <zircon/syscalls.h>
 #include <zircon/time.h>
 
+#include <ctime>
+#include <limits>
+
 namespace zx {
 
-class duration {
-public:
-    constexpr duration() = default;
+class duration final {
+ public:
+  constexpr duration() = default;
 
-    explicit constexpr duration(zx_duration_t value)
-        : value_(value) {}
+  explicit constexpr duration(zx_duration_t value) : value_(value) {}
 
-    static constexpr duration infinite() { return duration(ZX_TIME_INFINITE); }
+#if __cplusplus >= 201703L
+  explicit constexpr duration(std::timespec ts) : value_(zx_duration_from_timespec(ts)) {}
+#endif
 
-    static constexpr duration infinite_past() { return duration(ZX_TIME_INFINITE_PAST); }
+  static constexpr duration infinite() { return duration(ZX_TIME_INFINITE); }
 
-    constexpr zx_duration_t get() const { return value_; }
+  static constexpr duration infinite_past() { return duration(ZX_TIME_INFINITE_PAST); }
 
-    constexpr duration operator+(duration other) const {
-        return duration(zx_duration_add_duration(value_, other.value_));
-    }
+  constexpr zx_duration_t get() const { return value_; }
 
-    constexpr duration operator-(duration other) const {
-        return duration(zx_duration_sub_duration(value_, other.value_));
-    }
+  constexpr duration operator+(duration other) const {
+    return duration(zx_duration_add_duration(value_, other.value_));
+  }
 
-    constexpr duration operator*(int64_t multiplier) const {
-        return duration(zx_duration_mul_int64(value_, multiplier));
-    }
+  constexpr duration operator-(duration other) const {
+    return duration(zx_duration_sub_duration(value_, other.value_));
+  }
 
-    constexpr duration operator/(int64_t divisor) const {
-        return duration(value_ / divisor);
-    }
+  constexpr duration operator*(int64_t multiplier) const {
+    return duration(zx_duration_mul_int64(value_, multiplier));
+  }
 
-    constexpr duration operator%(duration divisor) const {
-        return duration(value_ % divisor.value_);
-    }
+  constexpr duration operator/(int64_t divisor) const { return duration(value_ / divisor); }
 
-    constexpr int64_t operator/(duration other) const {
-        return value_ / other.value_;
-    }
+  constexpr int64_t operator/(duration other) const { return value_ / other.value_; }
 
-    constexpr duration& operator+=(duration other) {
-        value_ = zx_duration_add_duration(value_, other.value_);
-        return *this;
-    }
+  constexpr duration operator%(int64_t divisor) const { return duration(value_ % divisor); }
 
-    constexpr duration& operator-=(duration other) {
-        value_ = zx_duration_sub_duration(value_, other.value_);
-        return *this;
-    }
+  constexpr int64_t operator%(duration other) const { return value_ % other.value_; }
 
-    constexpr duration& operator*=(int64_t multiplier) {
-        value_ = zx_duration_mul_int64(value_, multiplier);
-        return *this;
-    }
+  constexpr duration& operator+=(duration other) {
+    value_ = zx_duration_add_duration(value_, other.value_);
+    return *this;
+  }
 
-    constexpr duration& operator/=(int64_t divisor) {
-        value_ /= divisor;
-        return *this;
-    }
+  constexpr duration& operator-=(duration other) {
+    value_ = zx_duration_sub_duration(value_, other.value_);
+    return *this;
+  }
 
-    constexpr bool operator==(duration other) const { return value_ == other.value_; }
-    constexpr bool operator!=(duration other) const { return value_ != other.value_; }
-    constexpr bool operator<(duration other) const { return value_ < other.value_; }
-    constexpr bool operator<=(duration other) const { return value_ <= other.value_; }
-    constexpr bool operator>(duration other) const { return value_ > other.value_; }
-    constexpr bool operator>=(duration other) const { return value_ >= other.value_; }
+  constexpr duration& operator*=(int64_t multiplier) {
+    value_ = zx_duration_mul_int64(value_, multiplier);
+    return *this;
+  }
 
-    constexpr int64_t to_nsecs() const { return value_; }
+  constexpr duration& operator/=(int64_t divisor) {
+    value_ /= divisor;
+    return *this;
+  }
 
-    constexpr int64_t to_usecs() const { return value_ / ZX_USEC(1); }
+  constexpr duration& operator%=(int64_t divisor) {
+    value_ %= divisor;
+    return *this;
+  }
 
-    constexpr int64_t to_msecs() const { return value_ / ZX_MSEC(1); }
+  constexpr bool operator==(duration other) const { return value_ == other.value_; }
+  constexpr bool operator!=(duration other) const { return value_ != other.value_; }
+  constexpr bool operator<(duration other) const { return value_ < other.value_; }
+  constexpr bool operator<=(duration other) const { return value_ <= other.value_; }
+  constexpr bool operator>(duration other) const { return value_ > other.value_; }
+  constexpr bool operator>=(duration other) const { return value_ >= other.value_; }
 
-    constexpr int64_t to_secs() const { return value_ / ZX_SEC(1); }
+  constexpr int64_t to_nsecs() const { return value_; }
 
-    constexpr int64_t to_mins() const { return value_ / ZX_MIN(1); }
+  constexpr int64_t to_usecs() const { return value_ / ZX_USEC(1); }
 
-    constexpr int64_t to_hours() const { return value_ / ZX_HOUR(1); }
+  constexpr int64_t to_msecs() const { return value_ / ZX_MSEC(1); }
 
-private:
-    zx_duration_t value_ = 0;
+  constexpr int64_t to_secs() const { return value_ / ZX_SEC(1); }
+
+  constexpr int64_t to_mins() const { return value_ / ZX_MIN(1); }
+
+  constexpr int64_t to_hours() const { return value_ / ZX_HOUR(1); }
+
+#if __cplusplus >= 201703L
+  constexpr std::timespec to_timespec() const { return zx_timespec_from_duration(value_); }
+#endif
+
+ private:
+  zx_duration_t value_ = 0;
 };
 
-class ticks {
-public:
-    constexpr ticks() = default;
+class ticks final {
+ public:
+  constexpr ticks() = default;
 
-    explicit constexpr ticks(zx_ticks_t value) : value_(value) {}
+  explicit constexpr ticks(zx_ticks_t value) : value_(value) {}
 
-    // Constructs a tick object for the current tick counter in the system.
-    static ticks now() { return ticks(zx_ticks_get()); }
+  // Constructs a tick object for the current tick counter in the system.
+  static ticks now() { return ticks(zx_ticks_get()); }
 
-    // Returns the number of ticks contained within one second.
-    static ticks per_second() { return ticks(zx_ticks_per_second()); }
+  // Returns the number of ticks contained within one second.
+  static ticks per_second() { return ticks(zx_ticks_per_second()); }
 
-    // Acquires the number of ticks contained within this object.
-    constexpr zx_ticks_t get() const { return value_; }
+  // Acquires the number of ticks contained within this object.
+  constexpr zx_ticks_t get() const { return value_; }
 
-    constexpr ticks operator+(ticks other) const {
-        return ticks(value_ + other.value_);
+  static constexpr ticks infinite() { return ticks(INFINITE); }
+
+  static constexpr ticks infinite_past() { return ticks(INFINITE_PAST); }
+
+  constexpr ticks operator+(ticks other) const {
+    zx_ticks_t x = 0;
+
+    if (unlikely(add_overflow(value_, other.value_, &x))) {
+      if (x >= 0) {
+        return infinite_past();
+      } else {
+        return infinite();
+      }
     }
 
-    constexpr ticks operator-(ticks other) const {
-        return ticks(value_ - other.value_);
+    return ticks(x);
+  }
+
+  constexpr ticks operator-(ticks other) const {
+    zx_ticks_t x = 0;
+
+    if (unlikely(sub_overflow(value_, other.value_, &x))) {
+      if (x >= 0) {
+        return infinite_past();
+      } else {
+        return infinite();
+      }
     }
 
-    constexpr ticks operator*(uint64_t multiplier) const {
-        return ticks(value_ * multiplier);
+    return ticks(x);
+  }
+
+  constexpr ticks operator*(uint64_t multiplier) const {
+    zx_ticks_t x = 0;
+
+    if (unlikely(mul_overflow(value_, multiplier, &x))) {
+      if (value_ < 0) {
+        return infinite_past();
+      } else {
+        return infinite();
+      }
     }
 
-    constexpr ticks operator/(uint64_t divisor) const {
-        return ticks(value_ / divisor);
-    }
+    return ticks(x);
+  }
 
-    constexpr uint64_t operator/(ticks other) const {
-        return value_ / other.value_;
-    }
+  constexpr ticks operator/(uint64_t divisor) const {
+    return ticks(static_cast<int64_t>(static_cast<uint64_t>(value_) / divisor));
+  }
 
-    constexpr ticks& operator+=(ticks other) {
-        value_ += other.value_;
-        return *this;
-    }
+  constexpr uint64_t operator/(ticks other) const {
+    return static_cast<uint64_t>(value_ / other.value_);
+  }
 
-    constexpr ticks& operator-=(ticks other) {
-        value_ -= other.value_;
-        return *this;
-    }
+  constexpr ticks operator%(uint64_t divisor) const {
+    return ticks(static_cast<int64_t>(static_cast<uint64_t>(value_) % divisor));
+  }
 
-    constexpr ticks& operator*=(uint64_t multiplier) {
-        value_ *= multiplier;
-        return *this;
-    }
+  constexpr uint64_t operator%(ticks other) const {
+    return static_cast<uint64_t>(value_ % other.value_);
+  }
 
-    constexpr ticks& operator/=(uint64_t divisor) {
-        value_ /= divisor;
-        return *this;
-    }
+  constexpr ticks& operator+=(ticks other) {
+    *this = *this + other;
+    return *this;
+  }
 
-    constexpr bool operator==(ticks other) const { return value_ == other.value_; }
-    constexpr bool operator!=(ticks other) const { return value_ != other.value_; }
-    constexpr bool operator<(ticks other) const { return value_ < other.value_; }
-    constexpr bool operator<=(ticks other) const { return value_ <= other.value_; }
-    constexpr bool operator>(ticks other) const { return value_ > other.value_; }
-    constexpr bool operator>=(ticks other) const { return value_ >= other.value_; }
+  constexpr ticks& operator-=(ticks other) {
+    *this = *this - other;
+    return *this;
+  }
 
-private:
-    zx_ticks_t value_ = 0;
+  constexpr ticks& operator*=(uint64_t multiplier) {
+    *this = *this * multiplier;
+    return *this;
+  }
+
+  constexpr ticks& operator/=(uint64_t divisor) {
+    value_ /= divisor;
+    return *this;
+  }
+
+  constexpr ticks& operator%=(uint64_t divisor) {
+    value_ %= divisor;
+    return *this;
+  }
+
+  constexpr bool operator==(ticks other) const { return value_ == other.value_; }
+  constexpr bool operator!=(ticks other) const { return value_ != other.value_; }
+  constexpr bool operator<(ticks other) const { return value_ < other.value_; }
+  constexpr bool operator<=(ticks other) const { return value_ <= other.value_; }
+  constexpr bool operator>(ticks other) const { return value_ > other.value_; }
+  constexpr bool operator>=(ticks other) const { return value_ >= other.value_; }
+
+ private:
+  static constexpr zx_ticks_t INFINITE = std::numeric_limits<zx_ticks_t>::max();
+  static constexpr zx_ticks_t INFINITE_PAST = std::numeric_limits<zx_ticks_t>::min();
+
+  zx_ticks_t value_ = 0;
 };
 
 template <zx_clock_t kClockId>
-class basic_time {
-public:
-    constexpr basic_time() = default;
+class basic_time final {
+ public:
+  constexpr basic_time() = default;
 
-    explicit constexpr basic_time(zx_time_t value) : value_(value) {}
+  explicit constexpr basic_time(zx_time_t value) : value_(value) {}
 
-    static constexpr basic_time<kClockId> infinite() {
-        return basic_time<kClockId>(ZX_TIME_INFINITE);
-    }
+#if __cplusplus >= 201703L
+  explicit constexpr basic_time(std::timespec ts) : value_(zx_time_from_timespec(ts)) {}
+#endif
 
-    static constexpr basic_time<kClockId> infinite_past() {
-        return basic_time<kClockId>(ZX_TIME_INFINITE_PAST);
-    }
+  static constexpr basic_time<kClockId> infinite() {
+    return basic_time<kClockId>(ZX_TIME_INFINITE);
+  }
 
-    constexpr zx_time_t get() const { return value_; }
+  static constexpr basic_time<kClockId> infinite_past() {
+    return basic_time<kClockId>(ZX_TIME_INFINITE_PAST);
+  }
 
-    zx_time_t* get_address() { return &value_; }
+  constexpr zx_time_t get() const { return value_; }
 
-    constexpr duration operator-(basic_time<kClockId> other) const {
-        return duration(zx_time_sub_time(value_, other.value_));
-    }
+  zx_time_t* get_address() { return &value_; }
 
-    constexpr basic_time<kClockId> operator+(duration delta) const {
-        return basic_time<kClockId>(zx_time_add_duration(value_, delta.get()));
-    }
+  constexpr duration operator-(basic_time<kClockId> other) const {
+    return duration(zx_time_sub_time(value_, other.value_));
+  }
 
-    constexpr basic_time<kClockId> operator-(duration delta) const {
-        return basic_time<kClockId>(zx_time_sub_duration(value_, delta.get()));
-    }
+  constexpr basic_time<kClockId> operator+(duration delta) const {
+    return basic_time<kClockId>(zx_time_add_duration(value_, delta.get()));
+  }
 
-    constexpr basic_time<kClockId>& operator+=(duration delta) {
-      value_ = zx_time_add_duration(value_, delta.get());
-      return *this;
-    }
+  constexpr basic_time<kClockId> operator-(duration delta) const {
+    return basic_time<kClockId>(zx_time_sub_duration(value_, delta.get()));
+  }
 
-    constexpr basic_time<kClockId>& operator-=(duration delta) {
-      value_ = zx_time_sub_duration(value_, delta.get());
-      return *this;
-    }
+  constexpr basic_time<kClockId>& operator+=(duration delta) {
+    value_ = zx_time_add_duration(value_, delta.get());
+    return *this;
+  }
 
-    constexpr bool operator==(basic_time<kClockId> other) const { return value_ == other.value_; }
-    constexpr bool operator!=(basic_time<kClockId> other) const { return value_ != other.value_; }
-    constexpr bool operator<(basic_time<kClockId> other) const { return value_ < other.value_; }
-    constexpr bool operator<=(basic_time<kClockId> other) const { return value_ <= other.value_; }
-    constexpr bool operator>(basic_time<kClockId> other) const { return value_ > other.value_; }
-    constexpr bool operator>=(basic_time<kClockId> other) const { return value_ >= other.value_; }
+  constexpr basic_time<kClockId>& operator-=(duration delta) {
+    value_ = zx_time_sub_duration(value_, delta.get());
+    return *this;
+  }
 
-private:
-    zx_time_t value_ = 0;
+  constexpr bool operator==(basic_time<kClockId> other) const { return value_ == other.value_; }
+  constexpr bool operator!=(basic_time<kClockId> other) const { return value_ != other.value_; }
+  constexpr bool operator<(basic_time<kClockId> other) const { return value_ < other.value_; }
+  constexpr bool operator<=(basic_time<kClockId> other) const { return value_ <= other.value_; }
+  constexpr bool operator>(basic_time<kClockId> other) const { return value_ > other.value_; }
+  constexpr bool operator>=(basic_time<kClockId> other) const { return value_ >= other.value_; }
+
+#if __cplusplus >= 201703L
+  constexpr std::timespec to_timespec() const { return zx_timespec_from_time(value_); }
+#endif
+
+ private:
+  zx_time_t value_ = 0;
 };
 
+template <zx_clock_t kClockId>
+constexpr basic_time<kClockId> operator+(duration delta, basic_time<kClockId> time) {
+  return time + delta;
+}
+
 using time = basic_time<ZX_CLOCK_MONOTONIC>;
 using time_utc = basic_time<ZX_CLOCK_UTC>;
 using time_thread = basic_time<ZX_CLOCK_THREAD>;
 
-class clock {
-public:
-    clock() = delete;
-
-    template <zx_clock_t kClockId>
-    static zx_status_t get(basic_time<kClockId>* result) {
-        return zx_clock_get_new(kClockId, result->get_address());
-    }
-
-    static time get_monotonic() {
-      return time(zx_clock_get_monotonic());
-    }
-};
-
 constexpr inline duration nsec(int64_t n) { return duration(ZX_NSEC(n)); }
 
 constexpr inline duration usec(int64_t n) { return duration(ZX_USEC(n)); }
@@ -240,14 +300,12 @@
 
 constexpr inline duration hour(int64_t n) { return duration(ZX_HOUR(n)); }
 
-inline zx_status_t nanosleep(zx::time deadline) {
-    return zx_nanosleep(deadline.get());
-}
+inline zx_status_t nanosleep(zx::time deadline) { return zx_nanosleep(deadline.get()); }
 
 inline time deadline_after(zx::duration nanoseconds) {
-    return time(zx_deadline_after(nanoseconds.get()));
+  return time(zx_deadline_after(nanoseconds.get()));
 }
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_TIME_H_
diff --git a/pkg/zx/include/lib/zx/timer.h b/pkg/zx/include/lib/zx/timer.h
index d7990ac..c119fc0 100644
--- a/pkg/zx/include/lib/zx/timer.h
+++ b/pkg/zx/include/lib/zx/timer.h
@@ -12,36 +12,34 @@
 
 namespace zx {
 
-class timer : public object<timer> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_TIMER;
+class timer final : public object<timer> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_TIMER;
 
-    constexpr timer() = default;
+  constexpr timer() = default;
 
-    explicit timer(zx_handle_t value) : object(value) {}
+  explicit timer(zx_handle_t value) : object(value) {}
 
-    explicit timer(handle&& h) : object(h.release()) {}
+  explicit timer(handle&& h) : object(h.release()) {}
 
-    timer(timer&& other) : object(other.release()) {}
+  timer(timer&& other) : object(other.release()) {}
 
-    timer& operator=(timer&& other) {
-        reset(other.release());
-        return *this;
-    }
+  timer& operator=(timer&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint32_t options, zx_clock_t clock_id, timer* result);
+  static zx_status_t create(uint32_t options, zx_clock_t clock_id, timer* result);
 
-    zx_status_t set(zx::time deadline, zx::duration slack) const {
-        return zx_timer_set(get(), deadline.get(), slack.get());
-    }
+  zx_status_t set(zx::time deadline, zx::duration slack) const {
+    return zx_timer_set(get(), deadline.get(), slack.get());
+  }
 
-    zx_status_t cancel() const {
-        return zx_timer_cancel(get());
-    }
+  zx_status_t cancel() const { return zx_timer_cancel(get()); }
 };
 
 using unowned_timer = unowned<timer>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_TIMER_H_
diff --git a/pkg/zx/include/lib/zx/vcpu.h b/pkg/zx/include/lib/zx/vcpu.h
index dac3f3a..565d6fd 100644
--- a/pkg/zx/include/lib/zx/vcpu.h
+++ b/pkg/zx/include/lib/zx/vcpu.h
@@ -12,45 +12,40 @@
 
 namespace zx {
 
-class vcpu : public object<vcpu> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VCPU;
+class vcpu final : public object<vcpu> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VCPU;
 
-    constexpr vcpu() = default;
+  constexpr vcpu() = default;
 
-    explicit vcpu(zx_handle_t value) : object(value) {}
+  explicit vcpu(zx_handle_t value) : object(value) {}
 
-    explicit vcpu(handle&& h) : object(h.release()) {}
+  explicit vcpu(handle&& h) : object(h.release()) {}
 
-    vcpu(vcpu&& other) : object(other.release()) {}
+  vcpu(vcpu&& other) : object(other.release()) {}
 
-    vcpu& operator=(vcpu&& other) {
-        reset(other.release());
-        return *this;
-    }
+  vcpu& operator=(vcpu&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(const guest& guest, uint32_t options,
-                              zx_gpaddr_t entry, vcpu* result);
+  static zx_status_t create(const guest& guest, uint32_t options, zx_gpaddr_t entry, vcpu* result);
 
-    zx_status_t resume(zx_port_packet_t* packet) {
-        return zx_vcpu_resume(get(), packet);
-    }
+  zx_status_t resume(zx_port_packet_t* packet) const { return zx_vcpu_resume(get(), packet); }
 
-    zx_status_t interrupt(uint32_t interrupt) {
-        return zx_vcpu_interrupt(get(), interrupt);
-    }
+  zx_status_t interrupt(uint32_t interrupt) const { return zx_vcpu_interrupt(get(), interrupt); }
 
-    zx_status_t read_state(uint32_t kind, void* buf, size_t len) const {
-        return zx_vcpu_read_state(get(), kind, buf, len);
-    }
+  zx_status_t read_state(uint32_t kind, void* buf, size_t len) const {
+    return zx_vcpu_read_state(get(), kind, buf, len);
+  }
 
-    zx_status_t write_state(uint32_t kind, const void* buf, size_t len) {
-        return zx_vcpu_write_state(get(), kind, buf, len);
-    }
+  zx_status_t write_state(uint32_t kind, const void* buf, size_t len) const {
+    return zx_vcpu_write_state(get(), kind, buf, len);
+  }
 };
 
 using unowned_vcpu = unowned<vcpu>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_VCPU_H_
diff --git a/pkg/zx/include/lib/zx/vmar.h b/pkg/zx/include/lib/zx/vmar.h
index 1553110..b861b33 100644
--- a/pkg/zx/include/lib/zx/vmar.h
+++ b/pkg/zx/include/lib/zx/vmar.h
@@ -13,50 +13,57 @@
 
 // A wrapper for handles to VMARs.  Note that vmar::~vmar() does not execute
 // vmar::destroy(), it just closes the handle.
-class vmar : public object<vmar> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VMAR;
+class vmar final : public object<vmar> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VMAR;
 
-    constexpr vmar() = default;
+  constexpr vmar() = default;
 
-    explicit vmar(zx_handle_t value) : object(value) {}
+  explicit vmar(zx_handle_t value) : object(value) {}
 
-    explicit vmar(handle&& h) : object(h.release()) {}
+  explicit vmar(handle&& h) : object(h.release()) {}
 
-    vmar(vmar&& other) : vmar(other.release()) {}
+  vmar(vmar&& other) : vmar(other.release()) {}
 
-    vmar& operator=(vmar&& other) {
-        reset(other.release());
-        return *this;
-    }
+  vmar& operator=(vmar&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    zx_status_t map(size_t vmar_offset, const vmo& vmo_handle, uint64_t vmo_offset,
-                    size_t len, zx_vm_option_t options, uintptr_t* ptr) const {
-        return zx_vmar_map(get(), options, vmar_offset, vmo_handle.get(), vmo_offset, len, ptr);
-    }
+  // DEPRECATED: Argument order does not match the C version.
+  zx_status_t map(size_t vmar_offset, const vmo& vmo_handle, uint64_t vmo_offset, size_t len,
+                  zx_vm_option_t options, zx_vaddr_t* ptr) const {
+    return zx_vmar_map(get(), options, vmar_offset, vmo_handle.get(), vmo_offset, len, ptr);
+  }
 
-    zx_status_t unmap(uintptr_t address, size_t len) const {
-        return zx_vmar_unmap(get(), address, len);
-    }
+  zx_status_t map(zx_vm_option_t options, size_t vmar_offset, const vmo& vmo_handle,
+                  uint64_t vmo_offset, size_t len, zx_vaddr_t* ptr) const {
+    return zx_vmar_map(get(), options, vmar_offset, vmo_handle.get(), vmo_offset, len, ptr);
+  }
 
-    zx_status_t protect(uintptr_t address, size_t len, zx_vm_option_t prot) const {
-        return zx_vmar_protect(get(), prot, address, len);
-    }
+  zx_status_t unmap(uintptr_t address, size_t len) const {
+    return zx_vmar_unmap(get(), address, len);
+  }
 
-    zx_status_t destroy() const {
-        return zx_vmar_destroy(get());
-    }
+  zx_status_t protect2(zx_vm_option_t prot, uintptr_t address, size_t len) const {
+    return zx_vmar_protect(get(), prot, address, len);
+  }
 
-    zx_status_t allocate(size_t offset, size_t size, uint32_t flags,
-                         vmar* child, uintptr_t* child_addr) const;
+  zx_status_t op_range(uint32_t op, uint64_t offset, uint64_t size, void* buffer,
+                       size_t buffer_size) const {
+    return zx_vmar_op_range(get(), op, offset, size, buffer, buffer_size);
+  }
 
-    static inline unowned<vmar> root_self() {
-        return unowned<vmar>(zx_vmar_root_self());
-    }
+  zx_status_t destroy() const { return zx_vmar_destroy(get()); }
+
+  zx_status_t allocate2(uint32_t options, size_t offset, size_t size, vmar* child,
+                        uintptr_t* child_addr) const;
+
+  static inline unowned<vmar> root_self() { return unowned<vmar>(zx_vmar_root_self()); }
 };
 
 using unowned_vmar = unowned<vmar>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_VMAR_H_
diff --git a/pkg/zx/include/lib/zx/vmo.h b/pkg/zx/include/lib/zx/vmo.h
index 82e2cab..ae168a6 100644
--- a/pkg/zx/include/lib/zx/vmo.h
+++ b/pkg/zx/include/lib/zx/vmo.h
@@ -13,77 +13,72 @@
 
 class bti;
 
-class vmo : public object<vmo> {
-public:
-    static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VMO;
+class vmo final : public object<vmo> {
+ public:
+  static constexpr zx_obj_type_t TYPE = ZX_OBJ_TYPE_VMO;
 
-    constexpr vmo() = default;
+  constexpr vmo() = default;
 
-    explicit vmo(zx_handle_t value) : object(value) {}
+  explicit vmo(zx_handle_t value) : object(value) {}
 
-    explicit vmo(handle&& h) : object(h.release()) {}
+  explicit vmo(handle&& h) : object(h.release()) {}
 
-    vmo(vmo&& other) : object(other.release()) {}
+  vmo(vmo&& other) : object(other.release()) {}
 
-    vmo& operator=(vmo&& other) {
-        reset(other.release());
-        return *this;
-    }
+  vmo& operator=(vmo&& other) {
+    reset(other.release());
+    return *this;
+  }
 
-    static zx_status_t create(uint64_t size, uint32_t options, vmo* result);
-    static zx_status_t create_contiguous(
-        const bti& bti, size_t size, uint32_t alignment_log2, vmo* result);
-    static zx_status_t create_physical(
-        const resource& resource, zx_paddr_t paddr, size_t size, vmo* result);
+  static zx_status_t create(uint64_t size, uint32_t options, vmo* result);
+  static zx_status_t create_contiguous(const bti& bti, size_t size, uint32_t alignment_log2,
+                                       vmo* result);
+  static zx_status_t create_physical(const resource& resource, zx_paddr_t paddr, size_t size,
+                                     vmo* result);
 
-    zx_status_t read(void* data, uint64_t offset, size_t len) const {
-        return zx_vmo_read(get(), data, offset, len);
-    }
+  zx_status_t read(void* data, uint64_t offset, size_t len) const {
+    return zx_vmo_read(get(), data, offset, len);
+  }
 
-    zx_status_t write(const void* data, uint64_t offset, size_t len) const {
-        return zx_vmo_write(get(), data, offset, len);
-    }
+  zx_status_t write(const void* data, uint64_t offset, size_t len) const {
+    return zx_vmo_write(get(), data, offset, len);
+  }
 
-    zx_status_t get_size(uint64_t* size) const {
-        return zx_vmo_get_size(get(), size);
-    }
+  zx_status_t get_size(uint64_t* size) const { return zx_vmo_get_size(get(), size); }
 
-    zx_status_t set_size(uint64_t size) const {
-        return zx_vmo_set_size(get(), size);
-    }
+  zx_status_t set_size(uint64_t size) const { return zx_vmo_set_size(get(), size); }
 
-    zx_status_t clone(uint32_t options, uint64_t offset, uint64_t size,
-                      vmo* result) const {
-        // Allow for the caller aliasing |result| to |this|.
-        vmo h;
-        zx_status_t status = zx_vmo_clone(
-            get(), options, offset, size, h.reset_and_get_address());
-        result->reset(h.release());
-        return status;
-    }
+  zx_status_t create_child(uint32_t options, uint64_t offset, uint64_t size, vmo* result) const {
+    // Allow for the caller aliasing |result| to |this|.
+    vmo h;
+    zx_status_t status =
+        zx_vmo_create_child(get(), options, offset, size, h.reset_and_get_address());
+    result->reset(h.release());
+    return status;
+  }
 
-    zx_status_t op_range(uint32_t op, uint64_t offset, uint64_t size,
-                         void* buffer, size_t buffer_size) const {
-        return zx_vmo_op_range(get(), op, offset, size, buffer, buffer_size);
-    }
+  zx_status_t op_range(uint32_t op, uint64_t offset, uint64_t size, void* buffer,
+                       size_t buffer_size) const {
+    return zx_vmo_op_range(get(), op, offset, size, buffer, buffer_size);
+  }
 
-    zx_status_t set_cache_policy(uint32_t cache_policy) {
-        return zx_vmo_set_cache_policy(get(), cache_policy);
-    }
+  zx_status_t set_cache_policy(uint32_t cache_policy) const {
+    return zx_vmo_set_cache_policy(get(), cache_policy);
+  }
 
-    zx_status_t replace_as_executable(const handle& vmex, vmo* result) {
-        zx_handle_t h = ZX_HANDLE_INVALID;
-        zx_status_t status = zx_vmo_replace_as_executable(value_, vmex.get(), &h);
-        // We store ZX_HANDLE_INVALID to value_ before calling reset on result
-        // in case result == this.
-        value_ = ZX_HANDLE_INVALID;
-        result->reset(h);
-        return status;
-    }
+  zx_status_t replace_as_executable(const resource& vmex, vmo* result) {
+    zx_handle_t h = ZX_HANDLE_INVALID;
+    zx_status_t status = zx_vmo_replace_as_executable(value_, vmex.get(), &h);
+    // We store ZX_HANDLE_INVALID to value_ before calling reset on result
+    // in case result == this.
+    value_ = ZX_HANDLE_INVALID;
+    result->reset(h);
+    return status;
+  }
 };
 
 using unowned_vmo = unowned<vmo>;
 
-} // namespace zx
+}  // namespace zx
 
 #endif  // LIB_ZX_VMO_H_
diff --git a/pkg/zx/interrupt.cc b/pkg/zx/interrupt.cc
new file mode 100644
index 0000000..7cb0013
--- /dev/null
+++ b/pkg/zx/interrupt.cc
@@ -0,0 +1,18 @@
+// 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.
+
+#include <lib/zx/interrupt.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t interrupt::create(const resource& resource, uint32_t vector, uint32_t options,
+                              interrupt* result) {
+  // Assume |result| uses a distinct container from |resource|, due to
+  // strict aliasing.
+  return zx_interrupt_create(resource.get(), vector, options, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/interrupt.cpp b/pkg/zx/interrupt.cpp
deleted file mode 100644
index 609406d..0000000
--- a/pkg/zx/interrupt.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.
-
-#include <lib/zx/interrupt.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t interrupt::create(const resource& resource, uint32_t vector,
-                              uint32_t options, interrupt* result) {
-    // Assume |result| uses a distinct container from |resource|, due to
-    // strict aliasing.
-    return zx_interrupt_create(
-        resource.get(), vector, options, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/iommu.cc b/pkg/zx/iommu.cc
new file mode 100644
index 0000000..a059eea
--- /dev/null
+++ b/pkg/zx/iommu.cc
@@ -0,0 +1,16 @@
+// 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.
+
+#include <lib/zx/iommu.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t iommu::create(const resource& resource, uint32_t type, const void* desc,
+                          size_t desc_size, iommu* result) {
+  return zx_iommu_create(resource.get(), type, desc, desc_size, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/iommu.cpp b/pkg/zx/iommu.cpp
deleted file mode 100644
index ad3c078..0000000
--- a/pkg/zx/iommu.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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.
-
-#include <lib/zx/iommu.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t iommu::create(const resource& resource, uint32_t type, const void* desc,
-                          size_t desc_size, iommu* result) {
-    return zx_iommu_create(resource.get(), type, desc, desc_size, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/job.cc b/pkg/zx/job.cc
new file mode 100644
index 0000000..2a63ab0
--- /dev/null
+++ b/pkg/zx/job.cc
@@ -0,0 +1,26 @@
+// 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.
+
+#include <lib/zx/job.h>
+
+#include <lib/zx/process.h>
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t job::create(const job& parent, uint32_t flags, job* result) {
+  // Allow for aliasing of the same container to |result| and |parent|.
+  job h;
+  zx_status_t status = zx_job_create(parent.get(), flags, h.reset_and_get_address());
+  result->reset(h.release());
+  return status;
+}
+
+zx_status_t job::get_child(uint64_t koid, zx_rights_t rights, process* result) const {
+  // Assume |result| and |this| are distinct containers, due to strict
+  // aliasing.
+  return zx_object_get_child(value_, koid, rights, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/job.cpp b/pkg/zx/job.cpp
deleted file mode 100644
index 6989589..0000000
--- a/pkg/zx/job.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-#include <lib/zx/job.h>
-
-#include <lib/zx/process.h>
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t job::create(const job& parent, uint32_t flags, job* result) {
-    // Allow for aliasing of the same container to |result| and |parent|.
-    job h;
-    zx_status_t status =
-        zx_job_create(parent.get(), flags, h.reset_and_get_address());
-    result->reset(h.release());
-    return status;
-}
-
-zx_status_t job::get_child(uint64_t koid, zx_rights_t rights,
-                           process* result) const {
-    // Assume |result| and |this| are distinct containers, due to strict
-    // aliasing.
-    return zx_object_get_child(
-        value_, koid, rights, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/log.cpp b/pkg/zx/log.cpp
deleted file mode 100644
index 4c06b36..0000000
--- a/pkg/zx/log.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include <lib/zx/log.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t log::create(uint32_t flags, log* result) {
-    return zx_debuglog_create(ZX_HANDLE_INVALID, flags, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/meta.json b/pkg/zx/meta.json
index 27622e6..cefbaff 100644
--- a/pkg/zx/meta.json
+++ b/pkg/zx/meta.json
@@ -1,113 +1,68 @@
 {
-  "banjo_deps": [], 
-  "deps": [], 
-  "fidl_deps": [], 
-  "files": [
-    "pkg/zx/bti.cpp", 
-    "pkg/zx/channel.cpp", 
-    "pkg/zx/debuglog.cpp", 
-    "pkg/zx/event.cpp", 
-    "pkg/zx/eventpair.cpp", 
-    "pkg/zx/fifo.cpp", 
-    "pkg/zx/guest.cpp", 
-    "pkg/zx/interrupt.cpp", 
-    "pkg/zx/iommu.cpp", 
-    "pkg/zx/job.cpp", 
-    "pkg/zx/log.cpp", 
-    "pkg/zx/port.cpp", 
-    "pkg/zx/process.cpp", 
-    "pkg/zx/profile.cpp", 
-    "pkg/zx/resource.cpp", 
-    "pkg/zx/socket.cpp", 
-    "pkg/zx/thread.cpp", 
-    "pkg/zx/timer.cpp", 
-    "pkg/zx/vcpu.cpp", 
-    "pkg/zx/vmar.cpp", 
-    "pkg/zx/vmo.cpp", 
-    "pkg/zx/include/lib/zx/bti.h", 
-    "pkg/zx/include/lib/zx/channel.h", 
-    "pkg/zx/include/lib/zx/debuglog.h", 
-    "pkg/zx/include/lib/zx/event.h", 
-    "pkg/zx/include/lib/zx/eventpair.h", 
-    "pkg/zx/include/lib/zx/fifo.h", 
-    "pkg/zx/include/lib/zx/guest.h", 
-    "pkg/zx/include/lib/zx/handle.h", 
-    "pkg/zx/include/lib/zx/interrupt.h", 
-    "pkg/zx/include/lib/zx/iommu.h", 
-    "pkg/zx/include/lib/zx/job.h", 
-    "pkg/zx/include/lib/zx/log.h", 
-    "pkg/zx/include/lib/zx/object.h", 
-    "pkg/zx/include/lib/zx/object_traits.h", 
-    "pkg/zx/include/lib/zx/pmt.h", 
-    "pkg/zx/include/lib/zx/port.h", 
-    "pkg/zx/include/lib/zx/process.h", 
-    "pkg/zx/include/lib/zx/profile.h", 
-    "pkg/zx/include/lib/zx/resource.h", 
-    "pkg/zx/include/lib/zx/socket.h", 
-    "pkg/zx/include/lib/zx/suspend_token.h", 
-    "pkg/zx/include/lib/zx/task.h", 
-    "pkg/zx/include/lib/zx/thread.h", 
-    "pkg/zx/include/lib/zx/time.h", 
-    "pkg/zx/include/lib/zx/timer.h", 
-    "pkg/zx/include/lib/zx/vcpu.h", 
-    "pkg/zx/include/lib/zx/vmar.h", 
-    "pkg/zx/include/lib/zx/vmo.h"
-  ], 
+  "banjo_deps": [],
+  "deps": [],
+  "fidl_deps": [],
   "headers": [
-    "pkg/zx/include/lib/zx/bti.h", 
-    "pkg/zx/include/lib/zx/channel.h", 
-    "pkg/zx/include/lib/zx/debuglog.h", 
-    "pkg/zx/include/lib/zx/event.h", 
-    "pkg/zx/include/lib/zx/eventpair.h", 
-    "pkg/zx/include/lib/zx/fifo.h", 
-    "pkg/zx/include/lib/zx/guest.h", 
-    "pkg/zx/include/lib/zx/handle.h", 
-    "pkg/zx/include/lib/zx/interrupt.h", 
-    "pkg/zx/include/lib/zx/iommu.h", 
-    "pkg/zx/include/lib/zx/job.h", 
-    "pkg/zx/include/lib/zx/log.h", 
-    "pkg/zx/include/lib/zx/object.h", 
-    "pkg/zx/include/lib/zx/object_traits.h", 
-    "pkg/zx/include/lib/zx/pmt.h", 
-    "pkg/zx/include/lib/zx/port.h", 
-    "pkg/zx/include/lib/zx/process.h", 
-    "pkg/zx/include/lib/zx/profile.h", 
-    "pkg/zx/include/lib/zx/resource.h", 
-    "pkg/zx/include/lib/zx/socket.h", 
-    "pkg/zx/include/lib/zx/suspend_token.h", 
-    "pkg/zx/include/lib/zx/task.h", 
-    "pkg/zx/include/lib/zx/thread.h", 
-    "pkg/zx/include/lib/zx/time.h", 
-    "pkg/zx/include/lib/zx/timer.h", 
-    "pkg/zx/include/lib/zx/vcpu.h", 
-    "pkg/zx/include/lib/zx/vmar.h", 
+    "pkg/zx/include/lib/zx/bti.h",
+    "pkg/zx/include/lib/zx/channel.h",
+    "pkg/zx/include/lib/zx/clock.h",
+    "pkg/zx/include/lib/zx/debuglog.h",
+    "pkg/zx/include/lib/zx/event.h",
+    "pkg/zx/include/lib/zx/eventpair.h",
+    "pkg/zx/include/lib/zx/exception.h",
+    "pkg/zx/include/lib/zx/fifo.h",
+    "pkg/zx/include/lib/zx/guest.h",
+    "pkg/zx/include/lib/zx/handle.h",
+    "pkg/zx/include/lib/zx/interrupt.h",
+    "pkg/zx/include/lib/zx/iommu.h",
+    "pkg/zx/include/lib/zx/job.h",
+    "pkg/zx/include/lib/zx/msi.h",
+    "pkg/zx/include/lib/zx/object.h",
+    "pkg/zx/include/lib/zx/object_traits.h",
+    "pkg/zx/include/lib/zx/pager.h",
+    "pkg/zx/include/lib/zx/pmt.h",
+    "pkg/zx/include/lib/zx/port.h",
+    "pkg/zx/include/lib/zx/process.h",
+    "pkg/zx/include/lib/zx/profile.h",
+    "pkg/zx/include/lib/zx/resource.h",
+    "pkg/zx/include/lib/zx/socket.h",
+    "pkg/zx/include/lib/zx/stream.h",
+    "pkg/zx/include/lib/zx/suspend_token.h",
+    "pkg/zx/include/lib/zx/task.h",
+    "pkg/zx/include/lib/zx/thread.h",
+    "pkg/zx/include/lib/zx/time.h",
+    "pkg/zx/include/lib/zx/timer.h",
+    "pkg/zx/include/lib/zx/vcpu.h",
+    "pkg/zx/include/lib/zx/vmar.h",
     "pkg/zx/include/lib/zx/vmo.h"
-  ], 
-  "include_dir": "pkg/zx/include", 
-  "name": "zx", 
-  "root": "pkg/zx", 
+  ],
+  "include_dir": "pkg/zx/include",
+  "name": "zx",
+  "root": "pkg/zx",
   "sources": [
-    "pkg/zx/bti.cpp", 
-    "pkg/zx/channel.cpp", 
-    "pkg/zx/debuglog.cpp", 
-    "pkg/zx/event.cpp", 
-    "pkg/zx/eventpair.cpp", 
-    "pkg/zx/fifo.cpp", 
-    "pkg/zx/guest.cpp", 
-    "pkg/zx/interrupt.cpp", 
-    "pkg/zx/iommu.cpp", 
-    "pkg/zx/job.cpp", 
-    "pkg/zx/log.cpp", 
-    "pkg/zx/port.cpp", 
-    "pkg/zx/process.cpp", 
-    "pkg/zx/profile.cpp", 
-    "pkg/zx/resource.cpp", 
-    "pkg/zx/socket.cpp", 
-    "pkg/zx/thread.cpp", 
-    "pkg/zx/timer.cpp", 
-    "pkg/zx/vcpu.cpp", 
-    "pkg/zx/vmar.cpp", 
-    "pkg/zx/vmo.cpp"
-  ], 
+    "pkg/zx/bti.cc",
+    "pkg/zx/channel.cc",
+    "pkg/zx/debuglog.cc",
+    "pkg/zx/event.cc",
+    "pkg/zx/eventpair.cc",
+    "pkg/zx/fifo.cc",
+    "pkg/zx/guest.cc",
+    "pkg/zx/interrupt.cc",
+    "pkg/zx/iommu.cc",
+    "pkg/zx/job.cc",
+    "pkg/zx/msi.cc",
+    "pkg/zx/pager.cc",
+    "pkg/zx/port.cc",
+    "pkg/zx/process.cc",
+    "pkg/zx/profile.cc",
+    "pkg/zx/resource.cc",
+    "pkg/zx/socket.cc",
+    "pkg/zx/stream.cc",
+    "pkg/zx/thread.cc",
+    "pkg/zx/timer.cc",
+    "pkg/zx/vcpu.cc",
+    "pkg/zx/vmar.cc",
+    "pkg/zx/vmo.cc"
+  ],
   "type": "cc_source_library"
 }
\ No newline at end of file
diff --git a/pkg/zx/msi.cc b/pkg/zx/msi.cc
new file mode 100644
index 0000000..86567de
--- /dev/null
+++ b/pkg/zx/msi.cc
@@ -0,0 +1,21 @@
+// Copyright 2020 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.
+
+#include <lib/zx/interrupt.h>
+#include <lib/zx/msi.h>
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t msi::allocate(const resource& resource, uint32_t count, msi* result) {
+  return zx_msi_allocate(resource.get(), count, result->reset_and_get_address());
+}
+
+zx_status_t msi::create(const msi& msi, uint32_t options, uint32_t msi_id, const vmo& vmo,
+                        size_t vmo_offset, interrupt* result) {
+  return zx_msi_create(msi.get(), options, msi_id, vmo.get(), vmo_offset,
+                       result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/pager.cc b/pkg/zx/pager.cc
new file mode 100644
index 0000000..b6131d6
--- /dev/null
+++ b/pkg/zx/pager.cc
@@ -0,0 +1,13 @@
+// Copyright 2019 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.
+
+#include <lib/zx/pager.h>
+
+namespace zx {
+
+zx_status_t pager::create(uint32_t options, pager* result) {
+  return zx_pager_create(options, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/port.cc b/pkg/zx/port.cc
new file mode 100644
index 0000000..7999684
--- /dev/null
+++ b/pkg/zx/port.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include <lib/zx/port.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t port::create(uint32_t options, port* result) {
+  return zx_port_create(options, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/port.cpp b/pkg/zx/port.cpp
deleted file mode 100644
index f6ca294..0000000
--- a/pkg/zx/port.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-#include <lib/zx/port.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t port::create(uint32_t options, port* result) {
-    return zx_port_create(options, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/process.cc b/pkg/zx/process.cc
new file mode 100644
index 0000000..d17fd3a
--- /dev/null
+++ b/pkg/zx/process.cc
@@ -0,0 +1,34 @@
+// 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.
+
+#include <lib/zx/process.h>
+
+#include <zircon/syscalls.h>
+
+#include <lib/zx/job.h>
+#include <lib/zx/thread.h>
+#include <lib/zx/vmar.h>
+
+namespace zx {
+
+zx_status_t process::create(const job& job, const char* name, uint32_t name_len, uint32_t flags,
+                            process* proc, vmar* vmar) {
+  // Assume |proc|, |vmar| and |job| must refer to different containers, due
+  // to strict aliasing.
+  return zx_process_create(job.get(), name, name_len, flags, proc->reset_and_get_address(),
+                           vmar->reset_and_get_address());
+}
+
+zx_status_t process::start(const thread& thread_handle, uintptr_t entry, uintptr_t stack,
+                           handle arg_handle, uintptr_t arg2) const {
+  return zx_process_start(get(), thread_handle.get(), entry, stack, arg_handle.release(), arg2);
+}
+
+zx_status_t process::get_child(uint64_t koid, zx_rights_t rights, thread* result) const {
+  // Assume |result| and |this| are distinct containers, due to strict
+  // aliasing.
+  return zx_object_get_child(value_, koid, rights, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/process.cpp b/pkg/zx/process.cpp
deleted file mode 100644
index c47fa79..0000000
--- a/pkg/zx/process.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-#include <lib/zx/process.h>
-
-#include <zircon/syscalls.h>
-
-#include <lib/zx/job.h>
-#include <lib/zx/thread.h>
-#include <lib/zx/vmar.h>
-
-namespace zx {
-
-zx_status_t process::create(const job& job, const char* name, uint32_t name_len,
-                            uint32_t flags, process* proc, vmar* vmar) {
-    // Assume |proc|, |vmar| and |job| must refer to different containers, due
-    // to strict aliasing.
-    return zx_process_create(
-        job.get(), name, name_len, flags, proc->reset_and_get_address(),
-        vmar->reset_and_get_address());
-}
-
-zx_status_t process::start(const thread& thread_handle, uintptr_t entry,
-                           uintptr_t stack, handle arg_handle,
-                           uintptr_t arg2) const {
-    return zx_process_start(get(), thread_handle.get(), entry, stack, arg_handle.release(), arg2);
-}
-
-zx_status_t process::get_child(uint64_t koid, zx_rights_t rights,
-                               thread* result) const {
-    // Assume |result| and |this| are distinct containers, due to strict
-    // aliasing.
-    return zx_object_get_child(
-        value_, koid, rights, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/profile.cc b/pkg/zx/profile.cc
new file mode 100644
index 0000000..40a424d
--- /dev/null
+++ b/pkg/zx/profile.cc
@@ -0,0 +1,17 @@
+// 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.
+
+#include <lib/zx/profile.h>
+
+#include <zircon/syscalls.h>
+#include <zircon/syscalls/profile.h>
+
+namespace zx {
+
+zx_status_t profile::create(const job& job, uint32_t options, const zx_profile_info_t* info,
+                            profile* result) {
+  return zx_profile_create(job.get(), options, info, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/profile.cpp b/pkg/zx/profile.cpp
deleted file mode 100644
index 9e67647..0000000
--- a/pkg/zx/profile.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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.
-
-#include <lib/zx/profile.h>
-
-#include <zircon/syscalls.h>
-#include <zircon/syscalls/profile.h>
-
-namespace zx {
-
-zx_status_t profile::create(const resource& resource, const zx_profile_info_t* info, profile* result) {
-    return zx_profile_create(resource.get(), info, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/resource.cc b/pkg/zx/resource.cc
new file mode 100644
index 0000000..b4c2ec5
--- /dev/null
+++ b/pkg/zx/resource.cc
@@ -0,0 +1,20 @@
+// 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.
+
+#include <lib/zx/resource.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t resource::create(const resource& parent, uint32_t options, uint64_t base, size_t len,
+                             const char* name, size_t namelen, resource* result) {
+  resource h;
+  zx_status_t status = zx_resource_create(parent.get(), options, base, len, name, namelen,
+                                          h.reset_and_get_address());
+  result->reset(h.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/resource.cpp b/pkg/zx/resource.cpp
deleted file mode 100644
index 8f29841..0000000
--- a/pkg/zx/resource.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-#include <lib/zx/resource.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t resource::create(const resource& parent,
-                             uint32_t options,
-                             uint64_t base,
-                             size_t len,
-                             const char* name,
-                             size_t namelen,
-                             resource* result) {
-    resource h;
-    zx_status_t status = zx_resource_create(parent.get(), options, base, len, name, namelen,
-                                            h.reset_and_get_address());
-    result->reset(h.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/socket.cc b/pkg/zx/socket.cc
new file mode 100644
index 0000000..2d07ac7
--- /dev/null
+++ b/pkg/zx/socket.cc
@@ -0,0 +1,23 @@
+// 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.
+
+#include <lib/zx/socket.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t socket::create(uint32_t flags, socket* endpoint0, socket* endpoint1) {
+  // Ensure aliasing of both out parameters to the same container
+  // has a well-defined result, and does not leak.
+  socket h0;
+  socket h1;
+  zx_status_t status =
+      zx_socket_create(flags, h0.reset_and_get_address(), h1.reset_and_get_address());
+  endpoint0->reset(h0.release());
+  endpoint1->reset(h1.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/socket.cpp b/pkg/zx/socket.cpp
deleted file mode 100644
index 76f5071..0000000
--- a/pkg/zx/socket.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-#include <lib/zx/socket.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t socket::create(uint32_t flags, socket* endpoint0,
-                           socket* endpoint1) {
-    // Ensure aliasing of both out parameters to the same container
-    // has a well-defined result, and does not leak.
-    socket h0;
-    socket h1;
-    zx_status_t status = zx_socket_create(
-        flags, h0.reset_and_get_address(),
-        h1.reset_and_get_address());
-    endpoint0->reset(h0.release());
-    endpoint1->reset(h1.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/stream.cc b/pkg/zx/stream.cc
new file mode 100644
index 0000000..f5b12cb
--- /dev/null
+++ b/pkg/zx/stream.cc
@@ -0,0 +1,17 @@
+// Copyright 2020 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.
+
+#include <lib/zx/stream.h>
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t stream::create(uint32_t options, const vmo& vmo_handle, zx_off_t seek,
+                           stream* out_stream) {
+  // Assume |out_stream| and |vmo_handle| must refer to different containers, due
+  // to strict aliasing.
+  return zx_stream_create(options, vmo_handle.get(), seek, out_stream->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/thread.cc b/pkg/zx/thread.cc
new file mode 100644
index 0000000..9856c04
--- /dev/null
+++ b/pkg/zx/thread.cc
@@ -0,0 +1,20 @@
+// 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.
+
+#include <lib/zx/thread.h>
+
+#include <zircon/syscalls.h>
+
+#include <lib/zx/process.h>
+
+namespace zx {
+
+zx_status_t thread::create(const process& process, const char* name, uint32_t name_len,
+                           uint32_t flags, thread* result) {
+  // Assume |result| and |process| must refer to different containers, due
+  // to strict aliasing.
+  return zx_thread_create(process.get(), name, name_len, flags, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/thread.cpp b/pkg/zx/thread.cpp
deleted file mode 100644
index 4b9ab4c..0000000
--- a/pkg/zx/thread.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#include <lib/zx/thread.h>
-
-#include <zircon/syscalls.h>
-
-#include <lib/zx/process.h>
-
-namespace zx {
-
-zx_status_t thread::create(const process& process, const char* name,
-                           uint32_t name_len, uint32_t flags, thread* result) {
-    // Assume |result| and |process| must refer to different containers, due
-    // to strict aliasing.
-    return zx_thread_create(
-        process.get(), name, name_len, flags, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/timer.cc b/pkg/zx/timer.cc
new file mode 100644
index 0000000..895e20c
--- /dev/null
+++ b/pkg/zx/timer.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include <lib/zx/timer.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t timer::create(uint32_t options, zx_clock_t clock_id, timer* result) {
+  return zx_timer_create(options, clock_id, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/timer.cpp b/pkg/zx/timer.cpp
deleted file mode 100644
index f67ddc3..0000000
--- a/pkg/zx/timer.cpp
+++ /dev/null
@@ -1,15 +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.
-
-#include <lib/zx/timer.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t timer::create(uint32_t options, zx_clock_t clock_id, timer* result) {
-    return zx_timer_create(options, clock_id, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/vcpu.cc b/pkg/zx/vcpu.cc
new file mode 100644
index 0000000..1951adb
--- /dev/null
+++ b/pkg/zx/vcpu.cc
@@ -0,0 +1,17 @@
+// 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.
+
+#include <lib/zx/vcpu.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t vcpu::create(const guest& guest, uint32_t options, zx_gpaddr_t entry, vcpu* vcpu) {
+  // Assume |guest| and |vcpu| must refer to different containers, due to
+  // strict aliasing.
+  return zx_vcpu_create(guest.get(), options, entry, vcpu->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/vcpu.cpp b/pkg/zx/vcpu.cpp
deleted file mode 100644
index 5584a5e..0000000
--- a/pkg/zx/vcpu.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.
-
-#include <lib/zx/vcpu.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t vcpu::create(const guest& guest, uint32_t options,
-                         zx_gpaddr_t entry, vcpu* vcpu) {
-    // Assume |guest| and |vcpu| must refer to different containers, due to
-    // strict aliasing.
-    return zx_vcpu_create(guest.get(), options, entry,
-                          vcpu->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/pkg/zx/vmar.cc b/pkg/zx/vmar.cc
new file mode 100644
index 0000000..2ae938e
--- /dev/null
+++ b/pkg/zx/vmar.cc
@@ -0,0 +1,21 @@
+// 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.
+
+#include <lib/zx/vmar.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t vmar::allocate2(uint32_t options, size_t offset, size_t size, vmar* child,
+                            uintptr_t* child_addr) const {
+  // Allow for aliasing of |child| to the same container as |this|.
+  vmar h;
+  zx_status_t status =
+      zx_vmar_allocate(get(), options, offset, size, h.reset_and_get_address(), child_addr);
+  child->reset(h.release());
+  return status;
+}
+
+}  // namespace zx
diff --git a/pkg/zx/vmar.cpp b/pkg/zx/vmar.cpp
deleted file mode 100644
index 60148f2..0000000
--- a/pkg/zx/vmar.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#include <lib/zx/vmar.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t vmar::allocate(size_t offset, size_t size, zx_vm_option_t options,
-                           vmar* child, uintptr_t* child_addr) const {
-    // Allow for aliasing of |child| to the same container as |this|.
-    vmar h;
-    zx_status_t status = zx_vmar_allocate(
-        get(), options, offset, size, h.reset_and_get_address(), child_addr);
-    child->reset(h.release());
-    return status;
-}
-
-} // namespace zx
diff --git a/pkg/zx/vmo.cc b/pkg/zx/vmo.cc
new file mode 100644
index 0000000..9902a2e
--- /dev/null
+++ b/pkg/zx/vmo.cc
@@ -0,0 +1,26 @@
+// 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.
+
+#include <lib/zx/vmo.h>
+#include <lib/zx/bti.h>
+
+#include <zircon/syscalls.h>
+
+namespace zx {
+
+zx_status_t vmo::create(uint64_t size, uint32_t options, vmo* result) {
+  return zx_vmo_create(size, options, result->reset_and_get_address());
+}
+
+zx_status_t vmo::create_contiguous(const bti& bti, size_t size, uint32_t alignment_log2,
+                                   vmo* result) {
+  return zx_vmo_create_contiguous(bti.get(), size, alignment_log2, result->reset_and_get_address());
+}
+
+zx_status_t vmo::create_physical(const resource& resource, zx_paddr_t paddr, size_t size,
+                                 vmo* result) {
+  return zx_vmo_create_physical(resource.get(), paddr, size, result->reset_and_get_address());
+}
+
+}  // namespace zx
diff --git a/pkg/zx/vmo.cpp b/pkg/zx/vmo.cpp
deleted file mode 100644
index 130c71f..0000000
--- a/pkg/zx/vmo.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-#include <lib/zx/vmo.h>
-#include <lib/zx/bti.h>
-
-#include <zircon/syscalls.h>
-
-namespace zx {
-
-zx_status_t vmo::create(uint64_t size, uint32_t options, vmo* result) {
-    return zx_vmo_create(size, options, result->reset_and_get_address());
-}
-
-zx_status_t vmo::create_contiguous(
-    const bti& bti, size_t size, uint32_t alignment_log2, vmo* result) {
-    return zx_vmo_create_contiguous(bti.get(), size, alignment_log2,
-                                    result->reset_and_get_address());
-}
-
-zx_status_t vmo::create_physical(
-    const resource& resource, zx_paddr_t paddr, size_t size, vmo* result) {
-    return zx_vmo_create_physical(resource.get(), paddr, size, result->reset_and_get_address());
-}
-
-} // namespace zx
diff --git a/tools/bootserver b/tools/bootserver
deleted file mode 100755
index 3683705..0000000
--- a/tools/bootserver
+++ /dev/null
Binary files differ
diff --git a/tools/bootserver-meta.json b/tools/bootserver-meta.json
deleted file mode 100644
index 56c74dc..0000000
--- a/tools/bootserver-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/bootserver"
-  ], 
-  "name": "bootserver", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/far b/tools/far
deleted file mode 100755
index 2474697..0000000
--- a/tools/far
+++ /dev/null
Binary files differ
diff --git a/tools/far-meta.json b/tools/far-meta.json
deleted file mode 100644
index 6d75f3b..0000000
--- a/tools/far-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/far"
-  ], 
-  "name": "far", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/fidl-format b/tools/fidl-format
deleted file mode 100755
index 86609ea..0000000
--- a/tools/fidl-format
+++ /dev/null
Binary files differ
diff --git a/tools/fidl-format-meta.json b/tools/fidl-format-meta.json
deleted file mode 100644
index 9cf524d..0000000
--- a/tools/fidl-format-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/fidl-format"
-  ], 
-  "name": "fidl-format", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/fidlc b/tools/fidlc
deleted file mode 100755
index a0e50cd..0000000
--- a/tools/fidlc
+++ /dev/null
Binary files differ
diff --git a/tools/fidlc-meta.json b/tools/fidlc-meta.json
deleted file mode 100644
index 53c3a51..0000000
--- a/tools/fidlc-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/fidlc"
-  ], 
-  "name": "fidlc", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/fidlgen b/tools/fidlgen
deleted file mode 100755
index cde2208..0000000
--- a/tools/fidlgen
+++ /dev/null
Binary files differ
diff --git a/tools/fidlgen-meta.json b/tools/fidlgen-meta.json
deleted file mode 100644
index 9fe21f8..0000000
--- a/tools/fidlgen-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/fidlgen"
-  ], 
-  "name": "fidlgen", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/fvm b/tools/fvm
deleted file mode 100755
index 677d53c..0000000
--- a/tools/fvm
+++ /dev/null
Binary files differ
diff --git a/tools/fvm-meta.json b/tools/fvm-meta.json
deleted file mode 100644
index 34f476a..0000000
--- a/tools/fvm-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/fvm"
-  ], 
-  "name": "fvm", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/loglistener b/tools/loglistener
deleted file mode 100755
index 1811b12..0000000
--- a/tools/loglistener
+++ /dev/null
Binary files differ
diff --git a/tools/loglistener-meta.json b/tools/loglistener-meta.json
deleted file mode 100644
index e9adaf4..0000000
--- a/tools/loglistener-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/loglistener"
-  ], 
-  "name": "loglistener", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/merkleroot b/tools/merkleroot
deleted file mode 100755
index 243eb0a..0000000
--- a/tools/merkleroot
+++ /dev/null
Binary files differ
diff --git a/tools/merkleroot-meta.json b/tools/merkleroot-meta.json
deleted file mode 100644
index 5f68196..0000000
--- a/tools/merkleroot-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/merkleroot"
-  ], 
-  "name": "merkleroot", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/minfs b/tools/minfs
deleted file mode 100755
index af3b27b..0000000
--- a/tools/minfs
+++ /dev/null
Binary files differ
diff --git a/tools/minfs-meta.json b/tools/minfs-meta.json
deleted file mode 100644
index 552d645..0000000
--- a/tools/minfs-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/minfs"
-  ], 
-  "name": "minfs", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/netaddr b/tools/netaddr
deleted file mode 100755
index 096d8b4..0000000
--- a/tools/netaddr
+++ /dev/null
Binary files differ
diff --git a/tools/netaddr-meta.json b/tools/netaddr-meta.json
deleted file mode 100644
index 601e966..0000000
--- a/tools/netaddr-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/netaddr"
-  ], 
-  "name": "netaddr", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/netcp b/tools/netcp
deleted file mode 100755
index 81088e6..0000000
--- a/tools/netcp
+++ /dev/null
Binary files differ
diff --git a/tools/netcp-meta.json b/tools/netcp-meta.json
deleted file mode 100644
index 37fbb78..0000000
--- a/tools/netcp-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/netcp"
-  ], 
-  "name": "netcp", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/netls b/tools/netls
deleted file mode 100755
index 77e8612..0000000
--- a/tools/netls
+++ /dev/null
Binary files differ
diff --git a/tools/netls-meta.json b/tools/netls-meta.json
deleted file mode 100644
index 7c98bca..0000000
--- a/tools/netls-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/netls"
-  ], 
-  "name": "netls", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/netruncmd b/tools/netruncmd
deleted file mode 100755
index e26f473..0000000
--- a/tools/netruncmd
+++ /dev/null
Binary files differ
diff --git a/tools/netruncmd-meta.json b/tools/netruncmd-meta.json
deleted file mode 100644
index 043580b..0000000
--- a/tools/netruncmd-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/netruncmd"
-  ], 
-  "name": "netruncmd", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/pm b/tools/pm
deleted file mode 100755
index c7b39e9..0000000
--- a/tools/pm
+++ /dev/null
Binary files differ
diff --git a/tools/pm-meta.json b/tools/pm-meta.json
deleted file mode 100644
index 65d04fb..0000000
--- a/tools/pm-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/pm"
-  ], 
-  "name": "pm", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file
diff --git a/tools/zbi b/tools/zbi
deleted file mode 100755
index e06c212..0000000
--- a/tools/zbi
+++ /dev/null
Binary files differ
diff --git a/tools/zbi-meta.json b/tools/zbi-meta.json
deleted file mode 100644
index ce2df6c..0000000
--- a/tools/zbi-meta.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "files": [
-    "tools/zbi"
-  ], 
-  "name": "zbi", 
-  "root": "tools", 
-  "type": "host_tool"
-}
\ No newline at end of file